Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript array.forEach是否按升序遍历元素_Javascript_Arrays_Sorting_Foreach - Fatal编程技术网

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

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也会

在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
订单,我认为如果供应商有很好的理由保持其当前订单的几个版本,但我认为在实践中,供应商很乐意保持一致性并继续保持一致性。