Цикл «for… in» в Javascript проходит через хеш-таблицы / элементы в порядке их объявления? Есть ли браузер, который не делает это по порядку?
Объект, который я хочу использовать, будет объявлен один раз и никогда не будет изменен.
Предположим, у меня есть:
var myObject = { A: "Hello", B: "World" };
И я в дальнейшем использую их в:
for (var item in myObject) alert(item + " : " + myObject[item]);
Можно ли ожидать, что «A:« Hello »» всегда будет стоять перед «B:« World »» в большинстве приличных браузеров?
javascript
for-loop
chakrit
источник
источник
Ответы:
Цитирую Джона Резига :
Все браузеры соблюдают порядок определения, за исключением Chrome и Opera, которые соответствуют каждому нечисловому имени свойства. В этих двух браузерах свойства располагаются по порядку впереди первого нечислового свойства (это связано с тем, как они реализуют массивы). Порядок такой же,
Object.keys
как и для.Этот пример должен прояснить, что происходит:
Технические детали этого менее важны, чем тот факт, что это может измениться в любое время. Не полагайтесь на вещи, оставаясь такими.
Вкратце: используйте массив, если порядок важен для вас.
источник
Натыкаясь на это год спустя ...
Это 2012 год, и основные браузеры все еще различаются:
Суть или тест в текущем браузере
Safari 5, Firefox 14
Chrome 21, Opera 12, Node 0.6, Firefox 27
IE9
источник
delete
интересно, потому что, по крайней мере в V8, оно мгновенно вызывает резервное копирование объекта с помощью хеш-таблицы. Однако хеш-таблица в V8 хранится в порядке вставки. Самый интересный результат здесь - это IE, мне интересно, какое уродство они делают, чтобы осуществить это ...Из спецификации языка ECMAScript , раздел 12.6.4 (в
for .. in
цикле):И раздел 4.3.3 (определение «Объект»):
Я предполагаю, что это означает, что вы не можете полагаться на свойства, перечисляемые в согласованном порядке в реализациях JavaScript. (В любом случае было бы плохим стилем полагаться на специфические для реализации детали языка.)
Если вы хотите, чтобы ваш порядок был определен, вам нужно реализовать что-то, что его определяет, например, массив ключей, которые вы сортируете перед доступом к объекту с ним.
источник
Элементы объекта, которые для / in перечисляют, являются свойствами, для которых не установлен флаг DontEnum. Стандарт ECMAScript, также известный как Javascript, прямо говорит, что «Объект - это неупорядоченный набор свойств» (см. Http://www.mozilla.org/js/language/E262-3.pdf раздел 8.6).
Это не будет соответствовать стандартам (то есть безопасно) предполагать, что все реализации Javascript будут перечисляться в порядке объявления.
источник
Порядок итерации также путают в отношении удаления свойств, но в этом случае только с IE.
Желание изменить спецификацию, чтобы исправить порядок итераций, кажется довольно популярным среди разработчиков, если обсуждение на http://code.google.com/p/v8/issues/detail?id=164 является каким-либо указанием.
источник
в IE6 порядок не гарантируется.
источник
Заказу нельзя доверять. Opera и Chrome возвращают список неупорядоченных свойств.
Код выше показывает B, A, C в Opera и C, A, B в Chrome.
источник
Это не отвечает на вопрос как таковой, но предлагает решение основной проблемы.
Предполагая, что вы не можете полагаться на порядок сохранения, почему бы не использовать массив объектов с ключом и значением в качестве свойства?
Теперь вам нужно убедиться, что ключи уникальны (при условии, что это также важно для вас. Кроме того, прямая адресация изменений, а for (... in ...) теперь возвращает индексы как «ключи».
См. Перо для (... in ...) адресации в порядке JDQ ( @JDQ ) на CodePen .источник