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,foo,baz // Chrome enumeration
1,baz // Opera
1,baz // IE9
foo,1 // Firefox (!!!)
我没有安装Safari,但我认为它与Chrome浏览器相同。无论如何,关键是您可以做出假设-这不是随机的-但如果您依赖精确的枚举,则使用数组可能是一个更好的主意。 duri指出,甚至更讨厌,删除和替换键的值会进一步改变情况。观察当我
delete bar
并做
Object.bar = \"foo\"
然后列举时会发生什么:
1,bar // Chrome enumeration
1,bar // Opera
1,baz // IE9 (!!!)
foo,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
)或an11ѭ循环,则将对其进行排序。 因此,如果您创建两个具有不同顺序的项的数组,那么它们将不相同。 对象的枚举根据浏览器的感觉进行排序。 我相信有些字母按字母顺序排列,有些则放在开头,有些放在结尾。