IE9 JavaScript数组初始化错误

IE9 JavaScript数组初始化错误,javascript,internet-explorer-9,Javascript,Internet Explorer 9,显然,IE9中的JS实现在处理数组文本时包含(IMO,严重)错误 在IE9中,在某些情况下,此代码: var a = [1,2,3,4,]; 将创建长度为5的数组,最后一个元素等于未定义的 以下是我的KiTE引擎测试页面的两个版本: -在IE9工作 -在IE9中失败 唯一的区别是,第一个文档包含初始化为[1,2,3,4]的data.contacts属性,第二个文档包含初始化为[1,2,3,4,]的data.contacts属性 内部IE调试器报告数据。第二种情况下,contacts数组包含

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

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

var a = [1,2,3,4,];
将创建长度为5的数组,最后一个元素等于
未定义的

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

  • -在IE9工作
  • -在IE9中失败
唯一的区别是,第一个文档包含初始化为
[1,2,3,4]
的data.contacts属性,第二个文档包含初始化为
[1,2,3,4,]
的data.contacts属性

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

问题:

  • 人们通常如何以及在哪里报告IE中的bug
  • 你有没有见过类似的问题?我正在寻找最简单的情况下,这个问题是重复的
    更新:这是一个测试,所有浏览器(包括IE9)都同意
    var a=[1,2,3,4]的长度为4

    这不是一个bug。这正是它应该表现出来的。微软是故意这么做的。如果您想要一个只有4项的数组,请去掉最后一个逗号。就这么简单


    如果你所追求的结果是在最后有一个额外的、未定义的值,那么你很幸运。即使没有逗号,它也将是未定义的。它,以及3之后的每个数字。

    应忽略数组文字中的单个尾随逗号。两个尾随逗号是省略号,应该在数组长度上加上一个。因此:

    alert( [1,2,3,4,].length );   // 4
    
    alert( [1,2,3,4,,].length );  // 5
    
    IE的某些版本(<9?)将单个training逗号视为elison,并错误地将一个添加到长度,因此上述结果分别为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 = [,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
    

    顺便说一句,这个错误可能是在IE允许数组文字,至少版本4(1997?)之后出现的。

    我认为不应该首先编写
    [1,2,3,4,]
    最后一个逗号表示还有另一个值。在你的情况下,它是未定义的。那么bug在哪里呢?删除过时的逗号,您的问题就消失了。许多语言都支持尾随逗号,它对自动生成的代码很有用(注意JSON官方不支持它),并使编辑和合并源代码变得更容易。@Peter Davis:非常正确。只要JS使用C符号,它就应该使用它的基本语法特性。为了避免意外。但我的问题实际上是关于不同的事情:IE在不同的上下文中以不同的方式处理数组文本中的尾随逗号,这就是问题所在。IE的旧版本称之为语法错误,如果在对象文本中跟踪逗号,大多数浏览器也会这样做。如果必须以空值结束数组,最好使用null]或undefined]。真的吗?那么,这个呢?IE9向您报告的阵列长度是多少?这就是问题所在——它是不一致的。正如我所说,
    […,未定义]
    是毫无意义的。不管怎样,它都是未定义的。@c-smile IE9并不是绝对可怕,就像它的哥哥姐姐一样,这也是不一致的。“那么他们应该解决这个问题吗?”泰勒·沃什伯恩--1因为这绝对是一个bug。尾随省略需要两个逗号:
    alert([1,2,3,4,,].length)应为5,即“数组元素可以在元素列表的开头、中间或结尾处省略。只要元素列表中的逗号前面没有AssignmentExpression(即,在开头或另一个逗号之后有一个逗号),缺少的数组元素会增加数组的长度并增加后续元素的索引。未定义省略的数组元素。如果在数组末尾省略了元素,则该元素不会增加数组的长度。”因此,规范明确指出,只有最后一个逗号不会影响数组长度,这就是iE(@thetoolman-最后一句是在ES5中添加的。它不是为了改变省略的行为(否则它直接与第一句相矛盾),但用于确认单个尾随逗号不会增加数组长度。该语句不必要且容易混淆-单个逗号只是数组文字开头的省略,而不是其他任何地方的省略(包括结尾)。数组成员赋值表达式包括以下逗号(如果有),因此单个尾随逗号是前面AssignmentExpression的一部分,因此不是省略。