У меня есть этот тест:
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 упорядочены последними в их первоначальном относительном порядке.
Что мне не хватает? Эти реализации нарушают спецификации?