Есть ли у массивов и объектов javascript установленный порядок? - PullRequest
5 голосов
/ 11 июня 2011

Этот вопрос жизненно важен для одного из моих текущих проектов, связанных с созданием таблиц HTML из объектов JSON.Я думал, что смогу создать функции, которые будут сортировать мои массивы / объекты, прежде чем отображать их как HTML.Меня беспокоит только то, что порядок не имеет значения в JavaScript, и если бы я создал новый Array с теми же данными (в другом порядке), что и другие Array, они бы в конечном итоге были идентичны.

Я не могу придумать быстрый способ проверить это, поэтому я спрашиваю здесь.

Ответы [ 5 ]

9 голосов
/ 11 июня 2011

Другие ответили на вопросы о массивах, поэтому я просто хотел предоставить некоторую информацию об объектах.

При этом стандарт не существует, но de facto определяет, что объект будет перечисляться в порядке вставки, за исключением того, что числа располагаются в порядке возрастания и перечисляются первыми. Обычно я говорю, но это поведение далеко не стандартизировано (и фреймворки, такие как jQuery, не стандартизируют его, AFAIK).

Вы можете протестировать браузеры с помощью этого jsFiddle:

http://jsfiddle.net/7cCpu/4/

Объект {"foo":"bar", "bar":"foo", "baz":"baz", "3":3, "2":2, "1":1} перечисляет следующим образом:

foo, bar, baz, 3, 2, 1 // insertion order

1, 2, 3, foo, bar, baz // Chrome enumeration
1, 2, 3, foo, bar, baz // Opera
1, 2, 3, foo, bar, baz // IE9
foo, bar, baz, 3, 2, 1 // Firefox (!!!)

У меня не установлен Safari, но я предполагаю, что это то же самое, что и Chrome. В любом случае, дело в том, что вы можете делать предположения - это не случайно - но, вероятно, лучше использовать массив, если вы зависите от точного перечисления.

Еще неприятнее - это то, что Дури указал выше, где удаление и замена значения для ключа изменяет ситуацию дальше. Посмотрите, что происходит, когда я delete bar и делаю Object.bar = "foo", а затем перечисляю:

1, 2, 3, foo, baz, bar // Chrome enumeration
1, 2, 3, foo, baz, bar // Opera
1, 2, 3, foo, bar, baz // IE9 (!!!)
foo, baz, 3, 2, 1, bar // Firefox (!!!)
5 голосов
/ 11 июня 2011

Массивы нумеруются по (числовому) индексу.

Объекты не определены - порядок не определен, действительно, в стандарте Javascript указано, что порядок равен undefined .Подробнее см. Гарантирует ли JavaScript порядок свойств объекта?

2 голосов
/ 11 июня 2011

Хороший пример, когда порядок свойств объектов различается, это код:

var o = { foo: 1, bar: 2, baz: 3 };
delete o.bar;
o.bar = 2;
for (var i in o)    {
    document.write(o[i]);
}

Это отображает 132 в Firefox, но 123 в Internet Explorer.

1 голос
/ 11 июня 2011

Я бы никогда не стал полагаться на свойства объекта, отображаемые в каком-либо конкретном или даже последовательном порядке при итерации с циклом "for ... in". Это просто хрупкий способ собрать программу, особенно когда так просто явно навязать свой собственный порядок.

При переборе массивов, вы не должны использовать «для ... в» петле в любом случае, так что точка является спорной; очевидно, если вы выполните итерацию правильно с числовым индексом, вы пройдете свойства в последовательном повторяемом порядке.

Если вы сериализуете массив в представление JSON, должно быть что-то для каждого индексированного свойства от позиции 0 до длины массива. Это означает, что разреженный массив длиной 1000000 проблематичен по размеру, но выполним.

0 голосов
/ 11 июня 2011

Перечисления над массивами упорядочены по индексу.Если вы перечислите (for in) или for цикл по массиву, он будет упорядочен.

Поэтому, если вы создадите два массива с элементами в разных порядках, они не будут идентичны.

Перечисления по объектам упорядочены на основе того, что чувствует браузер.

Я считаю, что некоторые идут в алфавитном порядке, некоторые ставят числа в начале, некоторые в конце.

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