Object.keys порядок для больших числовых индексов? - PullRequest
2 голосов
/ 08 февраля 2020

У меня есть этот тест:

let obj = {
    "5555555555": 5,
    "4444444444": 4,
    "3333333333": 3,
    "2222222222": 2,
};
console.log(Object.keys(obj));

Выходные данные ["2222222222", "3333333333", "5555555555", "4444444444"]

Однако спецификация EcmaScript 2015 определяет порядок для [[OwnPropertyKeys]] :

Для каждого собственного ключа свойства P из O , который является целочисленным индексом, в порядке возрастания чисел c в порядке индекса,
a. Добавьте P в качестве последнего элемента ключей .

И целочисленный индекс равен и определен как :

Целочисленный индекс - это строковый ключ свойства, представляющий собой каноническую цифру c String, значение которого c равно либо +0, либо положительное целое число ≤ 2 53 -1. индекс массива - это целочисленный индекс, чье число c значение i находится в диапазоне +0 ≤ i <2 <sup>32 - 1.

Поскольку все четыре свойства в obj, во фрагменте выше, являются целочисленными индексами по определению, почему они не перечислены в числовом порядке, когда я вызываю Object.keys?

Я вижу этот же порядок в Chrome, Firefox, Edge, даже Inte rnet Explorer 11. Кажется, что они применяют "порядковый номер индекса c в порядке возрастания" для индексы массива , не (все) целочисленные индексы . Только это может объяснить, почему 1111111111 и 2222222222 упорядочены первыми и в числовом порядке (только два ключа <2 <sup>32 -1), а 4444444444 и 5555555555 упорядочены последними в их первоначальном относительном порядке.

Что мне не хватает? Эти реализации нарушают спецификации?

1 Ответ

2 голосов
/ 08 февраля 2020

Ни одна из основных реализаций никогда не соответствовала этой конкретной спецификации ES6. Но обратите внимание, что исключения были разрешены в EcmaScript 2015-2019 (см. this )

Что касается поведения, которое вы заметили, см., Например, отчет об ошибке V8 Проблема 7874: соблюдайте порядок OrdinaryOwnPropertyKeys .

Хотя спецификации EcmaScript 2016, 2017 и 2018 в этом отношении не изменились, было решено привести EcmaScript2019 в соответствие с реальностью. Раздел [[OwnPropertyKeys]] () теперь выглядит так:

Для каждого собственного ключа свойства P из O , который является индексом массива, в порядке возрастания нумерации c индекса выполните a. Добавьте P в качестве последнего элемента ключей .

Таким образом, ссылка на индекс массива , который имеет неизменный определение (+0 ≤ i <2 <sup>32 -1).

Это изменение произошло в запросе на извлечение Нормативный: Используйте индексы массива вместо целочисленных индексов в OrdinaryOwnPropertyKeys . Смотрите также комментарии и перекрестные ссылки там.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...