显然,IE9中的JS实现在处理数组文字时包含(IMO,严重)错误。
在IE9中,在某些情况下这段代码:
var a = [1,2,3,4,];
将创建长度为5的数组,最后一个元素等于undefined
。
以下是我的KiTE引擎测试页面的两个版本:
唯一的区别是第一个文档包含初始化为[1,2,3,4]
的data.contacts属性,第二个文档包含[1,2,3,4,]
。
内部IE调试器报告data.contacts
数组在第二种情况下包含5个元素。没有调试器,此代码在kite.js中的第98行失败(尝试获取undefined
的属性 - 该data.content数组的第五个元素)
问题:
更新:这是测试http://jsfiddle.net/hmAms/,其中所有浏览器(包括IE9)都同意var a = [1,2,3,4,];
长度为4的事实。
答案 0 :(得分:10)
应忽略数组文字中的单个尾随逗号。两个尾随逗号是一个省略号,应该在数组的长度上添加一个逗号。所以:
alert( [1,2,3,4,].length ); // 4
alert( [1,2,3,4,,].length ); // 5
IE的某些版本(< 9?)将单个训练逗号视为一个elison并错误地将一个加到一个长度上,因此上面的结果是5和6的结果。这与ECMA-262§11.1.3不一致,因此是一个错误。
省略的目的是增加数组长度而不创建额外属性或直接指定长度,所以:
var x = [,1,,];
相当于:
var x = new Array(3);
x[1] = 1;
两种情况下的结果应该是长度为3的数组和一个名为“1”且值为1的属性。前导逗号和尾随逗号对是符号,它们仅影响长度,它们是不要创建属性。 IE正确解释了前导逗号但错误地将两个尾随逗号都解释为elisions,将长度增加了太多。
var x = [,1,,3,,];
var s = 'length: ' + x.length;
for (var p in x) {
s += '\nindex ' + p + ' has value ' + x[p];
}
alert(s);
结果应为:
length: 5
index 1 has value 1
index 3 has value 3
顺便说一句,这个bug可能已经存在,因为IE允许数组文字,至少版本4(1997?)。
答案 1 :(得分:-3)
这不是一个错误。这正是它应该如何表现的。微软故意这样做。如果你想要一个只有4个项目的数组,那就去掉最后一个逗号。就这么简单。
如果您追求的结果是在最后有一个额外的,未定义的值,那么你很幸运。即使没有逗号,它也将是未定义的。它,以及3之后的每一个数字。