2014-02-28 35 views
5

我正在为此寻找合适的解释,但无法找到解答我的问题的解释。JavaScript删除对象在不同浏览器中的行为有所不同

我在JavaScript中读到,对象无法删除。所以为了找出答案,我在浏览器的控制台中玩耍。我创建这样一个对象:

var a = {x:10}; 

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

再接着删除这样的对象:delete a

但什么难倒我了,而Google Chrome返回falseFirefox返回true

怎么可能某个对象是在一个浏览器,而不是在另一个“删除”?有什么我在这里失踪或是浏览器的实现,导致这一点?

在FF V27: Firefox Console

在谷歌浏览器V33 Google Chrome Console

回答

2

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

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

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

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

eval和其他类型的可执行代码之间的行为的这种差异在ECMAScript标准下部分10.5指定:

2.如果代码是EVAL代码,然后让configurableBindings否则让可配置绑定虚假

1:这个代码仅是前端代码,而不是实际的内部结构,其下降很多层面。

+0

谢谢!现在有道理。 :) –

1

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

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

1

我会添加一些点@澳航的回答是:

根据MDN delete operator reference

返回 抛出,如果财产是自己的非配置 财产严格模式(返回假非严格)。在所有其他 个案中返回true。

这意味着,一个不可配置的变量不能通过删除操作删除。但是,如果一个变量是可配置的,就像在@澳航的答案中一样,它是在eval()中定义的,那么它可以使用删除操作符来删除。

相关问题