プロパティ削除とは何か
オブジェクトから「特定のキー(プロパティ)とその値」を取り除くことです。ここが重要です:削除は“存在そのもの”を消します。値を undefined や null にするのは“値を空にする”だけで、キーは残ります。意図(完全に消すのか、空で残すのか)で手段を選びましょう。
基本の削除(delete の使い方と挙動)
delete 演算子でプロパティを取り除く
const user = { id: 1, name: "Alice", active: true };
delete user.active;
console.log(user); // { id: 1, name: "Alice" }
console.log("active" in user); // false(キー自体が消えた)
JavaScript- ドット記法:
delete obj.key - ブラケット記法:
delete obj["key"](動的キー・特殊文字キーも対応)
undefined/null と delete の違い(ここが重要)
const obj = { a: 1, b: 2 };
obj.b = undefined; // キーは残る
console.log("b" in obj); // true
delete obj.b; // キーごと消す
console.log("b" in obj); // false
JavaScript- undefined/null: 「値が空」だがキーは存在。
- delete: キーごと削除。
inやObject.hasOwnで“存在しない”になる。
削除可否は“configurable”属性に依存
const o = {};
Object.defineProperty(o, "id", { value: 1, configurable: false });
delete o.id; // 失敗(厳格モードでは false/例外)
JavaScript- 定義時に
configurable: falseのプロパティは削除できません。
非破壊(イミュータブル)にプロパティを“除外”する
スプレッド+分割代入で「含めない」形を作る
const user = { id: 1, name: "Alice", active: true };
// name を除外した新オブジェクトを作る
const { name, ...rest } = user;
const withoutName = rest;
console.log(withoutName); // { id: 1, active: true }
JavaScript- 元を壊さず“新インスタンス”を返すのが UI・共有状態で安全。
Object.assign でコピーしつつ除外
const base = { id: 1, name: "Alice", active: true };
const copy = Object.assign({}, base);
delete copy.active;
JavaScript- 直接削除したくないときに“複製→削除”で非破壊に。
ループ・配列・Map の削除(混同しない)
配列で delete は“穴”になる(推奨しない)
const arr = ["A", "B", "C"];
delete arr[1]; // ["A", <empty>, "C"]
console.log(arr.length); // 3(長さは変わらない)
JavaScript- 配列の削除は
spliceを使う。
arr.splice(1, 1); // ["A", "C"](詰まる)
JavaScriptMap/Set の削除は専用メソッド
const m = new Map([["id", 1]]);
m.delete("id"); // true
const s = new Set([1, 2]);
s.delete(2); // true
JavaScript- オブジェクトの
deleteと、Map/Set のdeleteは別物。配列にはdeleteでなくsplice。
安全性と設計の指針(重要ポイントの深掘り)
いつ delete、いつ undefined/null?
- 完全に消したい/存在判定で“ない”にしたい: delete。
- キーは維持しつつ“値なし”を表したい: undefined/null(APIとの契約や“項目が必ずある”モデルで有効)。
参照共有に注意(同じ箱問題)
const a = { meta: { tag: "x" } };
const b = a;
delete b.meta; // a.meta も消える(同じ参照)
JavaScript- 共有中のオブジェクトを直接削除せず、非破壊で“新インスタンス”に置き換える。
凍結・封印で削除禁止にできる
const cfg = { lang: "ja" };
Object.freeze(cfg); // 変更不可(delete も不可)
Object.seal(cfg); // 追加・削除不可(更新のみ可)
JavaScript- 設定オブジェクトなど“構造を固定”したい場面に。
プロトタイプ上のプロパティは“自前ではない”
const base = { kind: "base" };
const obj = Object.create(base);
console.log("kind" in obj); // true(継承で存在)
console.log(Object.hasOwn(obj, "kind")); // false(自前ではない)
delete obj.kind; // 自前に無いので効果なし
JavaScript- 削除対象が“自身のプロパティ”かを把握する(
Object.hasOwn)。
Reflect.deleteProperty(戻り値を使いたいとき)
const ok = Reflect.deleteProperty(user, "active"); // true/false を返す
JavaScript- 成否を論理値で受けたいなら
Reflectが便利。
実践的レシピ(よくある削除ケース)
API 送信前に機密キーを削除
function sanitize(user) {
const { password, token, ...safe } = user; // 非破壊で除外
return safe;
}
JavaScriptフィルタ基準で“不要フィールド”を一括削除
function omitKeys(obj, keys) {
const out = { ...obj };
for (const k of keys) delete out[k];
return out;
}
const cleaned = omitKeys(user, ["password", "token"]);
JavaScript値が null/undefined のフィールドを掃除
function compact(obj) {
const out = {};
for (const [k, v] of Object.entries(obj)) {
if (v != null) out[k] = v; // null/undefined を除外
}
return out;
}
JavaScriptネストで安全に削除(存在チェック)
function removeIfExists(order) {
if (order?.customer) delete order.customer.address; // 中間の欠損を守る
}
JavaScript監視・影響の理解(パフォーマンス・GC)
パフォーマンスの注意
deleteはエンジン最適化を阻害することがあるため、頻繁な削除がある設計では“新インスタンスを作る”方が高速・安定になりやすい。
ガーベッジコレクション(ここが重要)
- 削除したキーの値が“他から参照されていない”なら、メモリは自動解放対象になる。参照が残っていると解放されない。循環参照には WeakMap/WeakSet の利用も検討。
まとめ
プロパティ削除は「キーごと消すか、値だけ空にするか」で手段が変わります。完全削除は delete/Reflect.deleteProperty、非破壊での除外は分割代入(rest)やスプレッド+delete。配列には delete ではなく splice、Map/Set は delete メソッド。configurable 属性、freeze/seal、プロトタイプ所有判定(Object.hasOwn)を理解して、共有参照は非破壊に。パフォーマンスや GC も踏まえ、目的に合う削除パターンを選べば、初心者でも安全で読みやすいコードを書けます。
