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

时间:2011-06-11 15:04:12

标签: javascript jquery arrays object

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

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

5 个答案:

答案 0 :(得分:9)

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

就此而言,标准是不存在的,但它的事实上的定义是一个对象将按插入顺序枚举,但数字按升序排列并首先枚举。我通常说,但这种行为远非标准化(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 (!!!)

答案 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循环数组,它将被订购。

因此,如果您创建两个包含不同订单项目的数组,那么它们就不相同了。

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

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