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