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

Iva*_*van 15 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);
Run Code Online (Sandbox Code Playgroud)

编辑:

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

mpl*_*jan 18

在IE中永远不会有逗号.期.

这也适用于ARRAY

Javascript浏览器怪癖 - array.Length

为了处理你的编辑,这个工作(在IE8中测试):

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

为了更安全的测试,请查看此页面上的其他建议:数组长度与Internet Explorer中的尾随逗号不同 - DEMO HERE

顺便说一下,从来没有听说过elision这个词或者之前已经省略了 - 每天都在这里学习新东西


Rob*_*obG 9

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

编辑

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

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

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

function tidyTrailingElisions(array) {
  var i = array.length;
  while (!array.hasOwnProperty(--i)) {}
  array.length = ++i;
  return array;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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