我需要遍历一个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的行为与以相同方式排序的三个时间戳不同。
test1和直接查看问题test2。我认为“问题”来自规范的V8实现中的关键缓存。
4294968333和4294968111大于2 ** 32(是4294967296)。因此,它们不是数组索引,因此按属性创建顺序(而不是按升序顺序)进行迭代-这恰如他们所期望的那样。(请参阅我的回答)
