在JavaScript中,我可以有一个带孔的数组:
a = [];
a[0] = 100;
a[5] = 200;
a[3] = 300;
a.forEach(function(x) {alert(x);});我找不到关于元素是否会按升序处理的信息,或者这不是可靠的事实。
我检查了"for .. in“循环是否以升序遍历数组索引,而对象的属性名则以添加到object的相同顺序遍历(至少看起来是这样)。
(例如,它看起来像是某种内部的树,而对象是哈希表。)
我刚刚发现Rhino JavaScript还遍历了不存在的元素:http://ideone.com/7Z3AFh (与for..in不同)。
发布于 2012-11-28 16:46:16
ECMA-262, 5th edition规范和MDN's Array.forEach() page都展示了.forEach()的算法,它肯定会按索引升序遍历数组元素(跳过从未赋值的索引)。
当然,有些浏览器可能没有正确地实现该算法,但我不知道有没有这样做的。
发布于 2012-11-28 16:45:47
The specification says forEach将按数字顺序访问数组元素。它不会访问不存在的元素。有关详细信息,请参阅链接。因此,对于示例数组,它将依次访问元素0、3和5。将它们添加到数组中的顺序对访问它们的顺序没有影响。
我检查了“
.. in”循环是否以升序遍历数组索引,而对象的属性名则以添加到对象的相同顺序遍历(至少看起来是这样)。
for-in访问对象属性的顺序是,而不是规范定义的,甚至在ES2015 (又称ES6)中也不是,尽管ES2015 defines an order for object properties支持-该顺序不适用于for-in或Object.keys。(有关更多信息,请参阅this answer。)如果希望按ES2015中定义的顺序访问属性,可以使用Object.getOwnPropertyNames (对于未使用Symbol名称定义的属性)或Reflect.ownKeys (对于Symbol和字符串属性名称,请记住,数字属性名称实际上是字符串)。这两者都尊重财产秩序。
发布于 2012-11-28 16:42:40
直接走出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 ) }); https://stackoverflow.com/questions/13600922
复制相似问题