사용자 정의 키가있는 배열로 취급하는 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이 동일한 방식으로 정렬 된 3 개의 타임 스탬프와 다르게 동작한다는 것이 이상했습니다.
test1와 test2. "문제"는 스펙의 V8 구현에서 핵심 캐싱에서 비롯된 것으로 생각합니다.
4294968333그리고 4294968111보다 큰 2 ** 32(이다 4294967296). 따라서 배열 인덱스는 아니므로 숫자 순서가 오름차순이 아니라 속성 생성 순서로 반복됩니다. 이는 정확히 바이올린에서 수행하는 것과 같습니다. (내 답변 참조)
