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

Ran*_*lue 10 javascript google-chrome

根据此MDN页面,delete关键字

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

但是,我看到了delete返回的情况true,尽管没有删除属性:

delete Window
delete alert
delete dir
delete console
delete 2
delete null
delete {}.x
...
Run Code Online (Sandbox Code Playgroud)

实际上,几乎所有window返回的属性都是真的delete,可以通过运行以下脚本看到about:blank:

for(a in window) { if(delete window[a]) { console.log(a); } }
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*uel 8

该窗口是一个主机对象,其语义由主机环境定义,例如浏览器. delete应用于宿主对象的属性时比应用于本机对象时更复杂.

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

第11.4.1节 - delete操作员

If IsUnresolvableReference(ref) then,
  If IsStrictReference(ref) is true, throw a SyntaxError exception.
  Else, return true.
Run Code Online (Sandbox Code Playgroud)

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