[javascript] delete 和設為 undefined 差別在哪?

前一陣子在討論刪除一個變數的屬性值,應該用 delete 還是設為 undefined 呢?

讓我們來看看兩種作法差別在哪

  • undefined
    單純只是將屬性值改為 undefined ,屬性仍然存在.
var obj = {a: '123'};
obj.a = undefined;

obj.hasOwnProperty('a');    // true
for(key in obj){console.log(key);}   // a
  • delete
    刪除此 Object 的屬性
var obj = {a: '123'};
delete obj.a;

obj.hasOwnProperty('a');    // false
for(key in obj){console.log(key);}   // 不會印任何東西

直覺看起來好像 delete 可以準確的刪除此屬性值,但有個要注意的地方是

delete 並不會刪除 prototype chain 的屬性值

舉個例子:

var obj = Object.create({a: '123'});
obj.a = '456';

delete obj.a;
obj.hasOwnProperty('a');    // false
for(key in obj){console.log(key);}   // a

因此可能要注意的是,如果要避開 prototype chain 上面的屬性值

必須要使用 hasOwnProperty 進一步檢查屬性值 XD

參考資料:

https://stackoverflow.com/questions/14967535/delete-a-x-vs-a-x-undefined

Leave a Reply

Your email address will not be published. Required fields are marked *