JavaScript array.forEach是否按升序遍历元素

时间:2012-11-28 08:36:56

标签: javascript arrays sorting foreach

在JavaScript中我可以有一个带孔的数组:

a = [];
a[0] = 100;
a[5] = 200;
a[3] = 300;

a.forEach(function(x) {alert(x);});

我无法找到有关元素是按升序处理还是不可靠的信息。

我检查过“for ... in”循环以升序遍历数组索引,而对象的属性名称按照它们添加到对象的顺序遍历(至少看起来如此)。

(即,看起来数组是某种类型的内部树,而对象是哈希表。)

我刚刚发现Rhino JavaScript也会遍历不存在的元素: http://ideone.com/7Z3AFh(与for..in不同)。

3 个答案:

答案 0 :(得分:43)

ECMA-262, 5th edition规范和MDN's Array.forEach() page都显示.forEach()的算法,它肯定会按升序索引顺序迭代数组元素(跳过从未赋值的索引)。

当然,有些浏览器可能无法正确实现该算法,但我不知道其中没有。

答案 1 :(得分:13)

The specification says forEach将按数字顺序访问数组元素。它不访问不存在的元素。请参阅链接了解详细信息。因此,对于您的示例数组,它将访问元素0,然后访问3,然后访问5。将它们添加到数组的顺序不会影响它们的访问顺序。

  

我检查过“for ... in”循环以升序遍历数组索引,而对象的属性名称按照它们添加到对象的顺序遍历(至少看起来如此)。

for-in访问对象属性的顺序由规范定义,即使在ES2015(aka ES6)中也是如此,尽管事实上ES2015 defines an order for object properties - 订单不适用于for-inObject.keys。 (有关this answer中的更多信息。)如果要按ES2015中定义的顺序访问属性,可以使用Object.getOwnPropertyNames(对于未使用Symbol名称定义的属性)或Reflect.ownKeys(对于Symbol和字符串属性名称[记住数字属性名称实际上是字符串])。这两个都尊重属性顺序。

答案 2 :(得分:3)

直接离开ECMAScript standard

  

forEach 为数组中的每个元素调用一次callbackfn,   按升序排列。 callbackfn只被调用的元素   实际存在的数组;它没有被称为缺少的元素   数组。

因此,Array.forEach将跳过数组中的某些元素。你的例子

a.forEach( function( value ) { console.log( value ) }); // prints 100, 300, 200

如果你想按升序遍历数组并且所有元素都是数字,那么你可以事先对数组进行排序

a.sort( function( a, b ) { return a - b });
// this now prints 100, 200, 300
a.forEach( function( value ) { console.log( value ) });