我注意到某些用于评估电子商务网站的某些鞋码并将它们输出到屏幕上的代码在 Chrome 中弄乱了订单。
给定的 JSON 可以是:
{
"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"]
}
...将大小减半。
在转换为对象并通过键进行迭代后,自然顺序得到尊重,结果如下:
7、7.5、8、8.5 等
但仅在 Chrome 中,“看起来”像整数的键总是首先从对象中出来,所以 for... in 循环的输出是:
7, 8, 9, 7.5, 8.5, 9.5 ...
Object.keys(sizes); // ["7", "8", "9", "7.5", "8.5", "9.5"]
这是测试用例:https : //jsfiddle.net/wcapc46L/1/
它只影响整数,似乎 Webkit/Blink 有一个优化,它更喜欢数字的对象属性,也许它与分支预测或其他什么有关。
如果使用任何字符作为对象键的前缀,则顺序不受影响并按预期工作 - FIFO
我想我记得读过关于对象的属性顺序没有保证的文章,但同时,这非常烦人,并且会导致单独为 chrome 用户修复它的大量工作。
有任何想法吗?这可能是一个可以修复的错误吗?
另外编辑,我现在发现这是 v8 错误跟踪器上的一个问题:
https://code.google.com/p/v8/issues/detail?id=164
看起来 Blink 不想解决这个问题,并且将仍然是唯一会这样做的浏览器。
更新任何哈希表优化 webkit/blink,现在已经进入 Gecko (FF 27.0.1) - https://jsfiddle.net/9Htmq/结果在
7,8,9,7.5,8.5,9.5
._
在键返回正确/预期的顺序之前应用。2017年更新人们仍然upvoting和编辑会这样-这似乎并不影响
Map
/WeakMap
,Set
等等(这表现在已更新的主要例子)