在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不同)。
答案 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-in
或Object.keys
。 (有关this answer中的更多信息。)如果要按ES2015中定义的顺序访问属性,可以使用Object.getOwnPropertyNames
(对于未使用Symbol
名称定义的属性)或Reflect.ownKeys
(对于Symbol
和字符串属性名称[记住数字属性名称实际上是字符串])。这两个做都尊重属性顺序。
答案 2 :(得分:3)
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 ) });