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

时间:2014-02-28 11:42:51

标签: javascript google-chrome firefox garbage-collection

我在SO上搜索一个合适的解释,但找不到回答我问题的解释。

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

var a = {x:10};

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

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

但令我感到困惑的是Google Chrome返回时falseFirefox返回true

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

在FF v27中: Firefox Console

在Google Chrome v33中 Google Chrome Console

3 个答案:

答案 0 :(得分:2)

这是由于Firefox和Chrome中运行控制台代码的内部方法不同。

在Firebug中,使用a form of eval for extension code评估控制台代码。但是,在Chrome中,控制台中的代码为evaluated using internal methods 1 ,它模拟实际运行的代码,而不是直接使用JavaScript的eval函数。

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

eval代码中定义的任何变量都将[[Configurable]]设置为true。但是,如果您在传递给eval的代码外部定义变量,则该属性将设置为false

eval与其他类型的可执行代码之间的行为差​​异在ECMAScript标准的10.5节中指定:

  

2。如果 code 是eval代码,那么让 configurableBindings true 否则让 configurableBindings false

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

答案 1 :(得分:1)

我发现this:这似乎是一个Firebug问题:当您在Chrome中使用内置开发人员工具时,它直接使用JS引擎。 Firebug是一个用JS创建的插件,因此执行某些操作的唯一方法是使用“eval”,这似乎并没有在对象中添加“不删除”属性。

delete删除对象,但不删除变量。

答案 2 :(得分:1)

我会在@ Qantas的回答中加上一些观点:

根据MDN delete operator reference

  

返回   如果属性是不可配置的,则以严格模式投掷   property(非严格返回false)。在所有其他中返回true   例。

这意味着,无法通过删除操作符删除不可配置的变量。但是,如果变量是可配置的,如@ Qantas的答案,则在eval()中定义,则可以使用delete运算符删除它。