JavaScript 逆引き集 | オブジェクトのプロパティ削除

JavaScript JavaScript
スポンサーリンク

オブジェクトのプロパティ削除(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); // {}
JavaScript

2) 削除の成否を確認(true/false)

const obj = {};
Object.defineProperty(obj, "x", { value: 1, configurable: false });
console.log(delete obj.x); // false(非configurableは削除不可)
JavaScript

3) 未定義化との違い(存在が消える)

const obj = { a: 1, b: 2 };
obj.b = undefined;              // 値だけ未定義
console.log("b" in obj);        // true(キーはある)
delete obj.a;
console.log("a" in obj);        // false(キーが消えた)
JavaScript

4) 安全な「キー除外」再構築(不変更新)

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 = undefinednull を代入。スキーマを保ったまま「未設定」を表現できる。
  • 不変更新で「キー除外」した新オブジェクト:
    • おすすめ: 分割代入+残余( { 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。
  • 不変更新が欲しいなら: 分割代入+残余で再構築。
タイトルとURLをコピーしました