IE9 JavaScript数组初始化bug

c-s*_*ile 10 javascript internet-explorer-9

显然,IE9中的JS实现包含处理数组文字的(IMO,严重)错误.

在IE9中,在某些情况下这段代码:

var a = [1,2,3,4,];
Run Code Online (Sandbox Code Playgroud)

将创建长度为5的数组,最后一个元素等于undefined.

以下是我的KiTE引擎测试页面的两个版本:

唯一的区别是第一个文档包含初始化为data.contacts的属性[1,2,3,4],第二个文档包含[1,2,3,4,].

内部IE调试器报告该data.contacts数组在第二种情况下包含5个元素.没有调试器,此代码在kite.js中的第98行失败(尝试获取undefined该data.content数组的第五个元素的属性)

问题:

  1. 人们通常如何以及在哪里报告IE中的错误?
  2. 你见过类似这个问题的东西吗?我正在寻找这个问题可重现的最简单的情况.

更新:这里是测试http://jsfiddle.net/hmAms/,其中所有浏览器(包括IE9)都同意var a = [1,2,3,4,];长度为4 的事实.

Rob*_*obG 10

应忽略数组文字中的单个尾随逗号.两个尾随逗号是一个省略号,应该在数组的长度上添加一个逗号.所以:

alert( [1,2,3,4,].length );   // 4

alert( [1,2,3,4,,].length );  // 5
Run Code Online (Sandbox Code Playgroud)

某些版本的IE(<9?)将单个训练逗号视为一个elison并错误地将一个加到一个长度上,因此上面的结果是5和6的结果.这与ECMA-262§11.1.3不一致,因此是一个错误.

省略的目的是增加数组长度而不创建额外属性或直接指定长度,因此:

var x = [,1,,];
Run Code Online (Sandbox Code Playgroud)

相当于:

var x = new Array(3);
x[1] = 1;
Run Code Online (Sandbox Code Playgroud)

两种情况下的结果都应该是长度为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);
Run Code Online (Sandbox Code Playgroud)

结果应该是:

length: 5
index 1 has value 1
index 3 has value 3
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这个bug可能已经存在,因为IE允许数组文字,至少版本4(1997?).