我注意到某些代码会评估电子商务网站的某些鞋码并将它们输出到屏幕上,这会扰乱 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人们仍在投票和编辑它 - 它似乎不会影响
Map
/WeakMap
等Set
(如更新的主要示例所示)