Станом на ES2015, замовлення власності гарантується для певних методів, які повторюють властивості. але не інші . На жаль, як правило, найчастіше застосовуються методи, на які не гарантується замовлення:
Object.keys
, Object.values
,Object.entries
for..in
петлі
JSON.stringify
Але, як і в ES2020, замовлення власності для цих раніше недовірливих методів буде гарантоване специфікацією, яку слід повторити таким же детермінованим чином, як і інші, завдяки готовій пропозиції: для механіки .
Як і у випадку з методами, які мають гарантований порядок ітерації (як Reflect.ownKeys
і Object.getOwnPropertyNames
), раніше не визначені методи також повторять у наступному порядку:
- Цифрові клавіші масиву у порядку числення у порядку зростання
- Усі інші клавіші без символів у порядку вставки
- Клавіші символів у порядку вставки
Це те, що майже кожна реалізація вже робить (і робиться протягом багатьох років), але нова пропозиція зробила це офіційним.
Незважаючи на те, що поточна специфікація залишає для ... в порядку ітерації " майже повністю не визначений , реальні двигуни мають тенденцію бути більш послідовними:"
Відсутність специфіки в ECMA-262 не відображає реальність. Обговорюючи роки, виконавці зауважили, що існують певні обмеження в поведінці for-in, за якими повинен дотримуватися кожен, хто хоче запустити код у мережі.
Оскільки кожна реалізація вже повторює властивості передбачувано, її можна помістити в специфікацію, не порушуючи зворотної сумісності.
Є кілька дивних випадків, щодо яких реалізація на даний момент не погоджується, і в таких випадках отримане замовлення буде надалі не визначено. Щоб замовлення майна було гарантоване :
Ні об'єкт, який повторюється, ні що-небудь в ланцюзі прототипу не є проксі-сервером, набраним масивом, об'єктом простору імен модулів або хостовим екзотичним об'єктом.
Ні об’єкт, ні що-небудь у ланцюзі прототипу не змінювалося для прототипу під час ітерації.
Ні об’єкт, ні щось у ланцюзі прототипу не має властивості, видаленої під час ітерації.
Ніщо в прототипі ланцюга об'єкта не має властивості, доданої під час ітерації.
Жодна властивість об'єкта чи нічого в ланцюзі прототипу не змінюється його перелічуваність під час ітерації.
Жодне нечислиме майно не затінює перелічене.