【问题标题】:JavaScript delete objects behaves differently in different browsersJavaScript 删除对象在不同浏览器中的行为不同
【发布时间】:2014-02-28 11:42:51
【问题描述】:

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

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

var a = {x:10};

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

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

但让我难过的是Google Chrome返回falseFirefox返回true

如何在一个浏览器中“删除”对象而不在另一个浏览器中“删除”?是我在这里遗漏了什么还是浏览器实现导致了这种情况?

在 FF v27 中:

在谷歌浏览器 v33 中 .

【问题讨论】:

    标签: javascript google-chrome firefox garbage-collection


    【解决方案1】:

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

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

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

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

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

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

    1: 这段代码只是前端代码,不是真正的内部代码,它分为很多层。

    【讨论】:

    • 谢谢!现在有道理了。 :)
    【解决方案2】:

    我发现this:好像是Firebug的问题:当你使用Chrome内置的开发者工具时,它是直接使用JS引擎的。 Firebug 是在 JS 中创建的插件,因此执行某事的唯一方法是使用“eval”,这似乎不是将“不要删除”属性添加到对象。

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

    【讨论】:

      【解决方案3】:

      我会在@Qantas 的回答中补充一点:

      根据MDN delete operator reference

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

      也就是说,不可配置的变量不能通过删除操作符删除。但是,如果变量是可配置的,如@Qantas 的回答,在eval() 中定义,则可以使用删除运算符将其删除。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多