Ответ 1
(Отказ от ответственности: я не говорю от лица Facebook, это мое собственное мнение)
Возможно, вы пропустили эту заметку (которая может быть немного более преобладающей):
Отметим также, что мы полагаемся на механизм JavaScript, который сохраняет порядок перечисления объектов здесь, что не гарантируется спецификацией, но реализуется всеми основными браузерами и виртуальными машинами для объектов с нечисловыми ключами.
Однако, предстоящая версия ECMAScript (ES6/ES2015) фактически формализует поведение итерации (если я правильно понимаю спецификацию).
В спецификации он сказал о объекте внутреннего метода [[Enumerate]]
:
[[Enumerate]] должен получить собственные ключи свойств целевого объекта, как если бы он вызвал внутренний метод [[OwnPropertyKeys]].
И [[OwnPropertyKeys]]
определяется как
Когда вызывается внутренний метод O [[OwnPropertyKeys]], выполняются следующие шаги:
- Пусть ключи представляют собой новый пустой список.
- Для каждого собственного ключа свойства P of O, который является целым индексом, в порядке возрастания числового индекса
- Добавить P как последний элемент ключей.
- Для каждого собственного ключа свойства P из O, который является строкой, но не является целым индексом, в порядке создания свойства
- Добавить P как последний элемент ключей.
- Для каждого собственного ключа свойства P of O, который является символом, в порядке создания свойства
- Добавить P как последний элемент ключей.
- Возвратные ключи.