IE问题 - 不支持Object.keys(value).length

12

我一直在尝试在Internet Explorer中调试一些js代码,但是我无法解决这个问题。这里是导致错误的那一行:

var numberOfColumns = Object.keys(value).length;

错误信息是...

Message: Object doesn't support this property or method
Line: 640
Char: 5
Code: 0
URI: xxx

一开始我以为问题与Object.keys(value).length;有关,但奇怪的是(至少对我来说),错误出现在第5个字符处,也就是变量名的开头。

总之,我不知道发生了什么或如何解决它。另外,如果我替换:

var numberOfColumns = Object.keys(value).length;

随着...

var numberOfColumns = 9; // troubleshooting

错误仍然存在,请帮忙。 更新: jsFiddle已添加。

http://jsfiddle.net/4Rab7/


你尝试使用Firebug或其他调试工具运行它了吗? - AMember
你能展示更多的代码吗?或者提供一个包含问题的 JSFiddle 示例吗? - AMember
如果你用正常的代码替换掉那些被认为是有问题的代码,但程序仍然失败了,那么很可能问题出在其他地方。 - Fabrício Matté
我的公司屏蔽了某些网站,恰好包括FF插件页面以及我在这篇文章中找到的一个工具:https://dev59.com/b3RC5IYBdhLWcg3wP-n5。但是没关系,我马上就会准备好一个jsfiddle。 - veryConfused
我使用简单的jsFiddle实现更新了问题。在IE 8中,没有警报,但在Firefox中可以正常工作。 - veryConfused
使用开发者工具(F12)来确定您的浏览器是否支持某个功能。例如,在IE10和Chrome的控制台中键入“Object.keys”会显示“function keys() { [native code] }”,表明它们支持此方法。 - Sampson
3个回答

23

keys属性在IE9及以上版本中受支持。您可能正在早期版本中进行测试。一个简单的解决方法是:

var length = 0;
for(var prop in data){
    if(data.hasOwnProperty(prop))
        length++;
}

这里有一个演示:http://jsfiddle.net/vKr8a/ 更多信息请参考以下兼容性表格:http://kangax.github.com/es5-compat-table/

这会污染prop全局变量。 - Steven Lu
@StevenLu 你可以使用 for (var prop in data) - Asad Saeeduddin
如果你想避免我给你的踩票,是的,这就是你应该回答的内容 :P - Steven Lu
我们确定在IE >= 9中实际上支持keys吗?我正在运行IE11,它仍然不支持它,哈哈,他们决定将其删除了吗? - codenamezero
@codenamezero 是的,我确定它在IE>=9中得到支持。请确保您的页面不处于怪异模式。 - Asad Saeeduddin
显示剩余3条评论

13

或者,您可以使用一个推荐的polyfill来兼容那些不支持Object.keys原生方法的浏览器。

Object.keys=Object.keys||function(o,k,r){r=[];for(k in o)r.hasOwnProperty.call(o,k)&&r.push(k);return r}

这个脚本的作用是将以下内容分解:
Object.keys = Object.keys || function(o,k,r) { 
// If the script doesn't detect native Object.keys 
// support, it will put a function in its place (polyfill)

    r=[];
    // Initiate the return value, empty array

    for(k in o) r.hasOwnProperty.call(o,k) 
    // loop through all items in the object and verify each
    // key is a property of the object (`for in` will return non 
    // properties)

    && r.push(k);
    // if it is a property, save to return array

    return r
}

简洁、简单、高效。 - Piyush

4

Object.keys 在ECMAScript 5版中被引入。因此,如果您的IE版本低于9,则不支持该功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接