Мне нужно перебрать объект JavaScript, рассматривая его как массив с пользовательскими ключами. Я знаю, что это не полностью поддерживается, поскольку свойства не имеют собственного порядка, но так как я всегда изменяю порядок свойств, я нашел этот подход простым и надежным ... до сих пор.
Проблема возникает, когда ключи представляют собой числа или строки, которые могут быть преобразованы в числа.
Когда я запускаю этот код:
var test1 = {4294966222:"A",4294966333:"A",4294966111:"A"};
var test2 = {4294968222:"A",4294968333:"A",4294968111:"A"};
for (var k in test1) {console.log(k);}
console.log("---");
for (var k in test2) {console.log(k);}
выход:
4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
Что значит:
- (test1), если ключи меньше 2 ^ 32 (4 294 967 296), они автоматически переупорядочиваются, самые маленькие сначала
- (test2) если ключи выше 2 ^ 32, они НЕ переупорядочиваются.
Вопрос в том, почему это происходит?
Поскольку все протестированные мной браузеры (Google Chrome 79.0, Mozilla Firefox 71.0, Microsoft Edge 44.18362, Internet Explorer 11.535) согласны с этим выводом, должна быть какая-то официальная спецификация.
Обновить
Я проверил много цифр, прежде чем выяснил, что это пороговый уровень. Мне показалось странным, что последовательность 2,3,1 ведет себя не так, как три метки времени, упорядоченные одинаково.
test1и test2. Я думаю, что «проблема» связана с ключевым кешированием в реализации спецификации V8.
4294968333и 4294968111больше, чем 2 ** 32(что есть 4294967296). Таким образом, они не являются указателями на массивы, поэтому они повторяются в порядке создания свойств, а не в порядке возрастания чисел, что, как и ожидалось, является именно тем, что они делают в скрипте. (см. мой ответ)
