chrome和IE 11中的Object.keys行为

时间:2015-08-10 11:07:52

标签: javascript google-chrome internet-explorer

今天我使用Object.keys时遇到错误,因为我意外地传递了非对象值,如下所示:

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

在Chrome中运行良好,但在IE 11中我得到了异常,经过调试后发现在IE 11中,Object.keys抛出异常 Object.keys:参数不是对象

在这种情况下,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异常。
  2. 所以有人知道为什么谷歌Chrome实现的行为与ECMAScript规范标准不同,因为我一直认为所有现代浏览器都应该以相同的方式实现ECMAScript。

2 个答案:

答案 0 :(得分:7)

  

所以有人知道为什么谷歌Chrome实现的行为与ECMAScript中的行为不同

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

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

  
      
  1. 让obj成为ToObject(O)
  2.   

ES5中,第一步是:

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

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

答案 1 :(得分:2)

  

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

注意:IE12(或者在Windows 10中调用任何令人憎恶的东西)都是以ES2015方式进行的