IE9 JavaScript ошибка инициализации массива - PullRequest
10 голосов
/ 01 июня 2011

Очевидно, что реализация JS в IE9 содержит (IMO, критическая) ошибка в обработке литералов массива.

В IE9 в некоторых случаях этот код:

var a = [1,2,3,4,];

создаст массив длиной 5 с последним элементом равным undefined.

Вот две версии моих тестовых страниц двигателя KiTE:

Единственное отличие состоит в том, что первый документ содержит свойство data.contacts, инициализированное как [1,2,3,4], а второе как [1,2,3,4,].

Внутренний отладчик IE сообщает, что массив data.contacts содержит 5 элементов во втором случае. Без отладчика этот код завершается с ошибкой в ​​строке 98 в файле kite.js (пытается получить свойство undefined - пятый элемент этого массива data.content)

Вопросы:

  1. Как и где люди обычно сообщают об ошибках в IE?
  2. Вы видели что-нибудь похожее на эту проблему? Я ищу простейший случай, когда эта проблема воспроизводима.

Обновление: вот тест http://jsfiddle.net/hmAms/, где все браузеры (включая IE9) согласны с тем фактом, что var a = [1,2,3,4,]; имеет длину 4.

Ответы [ 2 ]

10 голосов
/ 01 июня 2011

Одна запятая в литерале массива должна игнорироваться. Две запятые - это пробел, и к длине массива следует добавить одну. Итак:

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?).

0 голосов
/ 01 июня 2011

Это не ошибка. Именно так оно и должно себя вести. Microsoft сделала это специально. Если вы хотите массив только с 4 элементами, избавьтесь от последней запятой. Все просто.

Если в результате вы получите дополнительное неопределенное значение в конце, вам повезло. Даже без запятой это будет неопределенным. Это и каждый номер после 3.

...