`delete`返回值的真正含义是什么?

时间:2012-08-27 16:32:04

标签: javascript google-chrome

根据this MDN pagedelete关键字

  

仅当属性存在且无法删除时才返回false。它   在所有其他情况下都返回true。

但是,我看到delete返回true的情况,尽管该属性未被删除:

delete Window
delete alert
delete dir
delete console
delete 2
delete null
delete {}.x
...

事实上,window的几乎所有属性都会使用delete返回true,如about:blank中运行以下脚本所示:

for(a in window) { if(delete window[a]) { console.log(a); } }

但是,window的大多数属性实际上都不会被删除。 delete的返回值的真正含义是什么?为什么它会为不删除的属性返回true

(注意:我有兴趣参考Chromium代码来解释delete的行为。)

5 个答案:

答案 0 :(得分:8)

窗口是host object,其语义由主机环境定义,例如:浏览器。应用于主机对象属性时delete比应用于本机对象时更复杂。

  

主机对象可以支持具有任何依赖于实现的行为的这些内部属性,只要它与本文档中声明的特定主机对象限制一致。

Section 11.4.1 - The delete operator

If IsUnresolvableReference(ref) then,
  If IsStrictReference(ref) is true, throw a SyntaxError exception.
  Else, return true.

所以当主机对象不支持删除或修改属性时,它会返回一个不可解析的引用或假装被删除的引用。这两种方法都会导致true以非严格模式返回。

答案 1 :(得分:2)

浏览器使用的javascript实现一直在弯曲规则。在纯javascript中甚至不可能部分javascript DOM API,例如dom innerHTML =触发事件的“某事”。这是在EcmaScript5中修复的,但你不能依赖浏览器对象模型是100%合法的javascript。 AFAIK,只要你没有深入了解DOM和BOM,就可以完全依赖ecmascript标准。

答案 2 :(得分:1)

鉴于您在程序中处理低级别对象,实际上可能会删除这些属性,然后立即重新添加,但我不知道您如何测试此行为。

答案 3 :(得分:1)

在该MDN页面上,它指定了语法,该语法不包括delete object,因为您的第一组示例使用了该语法。它确实指定了语法delete object[property],如第二个示例所示。但是,未指定DOM(主机)对象发生的情况。请参阅this article for more information

答案 4 :(得分:0)

基本上,浏览器在测试中保护浏览器的运行时环境。

曾几何时,情况可能并非如此,但就测试而言,这类似于问为什么Windows不允许您打开命令shell并运行:

> cd /
> deltree *.*

了。

因为没有充分的理由能够做这样的事情,当你期望环境实际上继续运行,之后,而不是取下你的整个浏览器,加上可能你的操作系统的实例你当你基本上要求程序实时擦除自身时,当前正在运行,或者其他任何有趣的错误,而它当前对你的GPU /声卡/输入设备有低级访问权。

如果您尝试删除var,则删除将返回失败。在浏览器需要运行的全局属性方面,大多数属性被定义为属性(即:window.location),但是在低级别(即:您没有访问权限)这样做。所以从理论上讲,它们是可以删除的对象。但它们受到保护,所以你不能,但这不会改变delete的返回语句,因为这会改变delete的预期行为。

所以:

function () {
    var obj = { prop : true };
    delete obj; /* fail */
    delete object.prop; /* succeed */
}