请用 JavaScript 手写一个与原生 filter 行为一致的实现,并给出完整代码。
考察说明
考查对数组高阶函数 filter 的底层实现原理及回调语义的掌握。
回答思路
- 【回答框架 1】filter 的核心是遍历数组,对每个元素调用回调,回调返回真值时将该元素收集到新数组,最终返回新数组,不修改原数组。
- 【回答框架 2】实现时先定义函数 myFilter,接收回调函数和可选的 thisArg;遍历时用索引访问元素,通过 call 或 apply 绑定 thisArg,并传入元素、索引、原数组三个参数。
- 【回答框架 3】收集结果用新数组 push,遍历结束后返回新数组;稀疏数组应跳过空槽,保持与原生的稀疏语义一致。
- 【回答框架 4】边界情况:回调可能修改原数组,遍历长度以初始 length 为准;若回调抛出异常则直接向上抛出。
- 【回答框架 5】复杂度为 O(n),空间为 O(n),与原生 filter 一致。
- 【关键点 1】返回新数组且不修改原数组
- 【关键点 2】回调接收元素、索引、原数组三个参数
- 【关键点 3】支持 thisArg 绑定回调 this
- 【关键点 4】稀疏数组跳过空槽
- 【关键点 5】遍历长度以初始 length 为准
- 【易错点 1】误用 forEach 或 map 实现导致返回值错误
- 【易错点 2】忽略 thisArg 绑定导致回调 this 指向错误
- 【易错点 3】未处理稀疏数组导致结果与原生不一致