如何解决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ѭ循环,则将对其进行排序。
因此,如果您创建两个具有不同顺序的项的数组,那么它们将不相同。
对象的枚举根据浏览器的感觉进行排序。
我相信有些字母按字母顺序排列,有些则放在开头,有些放在结尾。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。