Javascript Browser Quirks - array.Length - PullRequest
       40

Javascript Browser Quirks - array.Length

27 голосов
/ 27 августа 2008

Код:

<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>

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

Safari: 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 и Konrad Rudolph за их входные данные.

Ответы [ 7 ]

9 голосов
/ 27 августа 2008

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

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

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

7 голосов
/ 27 августа 2008

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

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

Соответствующий абзац гласит:

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

3 голосов
/ 27 августа 2008

«3» для этих случаев я обычно вставляю в свои сценарии

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

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

2 голосов
/ 27 августа 2008

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

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

Существуют ли какие-либо другие причуды браузера Javascript, к которым я должен быть осторожен?

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

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

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

1 голос
/ 01 апреля 2012

Ecma 262 edition 5.1 section 11.1.4 Инициализатор массива заявляет, что запятая в конце, если массив, не влияет на длину, если массив. «если элемент удаляется в конце массива, он не влияет на длину массива»

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

.
1 голос
/ 27 августа 2008

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

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

0 голосов
/ 27 августа 2008

@ John : значение arrayList [5] оказывается неопределенным.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...