Одна запятая в литерале массива должна игнорироваться. Две запятые - это пробел, и к длине массива следует добавить одну. Итак:
alert( [1,2,3,4,].length ); // 4
alert( [1,2,3,4,,].length ); // 5
В некоторых версиях IE (<9?) Одиночная обучающая запятая воспринимается как элисон и неправильно добавляется к длине, поэтому приведенные выше результаты равны 5 и 6 соответственно. Это несовместимо с ECMA-262 §11.1.3 и, следовательно, является ошибкой. </p>
Цель elision - увеличить длину массива без создания дополнительного свойства или непосредственного присвоения длины, поэтому:
var x = [,1,,];
эквивалентно:
var x = new Array(3);
x[1] = 1;
Результатом в обоих случаях должен быть массив с длиной 3 и одним свойством с именем '1' со значением 1. Пара начальных и конечных запятых - это el elings, они только влияют на длину, они не создавать свойства. 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?).