Özel anahtarlar ile bir dizi olarak davranan bir JavaScript nesnesi ile döngü gerekir. Bunun tam olarak desteklenmediğini biliyorum, çünkü özelliklerin içsel bir düzeni yoktur, ancak özellikleri her zaman yeniden sıraladığım için, bu yaklaşımı basit ve güvenilir buldum ... şimdiye kadar.
Anahtarlar sayı veya sayı olarak dökülebilecek dizeler olduğunda sorun oluşur.
Bu kodu çalıştırdığımda:
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);}
çıktı:
4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
Bunun anlamı:
- (test1) anahtarlar 2 ^ 32'nin (4,294,967,296) altındaysa, otomatik olarak yeniden sıralanırlar, en küçüğü
- (test2) anahtarlar 2 ^ 32'nin üzerindeyse, yeniden sıralanmazlar.
Soru şudur: bu neden oluyor?
Test ettiğim tüm tarayıcılar (Google Chrome 79.0, Mozilla Firefox 71.0, Microsoft Edge 44.18362, Internet Explorer 11.535) bu çıktıyı kabul ettiğinden, bazı resmi özellikler olmalıdır.
Güncelleme
Bir eşik sorunu olduğunu anlamadan önce birçok sayıyı test ettim. 2,3,1 dizisinin aynı şekilde sıralanan üç zaman damgasından farklı davrandığı garip buldum.
test1ve görebilirsiniz test2. "Sorun" spec V8 uygulamasında anahtar önbellekleme olduğunu düşünüyorum.
4294968333ve 4294968111daha büyük 2 ** 32(ki 4294967296). Yani, dizi göstergeleri değiller, bu yüzden sayısal düzende değil, özellik oluşturma düzeninde yineleniyorlar - beklendiği gibi kemanda tam olarak yaptıkları şey bu. (Cevabımı gör)
