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

Rod*_*nko 29 javascript arrays sorting foreach

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

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

a.forEach(function(x) {alert(x);});
Run Code Online (Sandbox Code Playgroud)

我无法找到有关元素是否按升序处理的信息,或者这不是可靠的事实.

我检查了"for .. in"循环以升序遍历数组索引,而对象的属性名称以与添加到对象相同的顺序遍历(至少看起来如此).

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

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

nnn*_*nnn 46

ECMA-262,第5版规范和MDN的Array.forEach()页面都显示了算法.forEach(),它肯定会遍历升序索引顺序数组元素(跳过指数未曾被分配一个值).

当然,有些浏览器可能无法正确实现该算法,但我不知道有哪些不能.


T.J*_*der 13

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

我检查了"for .. in"循环以升序遍历数组索引,而对象的属性名称以与添加到对象相同的顺序遍历(至少看起来如此).

在该命令for-in访问对象属性是通过本说明书中,尽管ES2015的事实定义的,甚至没有在ES2015(又名ES6)定义了一个为了使对象属性  的顺序并不适用于- for-inObject.keys.(有关此答案的详细信息.)如果要按ES2015中定义的顺序访问属性,可以使用Object.getOwnPropertyNames(对于未使用Symbol名称定义的属性)或Reflect.ownKeys(对于两者Symbol和字符串属性名称[请记住数字属性名称是真正的字符串]).这两个尊重财产秩序.


Bru*_*uno 5

直接源自ECMAScript 标准

forEach对数组中存在的每个元素按升序调用一次callbackfn。仅对实际存在的数组元素调用callbackfn;数组中缺少元素时不会调用它。

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

a.forEach( function( value ) { console.log( value ) }); // prints 100, 300, 200
Run Code Online (Sandbox Code Playgroud)

如果您确实想按升序遍历数组并且所有元素都是数字,那么您可以像这样预先对数组进行排序

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