Мені потрібно провести цикл через об’єкт 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
Що означає:
- (тест1), якщо ключі нижче 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). Таким чином, вони не мають масивів показників, тому вони повторюються в порядку створення властивостей, а не в порядку зростання чисел - саме це і роблять у скрипці, як і очікувалося. (див. мою відповідь)
