arr.filter(Boolean) 是清理数组假值最简洁有效的方式,它保留所有真值元素(如 1、'hello'、true、'0'、[]),剔除 false、0、''、null、undefined、NaN。

用 Array.prototype.filter() 配合 Boolean 构造函数,是清理数组中假值(falsy values)最简洁有效的方式之一。它会保留所有转为 true 的元素,剔除 false、0、''(空字符串)、null、undefined 和 NaN。
为什么 Boolean 能直接用作 filter 的回调函数
Boolean 是一个可调用的构造函数,当不带 new 调用时(即 Boolean(value)),它会将传入值强制转换为布尔类型并返回结果。而 filter 的回调函数期望返回一个布尔值来决定是否保留当前元素——这恰好与 Boolean 的行为完全匹配。
注意:不能写成 filter(Boolean())(加括号就变成执行后返回 false),必须是 filter(Boolean)(传递函数引用)。
常见假值清理效果示例
以下数组包含典型假值,使用该方法后只留下“真值”元素:
const arr = [0, 1, '', 'hello', null, undefined, NaN, false, true, '0', []]; const cleaned = arr.filter(Boolean); // → [1, 'hello', true, '0', []]
说明:'0' 和空数组 [] 是真值(非空字符串、非空对象都为 true),所以被保留;而 0、''、null 等明确属于 falsy,被过滤掉。
与手写回调函数的对比
等价的手写写法是 arr.filter(x => Boolean(x)) 或更简化的 arr.filter(x => x)。但直接传 Boolean 更短、无闭包开销、语义清晰。
-
arr.filter(Boolean)—— 推荐,简洁、高效、意图明确 -
arr.filter(x => x)—— 常见,但对0、''等仍正确,本质相同 -
arr.filter(x => x != null && x !== '' && x !== 0 && !isNaN(x))—— 冗长且易错,不推荐
注意事项和边界情况
这个方法按 JavaScript 的 falsy 规则工作,无需额外判断,但需清楚它的行为边界:
-
0、-0、0n(BigInt 零)都会被过滤 -
''(空字符串)被过滤,但' '(含空格)是真值,会被保留 -
{}、[]、new Date()、/regex/全部保留,即使内容为空或无效 -
new Boolean(false)是对象,为真值,也会被保留(极少出现,但需知道)

















