2011-05-13 106 views
5

根据EcmaScript规范,由于DontDelete内部参数,某些对象属性无法删除。例如:JavaScript对象的DontDelete属性

var y = 5

不应该删除的。但从我能够检查 - 这是。

这里是在Mozilla开发者中心的链接: https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/delete

为什么这是行不通的,因为它应该任何想法?

+2

http://perfectionkills.com/2010/01/猜它已解决 – elreyano 2011-05-13 07:15:16

回答

0

有时您必须检查您阅读的内容。 ECMA规范中没有DontDelete内部参数(262,ed 5)。也许[Configurable]属性是指?该delete操作上的变量或函数不能正常工作,它适用于对象的属性:

var y=5, 
    z = {y:5}; 
delete y; 
delete z.y; 
alert(y); //=> 5 
alert(z.y); //=> undefined 

从我的答案,这SO question出现,并从T.J.一个很好的答案克劳德。

+0

从我能够理解它允许删除全部变量声明不使用'var',因为它们是全局对象的属性。 – elreyano 2011-05-13 07:16:32

+0

这就是你会想的,但它不会那样工作。 – KooiInc 2011-05-13 07:22:16

+0

@elreyano:看到我除了答案 – KooiInc 2011-05-13 07:29:32

0
var y = 5 
alert(delete (y)); 

显示false。然后,不能删除。

+0

在Firebug =/ – tradyblix 2011-05-13 06:56:26

+0

中返回true这是另一个故事..在chrome/ff /即。 – ariel 2011-05-13 06:58:34

+0

它为我返回false。我还创建了自己的测试页面,并确认'y'在'delete'后仍然存在。 – TNi 2011-05-13 06:59:09

1

根据ES5表17:

CreateMutableBinding(N,d) 在 环境记录创建一个新的可变绑定。字符串值N 是绑定名称的文本。如果 可选的布尔参数D为真 ,则绑定可能会随后被删除,其中 。

和在10.5声明绑定实例化

  1. 对于每个代码VariableDeclaration和VariableDeclarationNoIn d,在 源文本顺序做 [...] II。调用env的SetMutableBinding 具体方法传递dn,undefined, 和strict作为参数。

这对我说,声明的变量应该是不可删除的。在全局代码中,全局对象是变量obejct的激活对象,所以声明的全局变量不应该是可删除的。当然,浏览器可能不会坚持...

+0

请注意,'SetMutableBinding'不会设置“删除”标志。你的第二个报价似乎与第一个报价无关。 – Guss 2014-09-29 08:58:51

+0

这有点旧,但可能需要更新。第一个涉及如何声明函数和变量由* CreateMutableBinding *创建,第二部分是如何调用的,是的,它应该引用* CreateMutableBinding *。我会尽快更新。 – RobG 2014-09-29 13:17:38

+0

我认为正确的10.5小节是8.c.ii – Guss 2014-09-30 06:58:17