Skip to content

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

Published: at 09:09 AM (2 min read)

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

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

var obj = { a: "123" };
obj.a = undefined;

obj.hasOwnProperty("a"); // true
for (key in obj) {
  console.log(key);
} // a
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