【问题标题】:Chrome sorts objects by key [duplicate]Chrome按键排序对象[重复]
【发布时间】:2011-09-04 05:53:43
【问题描述】:

可能重复:
Chrome and probably Opera sort object properties automatically

我有一个非常简单的代码:

var obj = {3:'a',2:'b',1:'c'};
console.log(obj);

在 Firefox 4.0.1 中返回:

Object { 3="a", 2="b", 1="c"}

在 Chrome 11.0.696.71 中返回:

Object { 1="c", 2="b", 3="a"}

如何强制 Chrome 不对这个对象进行排序?

【问题讨论】:

  • 如果您希望它按特殊顺序排列,请使用两个数组,一个包含键,另一个包含值。
  • @xavier:不,一个数组就足够了,只需使用值作为键。

标签: javascript sorting object google-chrome


【解决方案1】:

对于对象,规范是不保留元素的顺序。换句话说,javascript 不保证对象属性的任何特定顺序。

如果要保留元素的顺序,则必须使用数组。在这种情况下,您的 Object 可以重写为:

var arrobj = ['c','b','a'];

var arrobj = ['a','b','c'].reverse();

您已经考虑到第一个元素索引将为 0(零)

【讨论】:

  • 不。数组编号从 0 开始。由于OP要使用特定的密钥,他最好使用var arr[3] = "a", arr[2] = "b", arr[1] = "c";
  • Javascript 没有关联数组,它有对象。
  • @Marcel:好吧,他也可以使用 ['-','c','b','a'] 或者在遍历数组时将 1 添加到迭代器等。很多路都通向到罗马这里。本质是:属性顺序不保留在 javascript 对象中。 @RobG:我知道。看起来 OP 会更好地理解关联数组这个术语。放弃了。
【解决方案2】:

这是 chrome 的一个已知“错误”/功能。甚至 jQuery 的作者也对此感到愤慨,但 chrome 的人却保持不变,说这是一个“特性”: http://code.google.com/p/chromium/issues/detail?id=883[1]

作为一种解决方法,使用数组或某种 MixedCollection(如在 extjs 中)或类似的东西。

null !== true and also null !== false // in php and js it's so

[1]:John Resig (jeresig) 是 jquery 的作者

【讨论】:

  • -1 对 Chrome 开发人员的咆哮,对象属性的顺序是并且将保持未指定; +1 推荐阵列。
  • 未指定,但所有其他浏览器已经将其实现为无序。所以它太正式了,也破坏了旧代码。我认为 chrome 开发人员在这里就像官僚——太正式了。
  • 对不起,我不明白你在说什么:你刚刚承认“所有其他浏览器都已经将它实现为无序”;这只是意味着您不应该依赖属性的顺序。依赖于此的代码被破坏了。顺便说一句,您指的是哪个“旧代码”?
  • 这不是错误; JavaScript 规范没有规定对象元素的任何顺序,因此它完全取决于实现,不应期望特定行为。
  • @gaRex:至于真/假/空的东西,我不确定你在那里得到了什么。一些“聪明”的人做出了不应该做出的假设,因为语言规范明确表示它们不应该做出,现在他们的代码因此而被破坏。我没有同情他们。而且我对 Chrome 的选择没有任何问题,因为没有做出这些愚蠢假设的每一点 JS 仍然可以正常工作。
猜你喜欢
  • 2023-01-19
  • 1970-01-01
  • 2021-06-17
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 2022-01-08
  • 2017-10-04
  • 2012-11-20
相关资源
最近更新 更多