繁体   English   中英

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

[英]JavaScript delete objects behaves differently in different browsers

我正在SO上为此寻找合适的解释,但找不到能回答我的问题的解释。

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

var a = {x:10};

然后我确实delete ax返回true delete ax

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

但是令我感到困扰的是,当Google Chrome返回falseFirefox返回true

如何在一个浏览器中而不是在另一个浏览器中“删除”对象? 我在这里缺少什么吗?还是浏览器的实现导致了这一点?

在FF v27中: Firefox控制台

在Google Chrome v33中 Google Chrome浏览器控制台

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

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

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

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

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

2.如果代码是评估代码,则使configurableBindingstrue,否则使configurableBindingsfalse

1:此代码仅是前端代码,而不是实际的内部代码,它分为许多层次。

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

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

我会在@Qantas的答案中添加一些观点:

根据MDN删除操作员参考

如果该属性是自己的不可配置属性,则以严格模式返回Throw(在非严格条件下返回false)。 在所有其他情况下返回true。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM