具有整数键的稀疏Javascript数组是否仍按键排序?

具有整数键的稀疏Javascript数组是否仍按键排序?,javascript,Javascript,例如: var a = []; a[5] = 'five'; a[2] = 'two'; a[11] = 'eleven'; a[210] = 'two-ten'; a[4] = 'four'; a[56] = 'fifty-six'; a[1] = 'one'; a[39] = 'thirty-nine'; for( var i in a ) { if( a.hasOwnProperty(i) ) { console.log(i+":"+a[i]); } }

例如:

var a = [];
a[5] = 'five';
a[2] = 'two';
a[11] = 'eleven';
a[210] = 'two-ten';
a[4] = 'four';
a[56] = 'fifty-six';
a[1] = 'one';
a[39] = 'thirty-nine';

for( var i in a ) {
    if( a.hasOwnProperty(i) ) {
        console.log(i+":"+a[i]);
    }
}
结果如下(对于一些浏览器,我可以方便地进行测试。)


这是标准的、可靠的行为吗?

是的,它们总是有序的,但标准(据我所知)最终将所有中间索引设置为未定义

编辑:
如果将其初始化为对象(使用大括号而不是方括号(用于数组),则浏览器之间可能会出现不规则行为。

ECMA-262未指定枚举顺序


一些浏览器以其他浏览器不喜欢的方式有序地实现它们,以节省内存。

我手头没有详细信息,但几年前我看到这些时,在一些浏览器中发现了不同的行为…@亚当:真的吗?我没有。如果你将它初始化为一个对象,用花括号代替方括号(用于数组),你可能会在浏览器之间出现不规则的行为。数组总是有序的。总是正确的。如果OP正确地在数组上迭代(即从
0
a.length
,那么他会看到这一点,因为这是固有的)。他的循环自动柜员机有点老套。我知道会创建未定义的索引,而且我知道对于..长度,会包括它们。我不知道的是,稀疏地迭代它是否总是以数字顺序进行。这就是我感兴趣的用例。@pixelmike是的,只要它实际上是一个数组对象而不是一个常规的旧对象,它就会是。它被初始化为一个常规对象,而不是数组。[]是一个数组构造函数正确。指定的链接中没有使用数组构造函数。根据定义,数组是一个索引(有序)列表。v8按插入顺序保留普通对象属性,但数字索引除外,它按顺序排列。
1:one
2:two
4:four
5:five
11:eleven
39:thirty-nine
56:fifty-six
210:two-ten