自定义 foreach 函数需校验数组类型,遍历执行回调且不返回新数组:function myforeach(arr, callback) { if (!array.isarray(arr)) throw new typeerror('first argument must be an array'); for (let i = 0; i
可以自己写一个类似
forEach、map或filter的自定义数组遍历高阶函数,核心是接收数组和回调函数作为参数,在内部遍历并按需处理。基础版 forEach-like 函数
模拟原生
forEach行为:对每个元素执行回调,不返回新数组。function myForEach(arr, callback) { if (!Array.isArray(arr)) throw new TypeError('First argument must be an array'); for (let i = 0; i
- 回调函数接收三个参数:当前元素、索引、原数组(和原生一致)
- 支持
thisArg可选参数?可以扩展:myForEach(arr, callback, thisArg),调用时用callback.call(thisArg, ...)带返回值的 map-like 函数
模拟
map:遍历并映射出新数组。function myMap(arr, callback, thisArg) { if (!Array.isArray(arr)) throw new TypeError('First argument must be an array'); const result = []; for (let i = 0; i
- 注意用
call绑定thisArg,让回调能正确访问上下文- 不修改原数组,始终返回新数组
支持中断的遍历函数(如 some/every)
有些场景需要提前退出(比如找到第一个匹配就停止),可设计返回布尔值并支持中断:
function mySome(arr, callback, thisArg) { if (!Array.isArray(arr)) throw new TypeError('First argument must be an array'); for (let i = 0; i
mySome遇到第一个真值立即返回true,不继续遍历- 类似地可实现
myEvery:遇到假值立刻返回false更通用的 reduce-like 实现
如果想支持累积计算,可写简易
reduce:function myReduce(arr, callback, initialValue) { if (!Array.isArray(arr)) throw new TypeError('First argument must be an array'); if (arr.length === 0 && initialValue === undefined) { throw new TypeError('Reduce of empty array with no initial value'); } let accumulator = initialValue !== undefined ? initialValue : arr[0]; let startIndex = initialValue !== undefined ? 0 : 1; for (let i = startIndex; i
- 区分是否传入初始值,影响起始索引和累加器赋值
- 回调参数顺序:上一次结果、当前元素、当前索引、原数组
这些函数都遵循高阶函数原则:接受函数作为参数,内部封装遍历逻辑,对外暴露简洁接口。你可以根据实际需求组合或增强,比如加异常捕获、支持类数组对象、或用
for...of替代传统for循环。












