Являются ли свойства объектов Javascript упорядоченными по порядку?

Скажем, у меня есть объект, который присваивает свойства, основанные на возвращаемом значении функции:

var i = 0;

var f = function() { return ++i; }

var foo = {
            a:f(),
            b:f(),
            c:f()
          };

Гарантировано ли, что foo.a будет 1, foo.b будет равно 2, а foo.c будет 3? Я знаю, что JS не гарантирует порядок, когда вы перебираете объект, а как насчет назначения?

Указано ли в спецификации JS? Я только прошу об образовании.

Спасибо.

Ответ 1

Стандарт ECMA-262 (5.1) - Раздел 11.1.5 - Инициализатор объектов

Производственный PropertyNameAndValueList: PropertyNameAndValueList, PropertyAssignment оценивается следующим образом:

1. Let obj be the result of evaluating PropertyNameAndValueList.
2. Let propId be the result of evaluating PropertyAssignment.
...
5. Call the [[DefineOwnProperty]] internal method of obj with arguments propId.name, propId.descriptor, and false.
6. Return obj.

Итак, да, порядок соблюдается стандартом.

Ответ 2

Из вики-страницы ECMAScript 6, которая определит новую версию JS:

Когда вводится область (Block, FunctionBody, Program, ModuleBody и т.д.), переменные, объявленные всеми немедленно содержащими объявления функций и классов, привязаны к их соответствующим функциям и классам. Затем все тела класса выполняются в текстовом порядке. Тело класса определяет и инициализирует свойства класса один раз, когда оценивается определение класса. Сюда входят свойства функции-конструктора (самого класса) и свойства его прототипа. Эти инициализации выполняются в текстовом порядке.

Ваш источник пришел! Свойства объекта JavaScript инициализируются в текстовом порядке на объектах. Массивы не всегда (в настоящее время) всегда следуют этому правилу.

Источник: http://wiki.ecmascript.org/doku.php?id=harmony:classes

Я отредактирую этот пост, когда найду ссылку в ECMAScript 5, хотя я уверен, что она есть.

Изменить: найдено

В ECMAScript 5 есть: http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.7.

Если реализация определяет определенный порядок перечисления для оператора for-in, тот же порядок перечисления должен использоваться для упорядочения элементов списка на шаге 3 этого алгоритма.

Это определяет вызовы DefineOwnProperty и, следовательно, положение свойств во внутренней таблице.

Ответ 3

Назначение всегда в порядке. Это всего лишь способ обнаружения, интерпретации и выполнения кода.

Ответ 4

Да, вам гарантировано, что a будет 1, b будет равно 2 и т.д. Каждый f() будет интерпретироваться в том порядке, в котором вы их написали.

Ответ 5

У меня нет официального источника для цитирования, но позвольте просто использовать немного здравого смысла.

Что делать, если назначение не было сделано по порядку? Вы никогда не узнаете, какое значение будет присвоено какому свойству, что делает структуру объекта бесполезной (по крайней мере, при использовании синтаксиса литерала объекта).

Не имеет значения, если это вызов функции, или примитивный литерал, или какое-то другое значение. Если бы это не было гарантировано, это просто не сработало.


После быстрого поиска термина left to right в ECMAScript 5, вот некоторые результаты, если это вам поможет:

7 Лексические условные обозначения

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

11.8.5 Алгоритм абстрактного реляционного сравнения

... Это необходимо, потому что ECMAScript указывает слева направо оценку выражений.

Приложение D (информативное) Исправления и разъяснения в 5-м выпуске с возможным 3-м выпуском Эффективность совместимости

ECMAScript обычно использует порядок оценки слева направо, однако язык спецификации версии 3 для операторов > и <= привел к частичному праву налево. Спецификация была исправлена ​​для этих операторов, так что теперь она указывает полный порядок оценки слева направо.