JavaScript中reduce空数组初始值无法push,源数组含null却可行的原因?
reduce操作空数组push不生效的原因
核心规则:Array.prototype.reduce 回调函数的执行次数,仅和原数组的元素数量挂钩,传入的初始值仅作为累计值的初始状态,不会触发回调执行。
两种场景的差异解释
场景1:原数组为空
示例代码:
[].reduce((arr, curr) => { arr.push('val') return arr }, []); // 返回 []
原数组长度为0,回调函数不会执行,直接返回传入的初始空数组,push逻辑完全没有运行,所以结果是空数组。
你提到的空数组reduce传初始值0返回0的逻辑和该场景完全一致:因为回调没有执行,直接返回初始值0,没有执行任何累加操作。
场景2:原数组包含null元素
示例代码:
[null].reduce((arr, curr) => { arr.push('val') return arr }, []); // 返回 ['val']
原数组长度为1,哪怕元素值是null,也属于数组的有效遍历元素,所以回调会执行1次:执行时会把初始空数组push入值,最终返回修改后的数组。
初始值为什么不算元素
reduce的设计逻辑是遍历原数组的每一个元素做累计计算,初始值是计算的起始状态,不属于原数组的遍历范围,因此不会被当做要处理的元素,不会触发回调执行。
内容的提问来源于stack exchange,提问作者nCardot
相关产品推荐
相关产品推荐

