这个问题对于我当前涉及从JSON对象创建HTML表的项目之一至关重要。我以为我可以创建在将它们呈现为HTML之前对我的数组/对象进行排序的函数。我唯一担心的是订单在JavaScript中无关紧要,如果我要创建一个新的Array
,其数据(以不同的顺序)与另一个Array
相同,那么它们最终会相同。< / p>
我想不出一个快速的测试方法,所以我在这里问。
答案 0 :(得分:9)
其他人已经回答了数组,所以我只是想提供一些关于对象的信息。
就此而言,标准是不存在的,但它的事实上的定义是一个对象将按插入顺序枚举,但数字按升序排列并首先枚举。我通常说,但这种行为远非标准化(jQuery等框架也没有将其标准化,AFAIK)。
您可以使用此jsFiddle测试浏览器:
对象{"foo":"bar", "bar":"foo", "baz":"baz", "3":3, "2":2, "1":1}
枚举如下:
foo, bar, baz, 3, 2, 1 // insertion order
1, 2, 3, foo, bar, baz // Chrome enumeration
1, 2, 3, foo, bar, baz // Opera
1, 2, 3, foo, bar, baz // IE9
foo, bar, baz, 3, 2, 1 // Firefox (!!!)
我没有安装Safari,但我假设它与Chrome相同。在任何情况下,关键是你可以做出假设 - 它不是随机的 - 但如果你依赖于精确的枚举,那么使用数组可能是个更好的主意。
甚至更糟糕是duri在上面指出的,删除和替换键的值会进一步改变。观察当我delete bar
然后Object.bar = "foo"
进行枚举时会发生什么:
1, 2, 3, foo, baz, bar // Chrome enumeration
1, 2, 3, foo, baz, bar // Opera
1, 2, 3, foo, bar, baz // IE9 (!!!)
foo, baz, 3, 2, 1, bar // Firefox (!!!)
答案 1 :(得分:5)
数组由(数字)索引枚举。
对象不是 - 订单未定义,Javascript标准明确指出订单未定义。有关详细信息,请参阅Does JavaScript Guarantee Object Property Order?
答案 2 :(得分:2)
对象属性的顺序不同的好例子是这段代码:
var o = { foo: 1, bar: 2, baz: 3 };
delete o.bar;
o.bar = 2;
for (var i in o) {
document.write(o[i]);
}
这会在Firefox中显示132
,但在Internet Explorer中显示123
。
答案 3 :(得分:1)
在使用“for ... in”循环进行迭代时,我永远不会依赖于以任何特定或甚至一致的顺序显示的对象属性。将程序放在一起只是一种脆弱的方式,特别是在明确强加自己的订单时很容易。
当迭代数组时,你不应该使用“for ... in”循环,所以这一点没有实际意义;显然,如果使用数字索引正确迭代,您将以一致的可重复顺序遍历属性。
如果将数组序列化为JSON表示,则从位置0到数组长度的每个索引属性都必须有某些。这意味着长度为1000000的稀疏数组在大小方面存在问题但可行。
答案 4 :(得分:0)
数组上的枚举按索引排序。如果您枚举(for in
)或for
循环数组,它将被订购。
因此,如果您创建两个包含不同订单项目的数组,那么它们就不相同了。
对象的枚举是根据浏览器的感觉排序的。
我相信有些按字母顺序排列,有些人在开头放数字,有些放在最后。