当前位置: 首页 > 知识库问答 >
问题:

javascript - 关于 js forEach 的疑问?

吕皓
2023-11-21

以下代码在 chrome 输出 1,2,3

const arr = [1,2,3]arr.forEach(i=>{    arr.push(i)    console.log(i)})

这个在网上找到了,forEach 一开始就已经获取了 数组长度

The range of elements processed by forEach is set before the first call to callbackfn. Elements which are appended to the array after the call to forEach begins will not be visited by callbackfn.

但是怎么解释以下代码 只输出了 1?

const arr = [1,2,3]arr.forEach(i=>{    if(i===1) arr.length = 0    console.log(i)})

网上都查过了, 找不到
期望有大佬 能贴出源码

共有4个答案

松钊
2023-11-21

官方讲的比较详细,https://262.ecma-international.org/5.1/#sec-15.4.4.18
image.png
arr.length = 0是清空后面的元素,对应文档后面的描述

谷梁宏恺
2023-11-21

赞同一楼。
不过这个现象还可以从另外一个角度解释——数组的迭代方法会跳过数组空槽
比如下面的例子:

[,,,3,4] === 5; // true[,,,3,4].forEach(console.log);

�� [,,,3,4].length 其实是 5 ,但console.log只会被调用两次。

数组迭代方法跳过空槽的行为,还会引发一些反直觉的现象,比如:

[,,,,,].every((item) => typeof item === "number");// true
潘青青
2023-11-21

这一点,和 empty 有关。

你的后一段代码,在执行到 arr.length = 0 后,会导致数组的元素全部清空,而 forEach() 在执行回调参数前,会判断一下对应位置的元素是否为 empty,当值为 empty 时,会直接不执行。

比如:

const arr = [, null, undefined];console.log(arr.length);arr.forEach((i) => {  console.log(i);});// 依次输出:3、null、undefined// 诶,数组长度不是为 3 吗,第一个怎么没有任何输出?// 因为 arr[0] 为 empty

更多分析,你可以看看我的一篇记录,研究过这一点是怎么回事。

参见:https://blog.csdn.net/qq_49661519/article/details/126809280

何安宜
2023-11-21

参考 MDN 中关于 forEach 的介绍部分。

image.png

  • Array.prototype.forEach() - JavaScript | MDN
 类似资料:
  • 结果: 问题: 1.lis,ele=>ele.textContent中我把ele.textContent换成了lis.textContent结果出来的是一个undefine的集合,是为什么? 2.lis,ele=>ele.textContent我是否可以理解为Array.from(arr,function),然后返回元素的文本内容? 3.该怎么理解lis和ele之间的关系呢?(因为看到很多案例都是

  • 我有一个用例,我想建立一个Kafka集群,最初我有1个Kafka Broker(A)和1个Zookeeper节点。以下是我的疑问: > 在向集群添加新的Kafka Broker(B)时。代理A上存在的所有数据都会自动分发吗?如果不是,我需要做的是分发数据。 不,让我们假设情况以某种方式解决了!我的数据分布在两个代理上。现在由于一些维护问题,我想关闭服务器B。 如何将经纪商B的数据传输到已经存在的经

  • 因为在开发中遇到过需要table的高度跟随table内容动态变化的情况(但是又不能无限伸长,最多伸长至父元素的100%),所以尝试给el-table赋一个max-height:100%的属性,但好像不生效,高度达到父元素的100%后,表格竟然不能滚动了,我也在官方仓库下提了issue; 然后看到一个哥们的回答,说这样可以达到max-height:100%的效果: 试了一下确实是可行的!就是很好奇为

  • young gc是不是针对所有的新生代region进行回收?我的理解是young gc会回收全部的新生代Region,并调整Eden区数量来满足软实时性要求; Oracle文档中指出在并发标记期间还可能进行额外的young gc,这不会破坏并发标记期间的内存布局么?比如现在正在进行并发标记,对于某个Eden Region A, 还未完成标记,此时若是发生young gc,A会被如何处理? 以及这位

  • 本文向大家介绍javascript中关于类型判断的一些疑惑小结,包括了javascript中关于类型判断的一些疑惑小结的使用技巧和注意事项,需要的朋友参考一下 前言 类型判断是我们在日常工作中经常会遇到的一个功能,本文将给大家详细介绍关于javascript类型判断的相关内容,下面话不多说了,来一起看看详细的介绍吧 Javascript中数据类型分为两种: 简单数据类型:Undefined, NU

  • 我想合并三个圈出来的地方, 后端返回的数据结构是2个,我把它扁平化成4个了并且绑定了,现在想合并单元格,但是猪脑不够用了,而且拆了之后它那个switch怎么绑定回父级的row也没想好。有没有巨佬帮一下我,非常感谢