JavaScriptのReflect.deleteProperty():プロパティ削除の成否を判定する
Reflect.deleteProperty()でオブジェクトの項目を削除し、成否を判定する方法を解説。ブラウザーとNode.jsでの実行手順、期待出力、削除できない項目や配列を扱う際の注意点を学べます。
目的:項目を削除した結果で処理を分ける
設定オブジェクトから一時的な項目を取り除くとき、削除できたかどうかを確認したい場面があります。そこで使えるのがReflect.deleteProperty()です。削除対象とキーを引数で渡し、結果を真偽値として受け取れます。
たとえば下書きデータの一時メモを消し、削除が拒否された場合だけ利用者に通知する処理に向いています。キーを変数として渡せるため、共通のデータ処理関数にも組み込みやすいAPIです。
特に役立つのは、削除できない項目を通常の分岐で扱いたい場合です。厳格モードのdeleteは削除不可の自己プロパティに対して例外を投げますが、Reflect.deleteProperty()はその場合にfalseを返します。この違いはMDNのAPI解説に記載されています。
動作環境とバージョン
Reflect.deleteProperty()はブラウザー専用のDOM APIではなく、JavaScriptの組み込みAPIです。ブラウザーとNode.jsの両方で利用でき、パッケージの追加やimportは不要です。
2026年11月2日時点で確認したMDNでは、2016年9月から主要ブラウザーで広く利用可能な機能とされています。本記事の再現環境は、現行のChrome・Edge・Firefox・Safari、およびNode.js 22以降を対象にします。これは記事の実行対象であり、APIの初回対応バージョンを意味するものではありません。
古いブラウザーや組み込みWebViewへ組み込む場合は、実際の対象環境で次の存在確認を行ってください。構文の変換だけでは、実行環境にない組み込みAPIは追加されません。
console.log(
typeof Reflect !== "undefined" &&
typeof Reflect.deleteProperty === "function"
);利用可能な環境での期待出力はtrueです。falseの場合は、その環境で後続のサンプルを実行せず、対応環境への更新などを検討します。
引数・戻り値と基本動作
呼び出し方は次のとおりです。
Reflect.deleteProperty(target, propertyKey);target:削除対象のオブジェクト。配列や関数もオブジェクトとして渡せます。propertyKey:削除するプロパティのキー。文字列またはSymbolを使います。数値のキーは文字列へ変換されます。- 戻り値:削除操作が成功扱いなら
true、削除不可ならfalseです。
trueは「存在していた」の意味ではない
通常のオブジェクトでは、指定したキーが最初から存在しなくてもtrueになります。そのため、戻り値だけで削除件数を集計すると、実際より多く数える可能性があります。
「存在した項目を削除した」と記録したい場合は、削除前の存在確認を別途行います。反対に「その項目がない状態へ片付けたい」だけなら、存在しないキーを成功扱いにする動作が便利です。
このAPIは同期処理です。戻り値はPromiseではなく、その場で得られる真偽値なので、awaitは不要です。
コピーして動かす:削除成功・削除不可・例外
以下をdelete-property-demo.jsとして保存してください。外部通信や追加ファイルは使いません。即時実行関数で変数の範囲を閉じているため、ブラウザーのコンソールでも繰り返し実行できます。
(() => {
"use strict";
const draft = {
title: "公開前の記事",
temporaryNote: "確認後に削除"
};
Object.defineProperty(draft, "recordId", {
value: "draft-a",
enumerable: true,
configurable: false
});
const removed = Reflect.deleteProperty(draft, "temporaryNote");
console.log("一時メモの削除: " + removed);
console.log("一時メモの値: " + draft.temporaryNote);
const missing = Reflect.deleteProperty(draft, "missingKey");
console.log("存在しないキー: " + missing);
const protectedResult = Reflect.deleteProperty(draft, "recordId");
console.log("保護項目の削除: " + protectedResult);
console.log("保護項目の値: " + draft.recordId);
try {
Reflect.deleteProperty(null, "title");
} catch (error) {
console.log("不正な対象: " + error.name);
}
})();ブラウザーでの実行方法
通常のWebページを開き、開発者ツールのConsoleを選びます。上のJavaScriptコード全体を貼り付けて実行してください。ファイル保存をせず、コンソールへ直接入力する方法でも構いません。
実行時には、コンソールが現在選択しているページのJavaScript環境を使います。表示済みのオブジェクトを後から展開する方式は避け、サンプルでは各結果を文字列にして出力しています。
Node.jsでの実行方法
Node.jsをインストールした環境で、ターミナルからdelete-property-demo.jsを保存したフォルダーへ移動し、次を実行します。
node --version
node delete-property-demo.js最初のコマンドで記事の対象バージョンか確認します。ファイル名をnodeへ渡す実行方法はNode.js公式のスクリプト実行ガイドに沿っています。今回のコードはモジュールの読み込みを使わないため、専用のpackage.jsonは不要です。
期待出力
ブラウザーでもNode.jsでも、サンプルのログ本文は次の順序になります。コンソールが最後に表示する式の評価結果などは含めていません。
一時メモの削除: true
一時メモの値: undefined
存在しないキー: true
保護項目の削除: false
保護項目の値: draft-a
不正な対象: TypeErrorrecordIdはconfigurable: falseで定義したため、削除できずに残ります。一方、nullはオブジェクトではないため例外です。サンプルはこの例外をtry...catchで受け止めます。ここに示した出力は仕様とコードから確認した期待値であり、実機での実行結果ではありません。
失敗例と制約
配列を削除しても要素は詰まらない
配列の添字を指定すると、その位置のプロパティが消えます。後ろの要素が前へ移動するわけではなく、配列の長さも変わりません。
(() => {
const items = ["A", "B", "C"];
console.log(Reflect.deleteProperty(items, "1"));
console.log(items.length);
console.log(1 in items);
console.log(items[1]);
})();期待出力は次のとおりです。
true
3
false
undefinedこの位置は、値としてundefinedが入った要素ではなく、要素が存在しない空きスロットです。一覧から行を削除して詰めたい用途では、配列向けの削除・再構成処理を選びます。空きスロットと長さの関係はMDNのdelete解説でも確認できます。
削除後に継承した値が見えることがある
削除対象は自己プロパティです。同名のプロパティがプロトタイプに存在すると、削除後の読み取りでは継承した値が見えます。したがって、削除後の値がundefinedかどうかだけでは、自己プロパティの削除成功を判定できません。
また、削除は元のオブジェクトを変更します。同じオブジェクトを別の場所でも参照していれば、そちらから見える内容も変わります。共有データへ適用するときは、どの処理がそのオブジェクトを所有しているかを先に確認してください。
falseと例外を区別する
削除不可がfalseになるからといって、例外が一切発生しないAPIではありません。対象がnullや数値などの場合はTypeErrorになります。
さらに、対象がProxyなら削除操作がハンドラーへ渡ります。その処理自身が例外を投げる場合や、守るべき条件に違反する場合にも例外が発生します。詳細はMDNの削除トラップ解説を参照してください。外部から受け取った任意のオブジェクトを扱う共通処理では、真偽値の分岐に加えて例外への対応も設計します。
活用事例と設計の改善案
下書きの一時メモ、使い終えた計算結果のキャッシュ、編集画面だけで使う補助項目など、不要になった項目を元のオブジェクトから取り除く用途に使えます。
実装前には、削除したい理由を言葉にすると判断しやすくなります。「項目をなくす」「値だけ空にする」「新しいデータを作る」は、それぞれ必要な動作が違います。削除後もキーを列挙対象に残したいなら、値の更新を検討してください。
改善案として、送信データの整形では、不要なキーを順番に削除する方式に加えて、送信するキーだけを明示して新しいオブジェクトを作る方式も検討できます。項目が増えた際に意図しないデータが送信されるのを防ぎやすいためです。Reflect.deleteProperty()は、変更対象と削除するキーが明確で、その結果を処理へ反映したい場面に絞ると扱いやすくなります。
公式参考資料
Googleの優先するニュース提供元にSEの部屋を追加
Googleで、いつも読みたい情報源を選べます。登録可否はGoogleの画面で確認できます。
候補にSEの部屋が表示されない場合は、まだ追加できません。