Tôi nhận thấy rằng một số mã đánh giá một số kích thước giày cho trang web thương mại điện tử và xuất chúng trên màn hình đang làm rối trật tự trong Chrome.Chrome sắp đặt lại khóa đối tượng nếu số, bình thường/mong đợi
JSON được có thể là:
{
"7": ["9149", "9139", "10455", "17208"],
"7.5": ["9140", "9150", "10456", "17209"],
"8": ["2684", "9141", "10457", "17210"],
"8.5": ["9142", "10444", "10458", "17211"],
"9": ["2685", "9143", "10459", "17212"],
"9.5": ["10443", "9144", "10460", "17213"]
}
... có nghĩa là tăng kích thước trong nửa.
Sau khi chuyển đổi thành một đối tượng và lặp lại mặc dù các phím, trật tự tự nhiên đã được tôn trọng và họ đi ra như:
7, 7.5, 8, 8.5, vv
Nhưng trong Chrome chỉ, phím mà 'look' như số vòng LUÔN đi ra khỏi đối tượng đầu tiên, vì vậy sản phẩm của một cho ... trong vòng lặp là:
7, 8, 9, 7. 5, 8,5, 9,5 ...
Object.keys(sizes); // ["7", "8", "9", "7.5", "8.5", "9.5"]
Đây là trường hợp thử nghiệm: https://jsfiddle.net/wcapc46L/1/
Nó chỉ ảnh hưởng đến toàn bộ số, có vẻ như Webkit/Blink có một tối ưu hóa mà thích thuộc tính đối tượng được số, có thể nó là để làm với Dự đoán chi nhánh hoặc bất cứ điều gì.
Nếu bạn có tiền tố chìa khóa đối tượng với bất kỳ ký tự, trật tự vẫn không bị ảnh hưởng và làm việc như dự định - FIFO
Tôi nghĩ rằng tôi nhớ đọc mà không có bảo đảm về trình tự của các thuộc tính của một đối tượng nhưng đồng thời gian, điều này gây phiền toái cho sự khắc nghiệt và sẽ gây ra một lượng đáng kể nỗ lực trong việc sửa chữa nó cho người dùng chrome một mình.
Bất kỳ ý tưởng nào? đây có phải là lỗi có thể được khắc phục không?
chỉnh sửa thêm vào đó, bây giờ tôi đã phát hiện ra đây là một vấn đề trên tracker v8 lỗi:
http://code.google.com/p/v8/issues/detail?id=164
Hình như Blink không muốn để sửa lỗi này và sẽ vẫn là trình duyệt duy nhất mà sẽ làm đi.
cập nhật bất cứ băm bảng tối ưu hóa webkit/chớp đã có, hiện đã làm theo cách của mình vào con tắc kè (FF 27.0.1) - http://jsfiddle.net/9Htmq/ kết quả trong
7,8,9,7.5,8.5,9.5
. áp dụng_
trước khi các phím trả về đúng thứ tự/thứ tự dự kiến.cập nhật 2017 dân vẫn upvoting và chỉnh sửa này để - Nó không có vẻ ảnh hưởng
Map
/WeakMap
,Set
vv (như chứng minh bằng cách cập nhật ví dụ chính)
+1 cho trường hợp thử nghiệm. – spender
Tôi nghĩ bạn cần phải sắp xếp lại phương pháp lập kế hoạch ở đây. Nếu bạn * có * đọc rằng thứ tự là không xác định, tại sao bạn phàn nàn về việc phải sửa rất nhiều mã khi bạn phát hiện ra rằng * ngạc nhiên bất ngờ *, nó là không xác định? Đây không phải là một lỗi sẽ được sửa chữa, khác để nói rằng lỗi là trong mã của bạn, bạn dựa vào chi tiết thực hiện, không phải trên hành vi tài liệu. Sửa mã của bạn. –
tại thời điểm phát triển, chrome không ở đâu gần và hiện tại chiếm tới 7% người dùng trang web. cho đến khi chrome xuất hiện, nó hoạt động như dự định trong tất cả các trình duyệt, bao gồm safari - vì vậy nó không phải là vấn đề về webkit.và có, tôi hiểu rằng nó có thể cần tái cấu trúc nhưng đã được hy vọng của một giải pháp dễ dàng hơn (hoặc rằng chrome sẽ thực sự được sửa chữa này giống như tất cả mọi người khác). cho bây giờ, tôi có thể phải tiền tố tất cả các thuộc tính đối tượng với __ hoặc một cái gì đó để buộc tự nhiên định nghĩa. –