arr.filter(Boolean)利用Boolean函数将数组元素转布尔值,保留真值(如非零数、非空字符串、对象等),过滤假值(false、0、null、undefined、NaN、空字符串),返回新数组。

使用 arr.filter(Boolean) 是一种简洁高效的方式,用于过滤掉数组中的“假值”(falsy values),只保留“真值”(truthy values)。
它背后的原理是什么?
Boolean 是 JavaScript 的内置构造函数,当以普通函数形式调用(不加 new)时,它会将传入的参数强制转换为布尔值:
– 返回 true 的有:非空字符串、非零数字、对象(含空数组、空对象)、Symbol、BigInt 等;
– 返回 false 的有:false、0、-0、0n、""(空字符串)、null、undefined、NaN。
filter 方法会遍历数组每一项,把该项作为参数传给回调函数;若回调返回 true,该项被保留在新数组中。所以 arr.filter(Boolean) 相当于:
arr.filter(item => Boolean(item)) → arr.filter(item => !!item)
常见适用场景
- 清理用户输入或 API 返回的混合数据,比如去除空字符串、
null、undefined:
['hello', '', null, 'world', undefined, 0, '!', false].filter(Boolean)
→ ['hello', 'world', '!']
- 处理表单字段数组,快速剔除未填写项;
- 扁平化后去除非值元素,例如:
[1, [2, 3], [], 4, null].filter(Boolean)会保留1、[2, 3]、4(注意:空数组[]是 truthy!); - 与
map配合做“映射 + 过滤”一步到位,如:strings.map(s => s.trim()).filter(Boolean)去除首尾空白后再清空串。
需要注意的细节
-
0、false、空字符串会被过滤掉——如果你需要保留数字0或布尔false,就不能直接用Boolean; - 空数组
[]和空对象{}是 truthy,不会被过滤; -
NaN是 falsy,会被过滤; - 该写法不改变原数组,返回一个新数组。
替代写法对比
等价但更显式的写法包括:
-
arr.filter(x => x)—— 利用 JS 的隐式转换,最简短,语义稍弱; -
arr.filter(x => x != null && x !== '' && !isNaN(x))—— 手动控制哪些 falsy 值要保留,适合特殊逻辑; -
arr.filter(Boolean)—— 明确表达“只留真值”,可读性好,且避免了x => x在某些 ESLint 规则下被警告的问题(如no-return-assign误判)。
不复杂但容易忽略:它不是魔法,只是巧妙复用了类型转换规则和高阶函数特性。

















