filter方法返回新数组且不修改原数组,常见错误是回调函数未返回布尔值、误用赋值符、未处理null/undefined导致空数组;其回调接收item、index、array三参数,需注意falsy值处理与性能优化。

filter 方法不会修改原数组,它返回一个新数组,只包含让回调函数返回真值的元素。这是它最核心的行为,也是你误用它的最大风险点——比如想“删掉”某些项却忘了赋值给新变量。
为什么 filter 返回空数组?常见原因
多数时候不是方法错了,而是回调函数没按预期返回布尔值:
- 忘记
return(函数体是花括号但没写return),隐式返回undefined→ 被转为false - 用了赋值语句如
arr[i] = ...或console.log(...)当作判断逻辑 - 比较时用了赋值符
=而不是===,导致永远返回真值或报错 - 对
null/undefined元素直接调用方法(如item.toLowerCase()),抛出TypeError中断执行
filter 回调函数的三个参数怎么用
签名是 filter((item, index, array) => { ... }),其中:
-
item:当前遍历的元素,最常用 -
index:当前下标,适合需要位置逻辑的场景(如“跳过前两个”“只取偶数位”) -
array:原数组本身,极少用;但可用于对比(如“排除和数组首项相同的元素”)或调试
示例:剔除重复项(保留首次出现):
const unique = arr.filter((item, index) => arr.indexOf(item) === index);
立即学习“Java免费学习笔记(深入)”;
性能与边界要注意什么
filter 是浅层遍历,时间复杂度 O(n),但实际开销取决于回调函数:
- 避免在回调里做重操作:如每次调用
JSON.parse、正则test未预编译、或访问深层嵌套属性前不判空 -
大数据量(>10k)时,考虑用
for循环手动构建结果数组,减少函数调用和闭包开销 -
filter对稀疏数组(如[1, , 3])会跳过空槽,不触发回调 —— 这和map行为一致,但容易被忽略 - 空数组调用
filter总是返回[],不会报错
真正难的不是写对语法,而是想清楚“过滤条件是否覆盖所有分支”,尤其是 null、0、false、"" 这些 falsy 值要不要保留 —— 它们不会被自动跳过,得靠显式判断。











