Comments 33
Я бы ошибку выдал из-за запятой
Неужели до этого никто об этой особенности IE не написал? :)
Вывод: не ставить завершающую запятую, ничего другого делать не остаётся…
Вывод: не ставить завершающую запятую, ничего другого делать не остаётся…
UPD: Ответ на вопрос в топике. Я думаю, что единственно верный вариант — игнорировать завершающую запятую (как делают нормальные браузеры), вариант лаконичный и общепринятый. Лаконичный, потому что при вертикальном форматировании списка можно писать
var array = [
something_1,
something_2,
…
something_n,
];
оставляя последнюю запятую (единообразие — это хорошо). Общепринятый — потому что так можно делать во всех ЯП (например, в Python, в Си, и т.д.). Кстати, какова реакция IE на лишние запятые в конструкции следующего вида?
var something = {
a: 1,
b: 2,
};
var array = [
something_1,
something_2,
…
something_n,
];
оставляя последнюю запятую (единообразие — это хорошо). Общепринятый — потому что так можно делать во всех ЯП (например, в Python, в Си, и т.д.). Кстати, какова реакция IE на лишние запятые в конструкции следующего вида?
var something = {
a: 1,
b: 2,
};
там же пробел вообще-то. Так что длина как раз 4.
Будь там хоть сто пробелов или ни одного — результат один и тот же.
инициализация элементов массива происходит при помощи вы не поверите ЗАПЯТОЙ. После запятой стоит пробел, который является тоже значением. Десять пробелов будет тоже являться значением.
Отсутствие пробела приводит к тому же результату, что и его присутствие — я проверял.
Да и вообще в конструкциях
и
семантической разницы быть не должно.
[1, 2]
и
[1, 2]
семантической разницы быть не должно.
Перестаньте говорить ерунду. Пробел не является значением (значение в данном случае =
undefined
). Пробелы вообще в большей части случаев игнорируются.> при помощи вы не поверите ЗАПЯТОЙ
ой, не поверим ;)
ой, не поверим ;)
Вы бы уточнили какая версия IE, у меня например выдал IE8 -> 4: 1 2 3 undefined, FF3.5 -> IE8 -> 3: 1 2 3
оба подхода кажутся верные в какой-то степени, а все это от того, что в JS и DOM броузеры не поддерживают единого стандарта интерпритации и это не единственный пример. А мы в итоге страдаем, ища баги.
оба подхода кажутся верные в какой-то степени, а все это от того, что в JS и DOM броузеры не поддерживают единого стандарта интерпритации и это не единственный пример. А мы в итоге страдаем, ища баги.
не надо так делать, юзайте jsLint
11.1.4. Array Initialiser
Т.е. IE прочитал эту часть и решил всё время ей следовать (при нахождении пропуска, увеличивать длину массива на 1), однако, IE не учёл следующий алгоритм:
Т.к. Result(2) должен быть ноль.
Поэтому, IE, по спецификации, не прав.
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, по спецификации, не прав.
Откройте Флэнагана, раздел массивы. Создаётся 4 элемента, 4й элемент — undefined. Нет ничего «непредсказуемого».
> В какой-то степени оба поведения мне кажутся логичными, а вы как думаете?
А что тут думать? Черным по белому — в спецификации это поведение описано. IE не прав в данном случае. См. 11.1.4.
А что тут думать? Черным по белому — в спецификации это поведение описано. IE не прав в данном случае. См. 11.1.4.
Вот именно. Не понимаю о чём этот пост.
Ну, под «что тут думать?» я больше имел в виду, не то, как «тут всё просто в 11.1.4, что вы тут думаете?», а, что «не надо выдумывать ничего, когда есть точное описание». Сам же этот раздел не такой и простой, чтобы увидеть всю картину при беглом просмотре.
Я использовал это несоответствие для написание кратчайшего определителя IE:
!-[1,]
!-[1,]
Sign up to leave a comment.
Интересно же IE интерпретирует исходники