Ответ 1
Для for-in
, Object.keys
и JSON.stringify
: Нет.
Для некоторых других операций: Да, обычно.
Хотя ES6/ES2015 добавляет порядок свойств, для него не требуется, чтобы for-in
, Object.keys
или JSON.stringify
следовали этому порядку из-за устаревших проблем совместимости.
for-in
цикл повторяется в соответствии с [[Enumerate]], который [определяется как (выделено мной):
Когда внутренний метод [[Enumerate]] для O вызывается следующим шаги предприняты:
Вернуть объект Iterator (25.1.1.2), следующий метод которого повторяется над всеми строковыми ключами перечислимых свойств О. Объект Iterator должен наследоваться от% IteratorPrototype% (25.1.2). Механика и порядок перечисления свойств не указано, но должно соответствовать правилам, указанным ниже [1].
ES7/ES2016 удаляет внутренний метод [[Enumerate]] и вместо этого использует абстрактную операцию EnumerateObjectProperties, но точно так же, как [[Enumerate]], не задает никакой порядок.
А также посмотрите цитату из Object.keys
:
Если реализация определяет конкретный порядок перечисления для выражение о вступлении в силу, [...]
Это означает, что реализации НЕ обязаны определять конкретный порядок перечисления. Это было подтверждено Алленом Вирфсом-Броком, редактором проекта спецификации языка ECMAScript 2015, в сообщении, сделанном после завершения спецификации.
Другие операции, такие как Object.getOwnPropertyNames
, Object.getOwnPropertySymbols
, Object.defineProperties
и Reflect.ownKeys
, выполняются в следующем порядке для обычные объекты:
- Целочисленные индексы (если применимо) в порядке возрастания.
- Другие строковые ключи (если применимо) в порядке создания свойств.
- Символьные ключи (если применимо) в порядке создания свойств.
Это поведение определено во внутреннем методе [[OwnPropertyKeys]]. Но некоторые экзотические объекты определяют этот внутренний метод немного по-другому. Например, ловушка Proxy ownKeys
может возвращать массив в любом порядке:
console.log(Reflect.ownKeys(new Proxy({}, {
ownKeys: () => ['3','1','2']
}))); // ['3','1','2'], the integer indices are not sorted!