为何reduce方法与every方法在该场景下返回结果不一致?
为什么这两个函数的返回结果不一致?
核心问题出在两个方法的比较逻辑完全不同,尤其是你写的reduce代码偏离了和every一致的判断逻辑:
1. every方法的实际逻辑
arr.every(v => v === arr[0]) 做的是:让数组里每一个元素,都和数组的第一个元素做严格相等对比。
- 只要有一个元素和
arr[0]不相等,直接返回false - 所有元素都匹配
arr[0]时返回true - 空数组会返回
true(逻辑上“没有元素违反条件”)
2. reduce方法的实际逻辑
你写的reduce代码,是拿前一次对比的结果(布尔值)和当前元素做对比,而不是让当前元素和原始的arr[0]比:
- 第一次执行时,
a是数组第一个元素arr[0],b是第二个元素,对比后返回true或false - 从第二次开始,
a已经变成了布尔值(不再是原始的arr[0]),后续都是拿这个布尔值和数组元素对比,逻辑完全走偏 - 空数组调用这个
reduce会直接报错(因为没有初始值且数组为空)
举个直观的不一致例子
比如数组 [2, 2, true]:
every的执行:- 2 === 2 → true
- 2 === 2 → true
- true === 2 → false → 最终返回
false
reduce的执行:- 2 === 2 → true(此时累积值变成true)
- true === true → true → 最终返回
true
修正reduce的写法
如果想用reduce实现和every完全一致的逻辑,要让每个元素都和arr[0]对比,同时保留累积的布尔判断:
function myFunction57(arr){ if (arr.length === 0) return true; // 处理空数组,和every行为对齐 return arr.reduce((acc, curr) => acc && (curr === arr[0]), true); }
这里初始值设为true,每次用当前元素和arr[0]对比的结果,和之前的累积值做逻辑与,就能和every的结果保持一致。
内容的提问来源于stack exchange,提问作者MadalinJ
相关产品推荐
相关产品推荐

