オブジェクトのプロパティ削除(delete obj.key)の基本と実践
delete は「そのプロパティをオブジェクトから完全に取り除く」演算子です。キーを消したいときに使い、値を未定義化したいときは別の手段を選びます。動作の違いを理解すると安全に使い分けできます。
基本の使い方
const person = { name: "Alice", age: 30, job: "Developer" };
console.log(person.age); // 30
delete person.age; // ageプロパティを削除
console.log(person.age); // undefined
console.log(person); // { name: "Alice", job: "Developer" }
JavaScript- 効果: キーそのものが消えます(単に値が undefined になるのではなく、プロパティが存在しなくなります)。戻り値は削除の成否で true/false を返します。
- 記法: ドット記法
delete obj.keyと角括弧記法delete obj["key"]のどちらでも使えます。
挙動のポイントと違い
- プロパティの「不存在」になる:
("key" in obj)が false になります。obj.key === undefinedにするだけでは「存在するが未定義」です。目的が異なるので区別しましょう。 - 自前プロパティが対象: delete はそのオブジェクトに存在するプロパティを削除します。プロトタイプ由来は削除できません(そもそも自前にないため)。
- 削除可能性(configurable): 非configurableのプロパティは削除できず、deleteは false を返します。通常のリテラル定義プロパティは削除可能ですが、definePropertyで
configurable: falseの場合は不可。
すぐ使えるテンプレート集
1) ドット記法/角括弧記法で削除
const obj = { a: 1, b: 2 };
delete obj.a;
delete obj["b"];
console.log(obj); // {}
JavaScript2) 削除の成否を確認(true/false)
const obj = {};
Object.defineProperty(obj, "x", { value: 1, configurable: false });
console.log(delete obj.x); // false(非configurableは削除不可)
JavaScript3) 未定義化との違い(存在が消える)
const obj = { a: 1, b: 2 };
obj.b = undefined; // 値だけ未定義
console.log("b" in obj); // true(キーはある)
delete obj.a;
console.log("a" in obj); // false(キーが消えた)
JavaScript4) 安全な「キー除外」再構築(不変更新)
const profile = { id: 1, name: "hoge", age: 25 };
// 分割代入+残余で新オブジェクト(元は触らない)
const { age, ...newProfile } = profile;
console.log(newProfile); // { id: 1, name: "hoge" }
JavaScript配列での注意点(deleteは穴が空く)
const fruits = ["apple", "banana", "cherry"];
delete fruits[1];
console.log(fruits); // ["apple", <empty>, "cherry"]
console.log(fruits.length); // 3(長さは変わらない)
JavaScript- ポイント: 配列要素を delete すると「空要素(hole)」になり、lengthは維持されます。配列から要素を削除したいなら
spliceを使いましょう ProG-Cafe。
const fruits = ["apple", "banana", "cherry"];
fruits.splice(1, 1); // index 1を1つ削除
console.log(fruits); // ["apple", "cherry"]
JavaScript実務での使い分け
- キーを完全に消す(存在自体をなくす):
- おすすめ: delete(戻り値で成否チェック可能)。設定やペイロードのクリーニングに向く。
- 値だけ空にしたい(キーは維持):
- おすすめ:
obj.key = undefinedやnullを代入。スキーマを保ったまま「未設定」を表現できる。
- おすすめ:
- 不変更新で「キー除外」した新オブジェクト:
- おすすめ: 分割代入+残余(
{ key, ...rest })で再構築。UI状態管理などで安全。
- おすすめ: 分割代入+残余(
よくある落とし穴と対策
- 非configurableは削除不可: defineProperty等で設定されたキーは消えない。戻り値 false を確認。
- 配列に delete を使う: 長さが変わらず穴が空く。並びや集計が崩れる。対策は splice や filter を使用。
- 存在チェックと未定義の混同: 「存在しない」と「存在するが undefined」は異なる。仕様に合わせて手段を選ぶ。
- プロトタイプの誤解: 継承プロパティは削除対象ではない。必要なら自前に再定義してから扱う。
練習問題(手を動かして覚える)
// 1) 基本削除と存在チェックの違い
const obj1 = { a: 1, b: 2 };
obj1.b = undefined;
console.log("b" in obj1); // true
delete obj1.a;
console.log("a" in obj1); // false
// 2) 非configurableは消えない
const obj2 = {};
Object.defineProperty(obj2, "x", { value: 1, configurable: false });
console.log(delete obj2.x); // false
// 3) 配列は splice を使う
const arr = ["red", "blue", "green"];
arr.splice(1, 1);
console.log(arr); // ["red", "green"]
// 4) 不変にキーを除外(再構築)
const src = { id: 10, name: "Aki", debug: true };
const { debug, ...clean } = src;
console.log(clean); // { id: 10, name: "Aki" }
JavaScript直感的な指針
- キーそのものを消したいなら: delete。
- 値だけ空にしたいなら: undefined/null を代入。
- 配列の削除は: deleteでなく splice。
- 不変更新が欲しいなら: 分割代入+残余で再構築。
