Вводит ли ES6 четко определенный порядок перечисления для свойств объекта?

Вводит ли ES6 четко определенный порядок перечисления свойств объекта?

Для for-in , Object.keys и JSON.stringify : Нет.

Для некоторых других операций: да , обычно.

Хотя ES6 / ES2015 добавляет порядок свойств, для него не требуется, чтобы for-in , Object.keys или JSON.stringify следовали этому порядку из-за устаревших проблем совместимости.

Циклы for-in выполняются в соответствии с [[Enumerate]] , который [определяется как (выделено мной):

Когда вызывается внутренний метод [[Enumerate]] для O, предпринимаются следующие шаги:

Вернуть объект Iterator ( 25.1.1.2 ), чей следующий метод выполняет итерацию по всем строковым ключам перечислимых свойств O. Объект Iterator должен наследоваться от% IteratorPrototype% ( 25.1.2 ). Механика и порядок перечисления свойств не указаны, но должны соответствовать правилам, указанным ниже [1] .

ES7 / ES2016 удаляет внутренний метод [[Enumerate]] и вместо этого использует абстрактную операцию EnumerateObjectProperties , но, как и [[Enumerate]], он не определяет порядок.

А также посмотрите эту цитату из Object.keys :

Если реализация определяет конкретный порядок перечисления для оператора for-in, […]

Это означает, что реализации НЕ требуются для определения определенного порядка перечисления . Это было подтверждено Алленом Вирфсом-Броком, редактором проекта спецификации языка ECMAScript 2015, в сообщении, сделанном после завершения спецификации.

Другие операции, такие как Object.getOwnPropertyNames , Object.getOwnPropertySymbols , Object.defineProperties и Reflect.ownKeys , следуют следующему порядку для обычных объектов:

  1. Целочисленные индексы (если применимо) в порядке возрастания.
  2. Другие строковые ключи (если применимо) в порядке создания свойств.
  3. Символьные ключи (если применимо) в порядке создания свойств.

Это поведение определено во внутреннем методе [[OwnPropertyKeys]] . Но некоторые экзотические объекты определяют этот внутренний метод немного по-другому. Например, ловушка ownKeys ‘s ownKeys может возвращать массив в любом порядке:

 console.log(Reflect.ownKeys(new Proxy({}, { ownKeys: () ={amp}gt; ['3','1','2'] }))); // ['3','1','2'], the integer indices are not sorted! 

[1] Ниже написано:

[[Enumerate]] должен получить собственные ключи свойств целевого объекта, как если бы он вызывал его внутренний метод [[OwnPropertyKeys]].

И порядок [[OwnPropertyKeys]] четко определен. Но не позволяйте этому сбить вас с толку: это «как будто» означает только «те же свойства», а не «тот же порядок».

Это можно увидеть в EnumerableOwnNames , который использует [[OwnPropertyKeys]] для получения свойств, а затем упорядочивает их

в том же относительном порядке, который будет создан итератором, который будет возвращен, если был вызван внутренний метод [[Enumerate]]

Если бы [[Enumerate]] требовалось выполнять итерацию в том же порядке, что и [[OwnPropertyKeys]], не было бы необходимости переупорядочивать.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector