IE9 JavaScript数组初始化错误

问题描述

| 显然,IE9中的JS实现包含处理数组文字的(IMO,严重)错误。 在IE9中,在某些情况下,此代码为:
var a = [1,2,3,4,];
将创建长度为5的数组,最后一个元素等于
undefined
。 这是我的KiTE引擎测试页的两个版本: http://terra@R_827_404[email protected]/kite/test-kite.htm-在IE9中有效 http://terra@R_827_404[email protected]/kite/test-kite-ie9-bug.htm-IE9中失败 唯一的区别是第一个文档包含已初始化为“ 2”的data.contacts属性,而第二个文档则包含了“ 3”的属性。 内部IE调试器报告第二种情况下,“ 4”数组包含5个元素。没有调试器,该代码将在kite.js的第98行失败(试图获取
undefined
属性-该data.content数组的第五个元素) 问题: 人们通常如何以及在哪里报告IE中的错误? 您是否看到过与此问题类似的东西?我正在寻找此问题可重现的最简单情况。 更新:这是测试http://jsfiddle.net/hmAms/,所有浏览器(包括IE9)都同意ѭ6的长度为4。     

解决方法

        数组文字中的单个尾部逗号应忽略。后面两个逗号是省略号,应在数组长度上加一个。所以:
alert( [1,2,3,4,].length );   // 4

alert( [1,].length );  // 5
某些版本的IE(<9?)将单个训练逗号视为Elison,并错误地将长度加1,因此上述结果分别为5和6。这与ECMA-262§11.1.3不一致,因此是一个错误。 省略的目的是在不创建额外属性或不直接分配长度的情况下增加数组长度,因此:
var x = [,1,];
等效于:
var x = new Array(3);
x[1] = 1;
在两种情况下,结果都应为长度为3的数组和一个名为\'1 \'的属性,其值为1。前导逗号和尾随逗号对是省略号,它们仅影响长度,不创建属性。 IE正确解释了前导逗号,但错误地将两个尾随的逗号都解释为省略号,使长度增加了1。
var x = [,];
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
顺便说一句,自IE至少允许使用数组文字(第4版)(1997年)以来,该错误就一直存在。     ,        那不是错误。这就是它的行为方式。微软是故意这样做的。如果要只包含4个项目的数组,请删除最后一个逗号。就那么简单。 如果您要获得的结果最后有一个额外的未定义值,那么您很幸运。即使没有逗号,它也是不确定的。以及3之后的每个数字。