Элементы заказывают в “для (… в …)” цикл

196
задан kiamlaluno 17 September 2011 в 19:35
поделиться

5 ответов

Заключение в кавычки John Resig :

В настоящее время весь главный цикл браузеров по свойствам объекта в порядке, в котором они были определены. Chrome делает это также, за исключением пары случаев. [...] Это поведение явно оставляет неопределенным спецификация ECMAScript. В ECMA-262 разделите 12.6.4:

механика перечисления свойств... является зависящей от реализации.

Однако спецификация очень отличается от реализации. Все современные реализации ECMAScript выполняют итерации через свойства объектов в порядке, в котором они были определены. Из-за этого команда Chrome считала это, чтобы быть ошибкой и будет фиксировать ее.

Все браузеры уважают порядок определения за исключением Chrome и Opera, которые делают для каждого нечислового имени свойства. В этих двух браузерах вытягивают свойства, чтобы перед первым нечисловым свойством (это, имеет отношение, как они реализуют массивы). Порядок является тем же для Object.keys также.

Этот пример должен прояснить, что происходит:

var obj = {
  "first":"first",
  "2":"2",
  "34":"34",
  "1":"1",
  "second":"second"
};
for (var i in obj) { console.log(i); };
// Order listed:
// "1"
// "2"
// "34"
// "first"
// "second"

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

Короче говоря: Использование массив, если порядок важен для Вас.

206
ответ дан Borgar 23 November 2019 в 05:19
поделиться

От Спецификация языка ECMAScript, разделите 12.6.4 (на for .. in цикл):

механика перечисления свойств является зависящей от реализации. Порядок перечисления определяется объектом.

И раздел 4.3.3 (определение "Object"):

Это - незаказанный набор свойств, каждое из которых содержит примитивное значение, объект или функцию. Функция, сохраненная в свойстве объекта, вызвана метод.

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

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

26
ответ дан Tomalak 23 November 2019 в 05:19
поделиться

Элементы объекта, который для/в перечисляет, являются свойствами, которым не установили флаг DontEnum. ECMAScript, иначе JavaScript, в стандарте явно говорится, что "Объект является незаказанным набором свойств" (см. раздел http://www.mozilla.org/js/language/E262-3.pdf 8.6).

Это не будет совместимыми стандартами (т.е. безопасный), чтобы предположить, что все реализации JavaScript перечислят в порядке объявления.

10
ответ дан Adam Wright 23 November 2019 в 05:19
поделиться

в IE6 не гарантируется порядок.

3
ответ дан 23 November 2019 в 05:19
поделиться

Заказу нельзя доверять. И Opera, и Chrome возвращают неупорядоченный список свойств.

<script type="text/javascript">
var username = {"14719":"A","648":"B","15185":"C"};

for (var i in username) {
  window.alert(i + ' => ' + username[i]);
}
</script>

В приведенном выше коде показаны B, A, C в Opera и C, A, B в Chrome.

2
ответ дан 23 November 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: