Подтвердить что ты не робот

Javascript Browser Quirks - array.Length

код:

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Unusual Array Lengths!</title>

    <script type="text/javascript">
        var arrayList = new Array();
        arrayList = [1, 2, 3, 4, 5, ];
        alert(arrayList.length);
    </script>

</head>
<body>
</body>
</html>

Обратите внимание на дополнительную запятую в объявлении массива. Приведенный выше код дает разные выходы для различных браузеров:

Сафари: 5

Firefox: 5

IE: 6

Дополнительная запятая в массиве игнорируется Safari и FF, в то время как IE рассматривает ее как еще один объект в массиве.

В каком-то поиске я нашел разные мнения о том, какой ответ правильный. Большинство людей говорят, что IE правильный, но затем Safari также делает то же самое, что Firefox. Я не тестировал это в других браузерах, таких как Opera, но я предполагаю, что есть расхождения.

Мои вопросы:

я. Какой из них правильный?

Изменить: По общему мнению (и рекомендациям ECMAScript) мы предполагаем, что IE снова виноват.

II. Есть ли какие-либо другие особенности браузера Javascript, о которых я должен опасаться?

Изменить: Да, есть множество особенностей Javascript. www.quirksmode.org - хороший ресурс для того же самого.

III. Как избежать таких ошибок?

Изменить: используйте JSLint для проверки вашего javascript. Или используйте некоторые внешние библиотеки. Или дезинфицируйте свой код.

Благодаря DamienB, JasonBunting, John и Конрад Рудольф за их вклад.

4b9b3361

Ответ 1

Мне кажется, что поведение Firefox правильное. Каково значение 6-го значения в IE (извините, у меня нет возможности проверить его). Поскольку фактического значения не существует, я предполагаю, что он заполняет его чем-то вроде "null", который, разумеется, не является тем, что вы намеревались произойти, когда вы создали массив.

В конце концов, на самом деле, не имеет значения, что является "правильным", поскольку реальность такова, что либо вы нацеливаете только один браузер, и в этом случае вы можете игнорировать то, что делают другие, или вы нацеливаете несколько браузеров, в этом случае ваш код должен работать на всех них. В этом случае очевидное решение состоит в том, чтобы никогда не включать висячую запятую в инициализаторе массива.

Если у вас есть проблемы, чтобы избежать этого (например, по какой-то причине вы разработали (плохую, имхо) привычку включать его) и другие проблемы, подобные этому, тогда что-то вроде JSLint может помочь.

Ответ 2

Я был заинтригован, поэтому я нашел это в определении ECMAScript 262 ed. 3, который является основой JavaScript 1.8. Соответствующее определение содержится в разделе 11.1.4 и, к сожалению, не совсем ясно. В разделе явно указано, что elisions (= omissions) в начале или в середине не определяют элемент, но вносят вклад в общую длину.

В конце инициализатора нет явных утверждений о резервных запятых, но из-за отсутствия я делаю вывод, что приведенное выше утверждение подразумевает, что они не вносят вклад в общую длину, поэтому я заключаю, что MSIE ошибочен.

Соответствующий пункт гласит следующее:

Элементы массива могут быть удалены в начале, середине или конце списка элементов. Всякий раз, когда запятая в списке элементов не предшествует выражению присваивания (т.е. Запятой в начале или после другой запятой), отсутствующий элемент массива вносит вклад в длину массива и увеличивает индекс последующих элементов. Элементы массива элементов не определены.

Ответ 3

"3" для этих случаев, я обычно помещаю в свои скрипты

if(!arrayList[arrayList.length -1]) arrayList.pop();

Вы можете сделать из него служебную функцию.

Ответ 4

Прежде всего, Konrad имеет право указывать спецификацию, так как это определяет язык и отвечает на ваш первый вопрос.

Чтобы ответить на другие вопросы:

Есть ли какие-либо другие подобные особенности JavaScript-браузера, о которых я должен опасаться?

О, слишком много, чтобы перечислить здесь! Попробуйте веб-сайт QuirksMode, чтобы найти все, что известно.

Как избежать таких ошибок?

Лучше всего использовать библиотеку, которая абстрагирует эти проблемы для вас, чтобы вы могли получить вплоть до беспокойства по поводу логики приложения. Хотя я немного эзотеричен, я предпочитаю и рекомендую MochiKit.

Ответ 5

Какой из них правильный?

Opera также возвращает 5. Это означает, что IE превосходит численностью и мажоритарными правилами, насколько вы ожидаете.

Ответ 6

Ecma 262 edition 5.1 раздел 11.1.4 инициализатор массива утверждает, что запятая в конце, если массив не вносит вклад в длину, если массив. "если элемент закрыт в конце массива, он не вносит вклад в длину массива"

Это означает, что [ "x",] является совершенно законным javascript и должен возвращать массив длиной 1

Ответ 7

@John: значение arrayList [5] выглядит как "undefined".

Да, в объявлениях никогда не должно быть болтающей запятой. На самом деле, я просто прошел через длинный длинный javascript-код, который каким-то образом не работал корректно в разных браузерах. Оказалось, что висячая запятая была виновником, который случайно набрался!:)