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-in或Object.keys.(有关此答案的详细信息.)如果要按ES2015中定义的顺序访问属性,可以使用Object.getOwnPropertyNames(对于未使用Symbol名称定义的属性)或Reflect.ownKeys(对于两者Symbol和字符串属性名称[请记住数字属性名称是真正的字符串]).这两个都尊重财产秩序.
直接源自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)