Tôi cần lặp qua một đối tượng JavaScript coi nó như một mảng với các khóa tùy chỉnh. Tôi biết điều này không được hỗ trợ đầy đủ, vì các thuộc tính không có thứ tự đầu ra, nhưng vì tôi luôn sắp xếp lại các thuộc tính, tôi thấy cách tiếp cận này đơn giản và đáng tin cậy ... cho đến bây giờ.
Sự cố xảy ra khi các khóa là số hoặc chuỗi có thể được đúc thành số.
Khi tôi chạy mã này:
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);}
đầu ra là:
4294966111
4294966222
4294966333
---
4294968222
4294968333
4294968111
Nghĩa là:
- (test1) nếu các khóa dưới 2 ^ 32 (4.294.967.296), chúng sẽ tự động được sắp xếp lại, nhỏ nhất trước
- (test2) nếu các khóa trên 2 ^ 32, chúng KHÔNG được sắp xếp lại.
Câu hỏi là: tại sao điều này xảy ra?
Vì tất cả các trình duyệt tôi đã kiểm tra (Google Chrome 79.0, Mozilla Firefox 71.0, Microsoft Edge 44.18362, Internet Explorer 11.535) đồng ý về đầu ra này, nên phải có một số thông số kỹ thuật chính thức.
Cập nhật
Tôi đã thử nghiệm rất nhiều con số trước khi phát hiện ra đó là một vấn đề ngưỡng. Tôi thấy kỳ lạ là chuỗi 2,3,1 hoạt động khác với ba dấu thời gian được sắp xếp theo cùng một cách.
test1và test2. Tôi nghĩ rằng "vấn đề" là từ bộ nhớ đệm chính trong việc triển khai V8 của thông số kỹ thuật.
4294968333và 4294968111lớn hơn 2 ** 32(đó là 4294967296). Vì vậy, chúng không phải là chỉ số mảng, vì vậy chúng được lặp đi lặp lại theo thứ tự tạo tài sản, thay vì theo thứ tự số tăng dần - đó chính xác là những gì chúng đang làm trong câu đố, như mong đợi. (xem câu trả lời của tôi)
