小编典典

删除 ax vs ax = undefined

all

做这些有什么实质性的区别吗?

delete a.x;

对比

a.x = undefined;

在哪里

a = {
    x: 'boo'
};

可以说它们是等价的吗?

(我没有考虑“V8
不喜欢使用delete更好”之
类的东西)


阅读 91

收藏
2022-08-20

共1个答案

小编典典

它们不是等价的。主要区别在于设置

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 将不会在链接的原型中查找属性

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

2022-08-20