JavaScript删除对象在不同的​​浏览器中表现不同

San*_*yak 5 javascript firefox garbage-collection google-chrome

我在SO上寻找一个合适的解释,但找不到回答我问题的那个.

我在JavaScript中读到,无法删除对象.所以要发现,我正在浏览器的控制台中玩游戏.我创建了一个这样的对象:

var a = {x:10};
Run Code Online (Sandbox Code Playgroud)

然后我做delete a.x了返回true.(这里没有惊喜)

然后继续删除这样的对象:delete a.

但是,什么难倒我了,而Google Chrome返回false,Firefox返回true

如何在一个浏览器中"删除"一个对象而不在另一个浏览器中"删除"?我在这里缺少什么或浏览器实现是否会导致这种情况?

在FF v27中: Firefox控制台

在Google Chrome v33中 谷歌Chrome控制台.

Qan*_*avy 2

这是由于 Firefox 和 Chrome 中运行控制台代码的内部方法存在差异。

在 Firebug 中,控制台代码使用for 扩展代码的形式eval进行评估。然而,在 Chrome 中,控制台中的代码是使用模拟实际代码运行的内部方法1进行评估的,而不是直接使用 JavaScript 的eval函数。

内部[[Configurable]]属性描述符属性确定删除变量/属性的尝试是否会成功。如果为 false,则不会删除该属性,并且delete运算符将返回 false。

eval 代码中定义的所有变量均已[[Configurable]]设置为true. 但是,如果您在传递给 的代码外部定义变量eval,则该属性将设置为false

evalECMAScript 标准第 10.5 节规定了与其他类型的可执行代码之间的行为差​​异:

2. 如果代码是 eval 代码,则令configurableBindingstrue,否则令configurableBindingsfalse

1:这段代码只是前端代码,而不是实际的内部代码,它有很多层次。