【问题标题】:Object.keys behavior in chrome and IE 11chrome 和 IE 11 中的 Object.keys 行为
【发布时间】:2015-11-02 06:33:29
【问题描述】:

今天我在使用 Object.keys 时遇到了错误,因为我不小心像这样传递了非对象值:

var filter = true;
var filterKeys = Object.keys(filter);

在 Chrome 中这很好用,但在 IE 11 中出现异常,调试后发现在 IE 11 中 Object.keys 抛出异常 Object.keys: argument is not an Object

在这种情况下,IE11 表现得更好,因为值 true 确实无效,但 chrome 返回了空数组。 Object.keys 是 ECMAScript 标准,如果您查看 http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.14,它会说:

  1. 如果 Type(O) 不是 Object,则抛出 TypeError 异常。

那么有谁知道为什么 Google Chrome 实现的行为不像 ECMAScript 规范标准中那样,因为我一直认为所有现代浏览器都应该实现 ECMAScript 以使其行为相同。

【问题讨论】:

标签: javascript google-chrome internet-explorer


【解决方案1】:

n 这种情况 IE11 表现得更好,因为值 true 确实无效,但 chrome 返回了空数组。 Object.keys 是 ECMAScript 标准,如果您查看 http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.14,它会说:

如果 Type(O) 不是 Object,则抛出 TypeError 异常。

ES5 太旧了

阅读 ES6 规范,您会发现 Internet Exploder 是采用旧方式的浏览器(Chrome 和 Firefox 正确)

http://www.ecma-international.org/ecma-262/6.0/#sec-object.keys

注意:IE11(或任何在 Windows 10 中被称为可憎的东西)以 ES2015 的方式实现

【讨论】:

  • “错误”与声明的 ES 版本有关。 AFAIK,除了某些功能外,Chrome 并未声称部分实现 ES6。就 Chrome 声称正在实现 ES5 而言,它的行为实际上可能被解释为不正确。
【解决方案2】:

那么有谁知道为什么 Google Chrome 实现的行为不像 ECMAScript 中的那样

这取决于浏览器实现了哪个版本的 ECMAScript。

ECMA-262 ed 6(当前标准)中,第一步是:

  1. 设 obj 为 ToObject(O)

ES5,第一步是:

  1. 如果 Type(O) 不是 Object,则抛出 TypeError 异常。

所以你可以说 Chrome 与 ed 6 一致(它将原始 true 转换为布尔对象)和 IE 与 ES5 一致(它抛出 TypeError 异常),因此两者都符合标准的不同版本。

【讨论】:

    猜你喜欢
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多