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);
filter 是浅层遍历,时间复杂度 O(n),但实际开销取决于回调函数:

JSON.parse、正则 test 未预编译、或访问深层嵌套属性前不判空for 循环手动构建结果数组,减少函数调用和闭包开销filter 对稀疏数组(如 [1, , 3])会跳过空槽,不触发回调 —— 这和 map 行为一致,但容易被忽略filter 总是返回 [],不会报错真正难的不是写对语法,而是想清楚“过滤条件是否覆盖所有分支”,尤其是 null、0、false、"" 这些 falsy 值要不要保留 —— 它们不会被自动跳过,得靠显式判断。