Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
900
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
952
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
942
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1727
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6088
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4400
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Javascript Причуды Браузера - 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>
Обратите внимание на лишнюю запятую в объявлении массива. Приведенный выше код дает различные выходные данные для различных браузеров:
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, Джону и Конраду Рудольфам за их вклад.
Мне кажется, что поведение Firefox является правильным. Каково значение 6-го значения в IE (извините, у меня нет его под рукой для тестирования). Поскольку нет никакого фактического значения, я полагаю, что он заполняет его чем-то вроде 'null', что, конечно, не похоже на то, что вы намеревались сделать, когда создавали массив.
В конце концов, на самом деле не имеет значения, какой из них "correct", поскольку реальность такова, что либо вы ориентируетесь только на один браузер, и в этом случае вы можете игнорировать то, что делают другие, либо вы ориентируетесь на несколько браузеров, и в этом случае ваш код должен работать на всех них. В этом случае очевидное решение-никогда не включать висячую запятую в инициализатор массива.
Если у вас есть проблемы с его избеганием (например, по какой-то причине у вас развилась (плохая, имхо) привычка включать его) и другие подобные проблемы, тогда что-то вроде JSLint может помочь.
Я был заинтригован, поэтому посмотрел его в определении ECMAScript 262 ed. 3 которая является основой JavaScript 1.8. Соответствующее определение содержится в разделе 11.1.4 и, к сожалению, не очень ясно. В разделе явно указано, что Элиссы (= пропуски) в начале или в середине не определяют элемент, но вносят свой вклад в общую длину .
Нет никаких явных утверждений о избыточных запятых в конце инициализатора, но по пропуску я заключаю, что приведенное выше утверждение подразумевает, что они не способствуют общей длине, поэтому я заключаю, что MSIE является неправильным .
Соответствующий пункт гласит следующее:
Элементы массива могут быть выделены в начале, середине или конце списка элементов. Всякий раз, когда запятая в списке элементов не предшествует выражению присваивания (т. е. запятая в начале или после другой запятой), отсутствующий элемент массива вносит свой вклад в длину массива и увеличивает индекс последующих элементов. Игнорируемые элементы массива не определены.
Во-первых, Конрад прав, цитируя спецификацию, поскольку именно она определяет язык и отвечает на ваш первый вопрос.
Чтобы ответить на другие ваши вопросы:
Есть ли еще какие-нибудь подобные Javascript браузерные причуды, которых я должен опасаться?
О, слишком много, чтобы перечислить здесь! Попробуйте сайт QuirksMode для хорошего места, чтобы найти почти все известное.
Как мне избежать подобных ошибок?
Лучший способ-это использовать библиотеку , которая абстрагирует эти проблемы для вас, чтобы вы могли начать беспокоиться о логике приложения. Хотя это немного эзотерично, я предпочитаю и рекомендую MochiKit .
@John: значение arrayList[5] будет равно 'undefined'.
Да, в декларациях никогда не должно быть болтающейся запятой. На самом деле, я просто просматривал чей-то длинный длинный код javascript, который почему-то не работал правильно в разных браузерах. Оказалось, что болтающаяся запятая была виновницей того, что ее случайно напечатали! :)