javascript - Chrome 重新排序对象键(如果是数字)是正常/预期的吗

标签 javascript json google-chrome javascript-objects

我注意到某些代码会评估电子商务网站的某些鞋码并将其输出到屏幕上,这会扰乱 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 etc.

但仅在 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 用户修复它会导致相当大的工作量。

有什么想法吗?这可能是一个会得到修复的错误吗?

edit 另外,我现在发现这是 v8 错误跟踪器上的一个问题:

https://code.google.com/p/v8/issues/detail?id=164

Blink 似乎不想解决此问题,并且仍将是唯一可以解决此问题的浏览器。

update whatever hash table optimisation webkit/blink had, has now made its way into gecko (FF 27.0.1) - https://jsfiddle.net/9Htmq/ results in 7,8,9,7.5,8.5,9.5. applying _ before the keys returns the correct / expected order.

update 2017 People are still upvoting and editing this so - It does NOT appear to affect Map / WeakMap, Set etc (as demonstrated by updated main example)

最佳答案

这是 v8 处理关联数组的方式。一个已知问题 Issue 164但它遵循规范,因此标记为“按预期工作”。循环关联数组不需要顺序。

一个简单的解决方法是在数值前面加上字母,例如:'size_7':['9149','9139'] 等。

该标准将在下一个 ECMAScript 规范中发生变化,迫使 [chrome] 开发人员对此进行更改。

关于javascript - Chrome 重新排序对象键(如果是数字)是正常/预期的吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3186770/

相关文章:

javascript - 保存在本地存储上的图像传递到输入文件

javascript - 如何使用ajax从api中的json获取特定数据。 json 对我来说看起来很奇怪

Javascript检测下拉列表何时关闭

javascript - jQuery Ajax 访问自定义响应 header

javascript - 将多个元素存储在一个变量上

json - Phoenix、Json 和 Unix 时间戳

json - Mongoimport JSON文件错误: "BSON representation of supplied JSON array is too large: code FailedToParse: Date expecting integer milliseconds"

html - <TD> 元素发明了额外的空间只是为了弄乱我的布局

jquery - chrome 的文件输入元素、完整路径检索和命令行

css - 图像预加载技术(用作悬停状态 CSS 背景图像)似乎在 Chrome 上不起作用