Обновить

Комментарии 33

Я бы ошибку выдал из-за запятой
Да, я тоже так сначала думал ))
НЛО прилетело и опубликовало эту надпись здесь
А в данном случае, всё верно — в соответствии со спецификацией. А в случае примера, IE — не прав, длин должна быть 3. См. 11.1.4.
Неужели до этого никто об этой особенности IE не написал? :)

Вывод: не ставить завершающую запятую, ничего другого делать не остаётся…
UPD: Ответ на вопрос в топике. Я думаю, что единственно верный вариант — игнорировать завершающую запятую (как делают нормальные браузеры), вариант лаконичный и общепринятый. Лаконичный, потому что при вертикальном форматировании списка можно писать

var array = [
something_1,
something_2,

something_n,
];

оставляя последнюю запятую (единообразие — это хорошо). Общепринятый — потому что так можно делать во всех ЯП (например, в Python, в Си, и т.д.). Кстати, какова реакция IE на лишние запятые в конструкции следующего вида?

var something = {
a: 1,
b: 2,
};
Такая же как и с массивом — ошибок нет, но и никаких length, соответственно, тоже нет. Создает объект с двумя свойствами.
> Такая же как и с массивом — ошибок нет

С объектами, ошибка есть.
там же пробел вообще-то. Так что длина как раз 4.
Будь там хоть сто пробелов или ни одного — результат один и тот же.
инициализация элементов массива происходит при помощи вы не поверите ЗАПЯТОЙ. После запятой стоит пробел, который является тоже значением. Десять пробелов будет тоже являться значением.
Отсутствие пробела приводит к тому же результату, что и его присутствие — я проверял.
Да и вообще в конструкциях
[1, 2]
и
[1, 2]
семантической разницы быть не должно.
Сорри, в первом случае пять пробелов между 1 и 2 заменились одним.
Перестаньте говорить ерунду. Пробел не является значением (значение в данном случае = undefined). Пробелы вообще в большей части случаев игнорируются.
> при помощи вы не поверите ЗАПЯТОЙ

ой, не поверим ;)
Вы бы уточнили какая версия IE, у меня например выдал IE8 -> 4: 1 2 3 undefined, FF3.5 -> IE8 -> 3: 1 2 3
оба подхода кажутся верные в какой-то степени, а все это от того, что в JS и DOM броузеры не поддерживают единого стандарта интерпритации и это не единственный пример. А мы в итоге страдаем, ища баги.
извиняюсь, опечатка вызванная пагубным влиянием копипаста, там должно быть:
IE8 -> 4: 1 2 3 undefined, FF3.5 -> 3: 1 2 3
Проверил IE 5.5, 6, 7, 8. Везде одно и то же.
не надо так делать, юзайте jsLint
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
11.1.4. Array Initialiser
Array elements may be elided at the beginning, middle or end of the element list. Whenever a comma in
the element list is not preceded by an AssignmentExpression (i.e., a comma at the beginning or after
another comma), the missing array element contributes to the length of the Array and increases the index
of subsequent elements
. Elided array elements are not defined.

Т.е. IE прочитал эту часть и решил всё время ей следовать (при нахождении пропуска, увеличивать длину массива на 1), однако, IE не учёл следующий алгоритм:
The production ArrayLiteral: [ ElementList, Elisionopt ] is evaluated as follows:
1. Evaluate ElementList.
2. Evaluate Elision; if not present, use the numeric value zero.
3. Call the [[Get]] method of Result(1) with argument «length».
4. Call the [[Put]] method of Result(1) with arguments «length» and (Result(2)+Result(3)).
5. Return Result(1).

Т.к. Result(2) должен быть ноль.

Поэтому, IE, по спецификации, не прав.
НЛО прилетело и опубликовало эту надпись здесь
«Нормальные» в большинстве отношений, но возможно не в этом =)
> Как по мне, IE ведет себя правильно, а Firefox нет

По спецификации, нет: IE — не прав, Fx — прав.
Откройте Флэнагана, раздел массивы. Создаётся 4 элемента, 4й элемент — undefined. Нет ничего «непредсказуемого».
> Откройте Флэнагана, раздел массивы

Откройте ECMA-262-3, 11.1.4 Array Initialiser. В случае примера, длина, всё же, должна быть 3.
> В какой-то степени оба поведения мне кажутся логичными, а вы как думаете?

А что тут думать? Черным по белому — в спецификации это поведение описано. IE не прав в данном случае. См. 11.1.4.
Вот именно. Не понимаю о чём этот пост.
Ну, под «что тут думать?» я больше имел в виду, не то, как «тут всё просто в 11.1.4, что вы тут думаете?», а, что «не надо выдумывать ничего, когда есть точное описание». Сам же этот раздел не такой и простой, чтобы увидеть всю картину при беглом просмотре.
Я о том же. Всё уже придумано и описано. У людей какая-то боязнь спецификации, а в то же время это единственный источник, которому можно доверять.
Я использовал это несоответствие для написание кратчайшего определителя IE:

!-[1,]
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации