【问题标题】:Does JavaScript array.forEach traverse elements in ascending orderJavaScript array.forEach 是否按升序遍历元素
【发布时间】:2012-11-16 01:25:10
【问题描述】:

在 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 不同)。

【问题讨论】:

    标签: javascript arrays sorting foreach


    【解决方案1】:

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

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

    for-in 访问对象属性的顺序没有在规范中定义,即使在 ES2015(又名 ES6)中也没有,尽管事实上 ES2015 defines an order for object properties——该顺序没有申请for-inObject.keys。 (更多关于 this answer 的内容。)如果你想按照 ES2015 中定义的顺序访问属性,你可以使用 Object.getOwnPropertyNames(对于没有用 Symbol 名称定义的属性)或 Reflect.ownKeys(对于两者Symbol 和字符串属性名称 [记住数字属性名称实际上是字符串])。这两个确实都尊重财产秩序。

    【讨论】:

    • Chrome 现在在执行Object.getOwnPropertyNamesReflect.ownKeys 时按数字顺序排序。我能找到对它们进行排序的唯一方法是通过在键的开头添加_ 将它们全部设为非数字字符串。
    • @Mike:是的。在制定规范时,他们强调要求供应商在for-inObject.keys 上回补该订单,我认为以防供应商有充分的理由保留其当前订购的几个版本.但我认为在实践中,供应商很乐意保持一致并以这种一致性向前发展。
    【解决方案2】:

    直接出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 ) }); 
    

    【讨论】:

    • 但是问题是问迭代的顺序是否有保证。
    【解决方案3】:

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

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

    【讨论】:

    • 嗯。我以前读了好几遍,现在才发现我不专心。谢谢。如我所见,此方法根本不遍历内部结构... :(
    猜你喜欢
    • 2020-04-07
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 2021-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    相关资源
    最近更新 更多