在具有尾随逗号的Internet Explorer中,阵列长度不同

时间:2011-06-30 21:13:28

标签: javascript arrays internet-explorer

我目前正在使用数组形式的Javascript处理一些数据。该数组最后可能包含一个空条目,例如[1,2,]。在Google Chrome和Firefox中,该示例的长度为2;但是,在IE中,长度为3.

简而言之:Internet Explorer为Javascript中的数组提供的长度与Google Chrome和Firefox不同。有没有办法在所有浏览器中标准化这种行为?

代码:

var a = [1,];
alert(a.length);

编辑:

许多答案都说没有逗号,但数据是以这种方式提供给我的。

3 个答案:

答案 0 :(得分:18)

NEVER have trailing commas in IE. Period.

That goes for ARRAYs too

Javascript Browser Quirks - array.Length

要处理您的编辑,这项工作(在IE8中测试):

if (a[a.length-1]==null) a.length--; // or a.pop()

要获得更安全的测试,请查看此页面上的其他建议:Length of Array Differs In Internet Explorer With Trailing Comma - DEMO HERE

顺便说一下,之前从未听过elisionelided这几个字 - 每天都在这里学习新东西

答案 1 :(得分:9)

没有。 IE错误地将单个尾随逗号解释为省略号,并在不应该的时候添加一个逗号(ECMA-262第11.1.4节)。

修改

为了解决这里的混淆,IE将数组文字中的单个尾随逗号(错误地)视为省略,这意味着它会增加数组的长度属性,但不会创建属性。换句话说,给定:

var a = [0,1,];

在IE中,a.length为3,但没有属性a [2]。因此,如果一个合适的解决方案是仅从数组的末尾删除省略的成员(如果这是一个问题,这可能是最好的解决方案),那么:

function tidyTrailingElisions(array) {
  var i = array.length;
  while (!array.hasOwnProperty(--i)) {}
  array.length = ++i;
  return array;
}

将从数组末尾删除排除成员(即不存在的属性),它不会在其他地方删除它们,也不会浪费时间迭代整个数组(这可能导致将被删除的成员添加为未定义)。要添加到Array.prototype:

Array.prototype.tidyTrailingElisions = function() {
  var i = this.length;
  while ( !this.hasOwnProperty(--i)) {}
  this.length = ++i;
  return this;
};

请注意,这就是 Array.prorotype.filter 的工作原理,它不会对已删除的成员进行迭代(它使用 hasOwnProperty 测试并删除任​​何被删除的成员作为部分过滤数组)。

答案 2 :(得分:4)

尝试删除空元素:

a = a.filter(function(){return true});

然后它应该在IE和其他浏览器中以相同的方式工作。

更新:如果JS版本低于1.6,请尝试:

Array.prototype.clean = function() {
  for (var i = 0; i < this.length; i++) {
    if (this[i] == undefined) {
      this.splice(i, 1);
      i--;
    }
  }
  return this;
};


a.clean()