首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript array.forEach是否按升序遍历元素

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

Stack Overflow用户
提问于 2012-11-28 16:36:56
回答 3查看 45.3K关注 0票数 42

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

代码语言: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不同)。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-28 16:46:16

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

当然,有些浏览器可能没有正确地实现该算法,但我不知道有没有这样做的。

票数 68
EN

Stack Overflow用户

发布于 2012-11-28 16:45:47

The specification says forEach将按数字顺序访问数组元素。它不会访问不存在的元素。有关详细信息,请参阅链接。因此,对于示例数组,它将依次访问元素035。将它们添加到数组中的顺序对访问它们的顺序没有影响。

我检查了“

.. in”循环是否以升序遍历数组索引,而对象的属性名则以添加到对象的相同顺序遍历(至少看起来是这样)。

for-in访问对象属性的顺序是,而不是规范定义的,甚至在ES2015 (又称ES6)中也不是,尽管ES2015 defines an order for object properties支持-该顺序不适用于for-inObject.keys。(有关更多信息,请参阅this answer。)如果希望按ES2015中定义的顺序访问属性,可以使用Object.getOwnPropertyNames (对于未使用Symbol名称定义的属性)或Reflect.ownKeys (对于Symbol和字符串属性名称,请记住,数字属性名称实际上是字符串)。这两者都尊重财产秩序。

票数 15
EN

Stack Overflow用户

发布于 2012-11-28 16:42:40

直接走出ECMAScript standard

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

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

代码语言:javascript
复制
a.forEach( function( value ) { console.log( value ) }); // prints 100, 300, 200

如果您确实希望以升序遍历数组,并且所有元素都是数字,那么您可以预先对数组进行排序,如下所示

代码语言:javascript
复制
a.sort( function( a, b ) { return a - b });
// this now prints 100, 200, 300
a.forEach( function( value ) { console.log( value ) }); 
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13600922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档