推荐答案
-- -------------------- ---- ------- -------- ------------- --------- ------------- - -- --------------------- - ----- --- ------------------------ - -- ------- -------- --- ----------- - ----- --- ------------------------ - --- ----------- - ------------- --- ---------- - -- -- ------------- --- ---------- - ------------- --- -- - ----- --- ----------------- -- ----- ----- ---- -- ------- -------- - ----------- - ------- ---------- - -- - --- ---- - - ----------- - - ----------- ---- - ----------- - --------------------- ------- -- ----- - ------ ------------ - -- ---- ----- ------- - --- -- -- -- --- -- -- ----- --- - ----------------- ----- -------- -- --- - -------- --- ----------------- -- -- -- -- ----- ----- --- - ----------------- ----- -------- -- ------------- --------- ----------- ----------------- -- -- - -- --------- ----- ------- - ----------------- ----- ---- -- --- - ----- --------------------- -- -- --- -- ---- --- - ------------- -- -- ---- - ----- ------- - ----------------------------- -- ------------- - --- - ------------ ----------- - ----- ------- - ----------------------------- -- ------------- - --- - ----------------- ---- -- --- - ----- - ----- ------- - ----------------------------- -- --------- -- ----- ----- ---- -- ------- ----- -
本题详细解读
reduce 方法的作用
reduce()
方法对数组中的每个元素执行一个由您提供的 reducer 函数(升序执行),将其结果汇总为单个返回值。reduce
方法的本质在于迭代数组并处理每一个元素,最终将所有结果聚合成一个单一的值。
实现思路
- 参数校验:
- 检查第一个参数
arr
是否为数组,不是则抛出TypeError
。 - 检查第二个参数
callback
是否为函数,不是则抛出TypeError
。
- 检查第一个参数
- 初始化累加器 (accumulator):
- 如果提供了
initialValue
,则将accumulator
初始化为initialValue
。 - 如果没有提供
initialValue
,则:- 如果数组为空,抛出
TypeError
,提示需要初始值。 - 否则,将
accumulator
初始化为数组的第一个元素arr[0]
,并将循环的起始索引startIndex
设置为 1(跳过第一个元素,因为它已经被用作累加器的初始值)。
- 如果数组为空,抛出
- 如果提供了
- 迭代数组:
- 使用
for
循环从startIndex
遍历数组。 - 在每次迭代中,调用
callback
函数,传入以下参数:accumulator
: 上一次callback
函数的返回值或初始值。currentValue
: 当前正在处理的数组元素arr[i]
。currentIndex
: 当前元素的索引i
。array
: 原始数组arr
。
- 将
callback
的返回值更新为新的accumulator
。
- 使用
- 返回最终结果: 循环结束后,返回最终的
accumulator
值。
代码解读
- 错误处理: 针对参数类型错误和未提供初始值且数组为空的情况进行了异常处理,符合
reduce
方法的规范。 - 可读性: 代码逻辑清晰,通过注释说明了每个步骤的作用,易于理解。
- 兼容性: 代码使用了
for
循环,兼容性较好。 - 与原生
reduce
方法的对比: 实现的myReduce
方法与原生reduce
方法的功能和行为基本一致,包括:- 处理有初始值和无初始值的情况
- 回调函数的参数
- 异常处理
- 返回值
- 示例用法: 提供了多种示例,展示了
myReduce
函数的不同使用场景,包括求和、查找最大值和不提供初始值的情况。同时,也提供了错误用法的示例,验证了错误处理机制的正确性。