Сведения о вопросе

Htmlщик

04:46, 14th August, 2020

Теги

javascript    

Javascript Причуды Браузера - array.Length

Просмотров: 375   Ответов: 7

Код:

<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, но я предполагаю, что есть расхождения.

Мой вопрос:

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

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

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

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

раздел III. Как избежать таких ошибок, как эти?

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

Спасибо DamienB , JasonBunting, Джону и Конраду Рудольфам за их вклад.



  Сведения об ответе

PAGE

18:04, 20th August, 2020

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

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

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


  Сведения об ответе

screen

19:10, 9th August, 2020

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

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

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

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


  Сведения об ответе

ASER

01:14, 3rd August, 2020

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

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

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


  Сведения об ответе

LAST

15:57, 4th August, 2020

Во-первых, Конрад прав, цитируя спецификацию, поскольку именно она определяет язык и отвечает на ваш первый вопрос.

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

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

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

Как мне избежать подобных ошибок?

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


  Сведения об ответе

lourence

16:48, 1st August, 2020

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

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


  Сведения об ответе

LAST

08:56, 15th August, 2020

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

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


  Сведения об ответе

repe

04:21, 12th August, 2020

@John: значение arrayList[5] будет равно 'undefined'.

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться