JavaScript array.forEach是否按升序遍历元素
在JavaScript中,我可以有一个带孔的数组:JavaScript array.forEach是否按升序遍历元素,javascript,arrays,sorting,foreach,Javascript,Arrays,Sorting,Foreach,在JavaScript中,我可以有一个带孔的数组: a = []; a[0] = 100; a[5] = 200; a[3] = 300; a.forEach(function(x) {alert(x);}); 我找不到有关元素是否按升序处理的信息,或者这是一个不可靠的事实 我检查了“for..in”循环是否按升序遍历数组索引,而对象的属性名按添加到对象中的相同顺序遍历(至少看起来是这样) (也就是说,看起来数组在内部是某种树,对象是哈希表。) 我刚刚发现Rhino JavaScript也会
a = [];
a[0] = 100;
a[5] = 200;
a[3] = 300;
a.forEach(function(x) {alert(x);});
我找不到有关元素是否按升序处理的信息,或者这是一个不可靠的事实
我检查了“for..in”循环是否按升序遍历数组索引,而对象的属性名按添加到对象中的相同顺序遍历(至少看起来是这样)
(也就是说,看起来数组在内部是某种树,对象是哈希表。)
我刚刚发现Rhino JavaScript也会遍历不存在的元素:
(与..in不同)。直接从
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 ) });
forEach
将按数字顺序访问数组元素。它不会访问不存在的元素。有关详细信息,请参阅链接。因此,对于示例数组,它将访问元素0
,然后访问3
,然后访问5
。将它们添加到数组的顺序对它们的访问顺序没有影响
我检查了“for..in”循环是否按升序遍历数组索引,而对象的属性名按添加到对象中的相同顺序遍历(至少看起来是这样)
in的访问对象属性的顺序不是规范定义的即使在ES2015(又称ES6)中也没有定义,尽管ES2015-该顺序不适用于in的或对象键的。(有关详细信息,请参见。)如果您希望按照ES2015中定义的顺序访问属性,可以使用(对于未使用Symbol
名称定义的属性)或(对于Symbol
和字符串属性名称[请记住,数字属性名称实际上是字符串])。它们都尊重属性顺序。规范和它们都显示了.forEach()
的算法,并且它肯定会按索引升序迭代数组元素(跳过从未赋值的索引)
当然,有些浏览器可能无法正确实现该算法,但我不知道有哪种浏览器不能正确实现。但问题是迭代顺序是否得到保证。Hm。我以前读过好几遍,现在才发现我是漫不经心的。谢谢这个方法根本不遍历内部结构,正如我所看到的…:(Chrome现在在执行Object.getOwnPropertyNames
和Reflect.ownKeys
时按数字顺序进行排序。我能找到的唯一不排序的方法是在键的开头加上一个。
,使它们都是非数字字符串。@Mike:是的。按照规范,他们强调不要求供应商反写对于in
和Object.keys
的订单,我认为如果供应商有很好的理由保持其当前订单的几个版本,但我认为在实践中,供应商很乐意保持一致性并继续保持一致性。