操作员从对象中delete
删除属性。如果我在 上设置一个属性window
,我可以删除它:
window.myProp = 10;
delete window.myProp;
正如我经常提到的其他人提到的关于操作符状态的行为的文章delete
一样,这是因为属性赋值不会设置DontDelete
属性(与变量声明相反,它会设置属性)。
该文章还指出以下内容(强调):
请注意,属性是在属性创建期间确定的(即没有设置任何属性)。以后的分配不会修改现有 property 的属性。了解这种区别很重要。
考虑到这一点,为什么我可以覆盖 window, 的现有属性,alert
然后将其删除以返回原始值?我错过了一些明显的东西吗?我很少使用delete
运算符,所以很可能就是这种情况。
例如:
window.alert = function() {};
alert("Hi!"); //Nothing happens
delete window.alert;
alert("Hello?"); //Alerts 'Hello?'
这是一个证明这一点的小提琴(仅在 Chome 中测试过,很确定 IE 不会以这种方式运行,但现在除了 Chrome 之外无法访问任何东西)。