执行JavaScript代码时仅将myList中3个元素移入myCart而非全部,原因是什么?
为什么forEach只移动了3个元素就停止了?
嘿,这个问题其实是对forEach的执行逻辑理解不到位导致的,我给你拆解清楚:
核心原因:forEach的遍历次数是提前确定的
forEach方法在开始执行前,会先获取当前数组的初始长度,然后按照这个长度来执行循环——不管你在循环过程中怎么修改原数组的长度,它都不会调整循环次数。
放到你的代码里看:
- 初始时
myList的长度是5,所以forEach本来计划执行5次循环。 - 但你在每次循环里都用
pop()删除了myList的最后一个元素,导致myList的长度在不断缩短。
具体执行过程拆解
我们一步步走一遍:
- 第1次循环:
myList长度为5,pop()取出'coffee',myList变成['pop tarts', 'ramen', 'chips', 'salsa'](长度4),myCart新增'coffee'。 - 第2次循环:
myList长度为4,pop()取出'salsa',myList变成['pop tarts', 'ramen', 'chips'](长度3),myCart新增'salsa'。 - 第3次循环:
myList长度为3,pop()取出'chips',myList变成['pop tarts', 'ramen'](长度2),myCart新增'chips'。 - 这时候,
forEach要执行第4次循环了,它对应的是初始数组的索引3,但现在myList的长度只有2,索引3已经不存在了,所以循环直接终止,剩下的'pop tarts'和'ramen'也就没被处理。
怎么解决?
如果你想把myList的所有元素都移到myCart,可以换两种方式:
方式1:遍历原数组的副本
先复制一份myList,遍历副本而不是原数组,这样原数组的修改不会影响循环次数:
let myList = ['pop tarts', 'ramen', 'chips', 'salsa', 'coffee'] let myCart = [] // 用扩展运算符创建原数组的副本 [...myList].forEach((item) => { let poppedItem = myList.pop() myCart.push(poppedItem) console.log(myList) console.log(myCart) })
方式2:用while循环更直接
既然是要清空myList,用while循环判断数组长度会更直观:
let myList = ['pop tarts', 'ramen', 'chips', 'salsa', 'coffee'] let myCart = [] while (myList.length > 0) { let poppedItem = myList.pop() myCart.push(poppedItem) console.log(myList) console.log(myCart) }
内容的提问来源于stack exchange,提问作者Forrest Gray
相关产品推荐
相关产品推荐

