JavaScript删除对象在不同浏览器中的行为不同

JavaScript删除对象在不同浏览器中的行为不同,javascript,google-chrome,firefox,garbage-collection,Javascript,Google Chrome,Firefox,Garbage Collection,我一直在寻找一个合适的解释,但是找不到一个能回答我问题的解释 我在JavaScript中读到,对象不能被删除。所以为了找到答案,我在浏览器的控制台上玩。我创建了这样一个对象: var a = {x:10}; 然后我删除了a.x,它返回了true(这里没有意外) 然后继续像这样删除对象:deletea 但让我感到困惑的是,googlechrome返回了false,Firefox返回了true 一个对象在一个浏览器中被“删除”,而在另一个浏览器中不被“删除”,这怎么可能呢?这里有没有我遗漏的东西,

我一直在寻找一个合适的解释,但是找不到一个能回答我问题的解释

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

var a = {x:10};
然后我删除了a.x,它返回了
true
(这里没有意外)

然后继续像这样删除对象:
deletea

但让我感到困惑的是,
googlechrome
返回了
false
Firefox
返回了
true

一个对象在一个浏览器中被“删除”,而在另一个浏览器中不被“删除”,这怎么可能呢?这里有没有我遗漏的东西,或者是浏览器实现导致了这种情况

在FF v27中:

在谷歌ChromeV33中
.

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

在Firebug中,控制台代码是使用。然而,在Chrome中,控制台中的代码是1,它模拟实际的代码运行,而不是直接使用JavaScript的
eval
函数

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

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

ECMAScript标准第10.5节中规定了
eval
和其他类型的可执行代码之间的行为差异:

二,。如果代码是eval代码,则让configurableBindings为true,否则让configurableBindings为false

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

我发现:这似乎是一个Firebug问题:当你在Chrome中使用内置开发工具时,它直接使用JS引擎。Firebug是一个在JS中创建的插件,所以执行某些东西的唯一方法是使用“eval”,它似乎没有向对象添加“don't delete”属性


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

我将在@Qantas的回答中添加一些要点:

根据:

返回 如果属性是自己的不可配置属性,则以严格模式抛出 属性(在非严格表达式中返回false)。在所有其他情况下返回true 案例


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

谢谢!现在有意义了。:)