为何JavaScript数组长度为3,forEach却不执行3次?
JavaScript数组使用delete删除元素后length不变但forEach不遍历空槽的原因
先看你给出的代码:
let temp = ["a", "b", "c"] console.log(temp.length) temp.forEach((e, i)=>console.log(e, i)) delete temp[0] console.log(temp) console.log(temp.length) temp.forEach((e,i)=>console.log(e, i))
核心原因拆解:
- delete操作的本质:用
delete删除数组元素时,并不会移除这个索引位置,只是把该位置的值清空,变成了空槽(empty slot)。数组的length属性由最大索引值+1决定,此时数组最大索引还是2,所以length依然保持3。 - forEach的遍历规则:
forEach在遍历数组时,会自动跳过空槽,只处理那些有实际赋值的索引位置。所以删除temp[0]后,forEach只会遍历索引1和2对应的"b"和"c",不会执行3次。
如果想要真正移除数组元素并同步更新length,可以使用splice方法,比如temp.splice(0, 1),这样数组会直接删除索引0的元素,length也会变为2,forEach遍历次数也会对应减少。
内容的提问来源于stack exchange,提问作者Pratik Mohite
相关产品推荐
相关产品推荐

