1. ホーム
  2. javascript

[解決済み] delete a.x vs a.x = undefined

2022-04-29 02:11:21

質問

どちらをやっても実質的な差はないのでしょうか?

delete a.x;

a.x = undefined;

ここで

a = {
    x: 'boo'
};

は同等と言えるのでしょうか?

(のようなものは考慮に入れていません)。 V8は delete より良い" )

解決方法は?

両者は同等ではありません。主な違いは、設定

a.x = undefined

というのは a.hasOwnProperty("x") は依然としてtrueを返すので、その場合は for in ループ、および Object.keys()

delete a.x

というのは a.hasOwnProperty("x") は false を返します。

両者が同じである方法は、テストによってプロパティが存在するかどうかを知ることができないことです。

if (a.x === undefined)

プロパティが存在するかどうかを判断する場合には、この方法は使用しないでください。

// If you want inherited properties
if ('x' in a)

// If you don't want inherited properties
if (a.hasOwnProperty('x'))

プロトタイプチェーンに続く (言及された zzzzBov ) 呼び出し delete を設定すると、プロトタイプの連鎖を上がっていくことができます。一方、値をundefinedに設定すると、連鎖したプロトタイプの中からそのプロパティを探すことはできません。 http://jsfiddle.net/NEEw4/1/

var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
extended.x = "overriding";
console.log(extended.x); // overriding
extended.x  = undefined;
console.log(extended.x); // undefined
delete extended.x;
console.log(extended.x); // fromPrototype

継承されたプロパティの削除 削除しようとするプロパティが継承されている場合。 delete は影響を与えません。つまり delete はオブジェクト自身からプロパティを削除するだけで、継承されたプロパティは削除しません。

var obj = {x: "fromPrototype"};
var extended = Object.create(obj);
delete extended.x;
console.log(extended.x); // Still fromPrototype

したがって、あるオブジェクトの値が未定義になることを確認する必要がある場合。 delete は、そのプロパティが継承されている場合には機能しないので、そのプロパティを設定(オーバーライド)する必要があります。 undefined その場合 チェックする場所がなければ hasOwnProperty しかし、どこもかしこもそのチェックのために hasOwnProperty