【问题标题】:Why delete operator returns true even if property wasn't deleted from an object为什么即使没有从对象中删除属性,删除运算符也会返回 true
【发布时间】:2013-09-07 17:39:03
【问题描述】:
>>> var par = {a: 1, b: 2};
undefined
>>> var ch = Object.create(par);
undefined
>>> delete ch.a
true
>>> ch
Object { a=1, b=2}

【问题讨论】:

标签: javascript object


【解决方案1】:

你误解了 delete 返回的内容:

如果属性是自己的不可配置属性,则在严格模式下抛出(在非严格模式下返回 false)。在所有其他情况下返回 true。 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete)

delete ch.a 尝试在ch 中定位属性a,失败(因为ch 没有这样的自己的 属性),什么也不做,并愉快地返回true。如果你写delete ch.foobar,结果是一样的。但是,如果您尝试了不可配置的属性(例如 delete ch.__proto__),则结果将是 false

【讨论】:

  • 我认为 ch 具有属性 ch.a (1) 并且在这种情况下它是继承的,我知道。但我只是希望如果我不知道属性是否被继承,如果它没有被删除,它就会变成假。
  • @ruan65: delete 仅在您未被允许删除属性时返回 false,在所有其他情况下返回 true - 无论是否属性是否实际被删除。
  • 听起来很有道理。
  • 这是糟糕的实现/规范 - 如果不允许删除属性,则应该抛出,如果属性不存在则返回 false,如果属性存在则返回 true。更准确地说,在严格模式下,如果它是不可配置的,它应该抛出,如果它是不可配置的,o/w 返回 false。
猜你喜欢
  • 1970-01-01
  • 2018-06-30
  • 2013-05-13
  • 2017-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多