Array
,它们最终会变得相同。我想不出一种快速测试的方法,所以我在这里问。
Array
,它们最终会变得相同。其他人已经回答了关于数组的问题,所以我想提供一些关于对象的信息。
在这方面,标准不存在,但它的实际定义是对象将按插入顺序枚举,但数字会按升序排列并首先枚举。我说通常是因为这种行为远未标准化(也没有像jQuery这样的框架对其进行标准化,据我所知)。
您可以使用此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 (!!!)
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
循环遍历一个数组,它将会被排序。
因此,如果你创建两个不同顺序的数组,它们就不相同。
对象的枚举是基于浏览器的任意顺序。
我相信有些是按字母顺序排列的,有些把数字放在开头,有些放在结尾。