Гарантирует ли JavaScript порядок свойств объекта?

Гарантирует ли JavaScript порядок свойств объекта?

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

  • Object.keys , Object.values , Object.entries
  • for..in петлях
  • JSON.stringify

Но вскоре (возможно, в ES2021) порядок свойств для этих методов будет гарантирован итерацией итерацией таким же детерминированным образом, как и другие, благодаря предложению этапа 3 : Порядок перечисления «в» .

Как и в случае методов, имеющих гарантированный порядок итераций (например, Reflect.ownKeys и Object.getOwnPropertyNames ), ранее неуказанные методы также будут выполнять итерацию в следующем порядке:

  • Ключи числового массива в порядке возрастания номеров
  • Все остальные не символьные ключи, в порядке вставки
  • Символьные клавиши, в порядке вставки

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

Хотя текущая спецификация оставляет для… в итерационном порядке « почти полностью неопределенные , реальные движки имеют тенденцию быть более последовательными:»

Отсутствие специфичности в ECMA-262 не отражает реальность. В ходе дискуссий, проводившихся годами, разработчики заметили, что существуют некоторые ограничения на поведение for-in, которым должен следовать любой, кто хочет запускать код в сети.

Поскольку каждая реализация уже предсказуемо перебирает свойства, ее можно поместить в спецификацию, не нарушая обратной совместимости.


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

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

Ни у объекта, ни у чего-либо в его цепочке прототипов нет изменений прототипа во время итерации.

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

Ничто в цепочке прототипов объекта не имеет свойства, добавленного во время итерации.

Ни одно свойство объекта или чего-либо в его цепочке прототипов не может изменить свою перечислимость во время итерации.

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

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