JavaScript | 配列・オブジェクト:オブジェクト基礎 – プロパティ削除

JavaScript JavaScript
スポンサーリンク

プロパティ削除とは何か

オブジェクトから「特定のキー(プロパティ)とその値」を取り除くことです。ここが重要です:削除は“存在そのもの”を消します。値を undefinednull にするのは“値を空にする”だけで、キーは残ります。意図(完全に消すのか、空で残すのか)で手段を選びましょう。


基本の削除(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: キーごと削除。inObject.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"](詰まる)
JavaScript

Map/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 の利用も検討。

まとめ

プロパティ削除は「キーごと消すか、値だけ空にするか」で手段が変わります。完全削除は deleteReflect.deleteProperty、非破壊での除外は分割代入(rest)やスプレッド+delete。配列には delete ではなく splice、Map/Set は delete メソッド。configurable 属性、freeze/seal、プロトタイプ所有判定(Object.hasOwn)を理解して、共有参照は非破壊に。パフォーマンスや GC も踏まえ、目的に合う削除パターンを選べば、初心者でも安全で読みやすいコードを書けます。

タイトルとURLをコピーしました