All streams
Search
Write a publication
Pull to refresh

Comments 33

Я бы ошибку выдал из-за запятой
Да, я тоже так сначала думал ))
UFO landed and left these words here
А в данном случае, всё верно — в соответствии со спецификацией. А в случае примера, 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
UFO landed and left these words here
UFO landed and left these words here
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, по спецификации, не прав.
UFO landed and left these words here
«Нормальные» в большинстве отношений, но возможно не в этом =)
> Как по мне, 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,]
Sign up to leave a comment.

Articles