javascript数组和对象是否有设置顺序?

这个问题对于我当前涉及从JSON对象创建HTML表的项目之一至关重要。 我以为我可以创建在将它们呈现为HTML之前对我的数组/对象进行排序的函数。 我唯一关心的是命令在JavaScript中无关紧要,如果我要创建一个具有相同数据(以不同顺序)的新Array作为另一个Array它们最终会相同。

我想不出一个快速的测试方法,所以我在这里问。

其他人已回答数组,所以我只是想提供一些关于对象的信息。

在那个,标准是不存在的,但事实上的定义是一个对象将按插入顺序枚举,除了数字按升序排列并首先枚举。 我通常说,但这种行为远没有标准化(jQuery框架也没有标准化,AFAIK)。

您可以使用此jsFiddle测试浏览器:

http://jsfiddle.net/7cCpu/4/

对象{"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 (!!!) 

数组由(数字)索引枚举。

对象不是 – 订单未定义,Javascript标准明确指出订单未定义 。 有关更多详细信息,请参阅JavaScript保证对象属性顺序?

对象属性顺序不同的好例子是这段代码:

 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

在使用“for … in”循环进行迭代时,我永远不会依赖于以任何特定的,甚至是一致的顺序显示的对象属性。 将程序放在一起只是一种脆弱的方式,特别是当明确强加自己的订单时很容易。

当迭代数组时,你不应该使用“for … in”循环,所以这一点没有实际意义; 显然,如果使用数字索引正确迭代,您将以一致的可重复顺序遍历属性。

如果将数组序列化为JSON表示,则从位置0到数组长度的每个索引属性都必须存在某些内容。 这意味着长度为1000000的稀疏数组在大小方面存在问题但可行。

数组上的枚举按索引排序。 如果枚举( for in )或for循环数组,它将被排序。

因此,如果您创建两个具有不同顺序的项目的数组,那么它们就不相同了。

对象的枚举是根据浏览器的感觉排序的。

我相信有些按字母顺序排列,有些人在开头放数字,有些放在最后。