我目前正在使用数组形式的Javascript处理一些数据。该数组最后可能包含一个空条目,例如[1,2,]
。在Google Chrome和Firefox中,该示例的长度为2;但是,在IE中,长度为3.
简而言之:Internet Explorer为Javascript中的数组提供的长度与Google Chrome和Firefox不同。有没有办法在所有浏览器中标准化这种行为?
代码:
var a = [1,];
alert(a.length);
编辑:
许多答案都说没有逗号,但数据是以这种方式提供给我的。
答案 0 :(得分:18)
NEVER have trailing commas in IE. Period.
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
答案 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()