原生Array Reduce实现问题:多数测试通过但某用例失败,求错误定位
排查自定义
Myreduce与原生Array.reduce的差异 兄弟,要精准揪出你的Myreduce哪里出问题,得先看看你的代码实现以及那个挂掉的测试用例才行!不过根据我踩过的坑和帮人排查的经验,自定义reduce最容易栽跟头的几个点,你可以先自查:
- 初始值的处理逻辑:
原生reduce的规则是:如果没传初始值,就拿数组第一个元素当初始值,从第二个元素开始遍历;要是数组为空还没传初始值,直接抛TypeError。很多自定义实现要么空数组没抛错,要么没传初始值时遍历起点错成了0(应该从1开始)。 - 回调的参数顺序:
原生回调的参数是(accumulator, currentValue, currentIndex, array),别搞反顺序(比如把currentValue放在accumulator前面,这会导致所有累加逻辑全错)。 - 稀疏数组的处理:
原生reduce会跳过数组里的空槽(比如[1,,3]中间的空元素不会触发回调),你的实现有没有判断元素是否存在?比如用hasOwnProperty检查索引? - this指向的绑定:
原生reduce的第二个可选参数是回调执行时的this上下文,你的Myreduce有没有用call/apply给回调绑定正确的this? - 原始数组的引用:
原生reduce在遍历过程中,即使原数组被修改,也会基于遍历开始时的原始数组元素和长度来执行,你的实现有没有保留原始数组的快照?
举个典型错误的例子:
// 错误实现:没处理无初始值的情况,空数组也不报错 Array.prototype.Myreduce = function(callback, initialValue) { let accumulator = initialValue; for (let i = 0; i < this.length; i++) { // 这里如果没初始值,第一次accumulator是undefined,和第一个元素相加就错了 accumulator = callback(accumulator, this[i], i, this); } return accumulator; }; // 测试用例1:[].reduce((a,b) => a+b) 原生抛TypeError,这个实现返回undefined // 测试用例2:[1,2,3].reduce((a,b) => a+b) 原生返回6,这个实现返回undefined+1+2+3=NaN
如果把你的Myreduce代码和失败的测试用例贴出来,我可以帮你精准定位问题!
内容的提问来源于stack exchange,提问作者TechnoCorner
相关产品推荐
相关产品推荐

