IE9 JavaScript数组初始化bug

时间:2011-06-01 05:21:37

标签: javascript internet-explorer-9

显然,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数组的第五个元素)

问题:

  1. 人们通常如何以及在何处报告IE中的错误?
  2. 你见过类似这个问题的东西吗?我正在寻找这个问题可重现的最简单的情况。
  3. 更新:这是测试http://jsfiddle.net/hmAms/,其中所有浏览器(包括IE9)都同意var a = [1,2,3,4,];长度为4的事实。

2 个答案:

答案 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之后的每一个数字。