JavaScript 里”空值”的定义因场景而异,!value 是最常见的误用——它会把 0、false、NaN、'' 全部当作空值处理,往往不符合预期。
陷阱:!value 的误判范围
const values = [0, false, NaN, '', null, undefined];
values.filter(v => !v);
// [0, false, NaN, '', null, undefined] ← 全部被误判为空
如果 0 是有效值(比如数量、评分、坐标),用 !value 会导致它被误过滤。
== null:同时覆盖 null 和 undefined
== 宽松相等只在 null 和 undefined 之间成立,是检测这两者最简洁的方式:
null == null // true
undefined == null // true
0 == null // false
'' == null // false
false == null // false
用法:
function isNullish(value) {
return value == null; // 等价于 value === null || value === undefined
}
加上空字符串判断
大多数场景下”空值”包括 null、undefined 和空字符串:
function isEmpty(value) {
return value == null || value === '';
}
isEmpty(null) // true
isEmpty(undefined) // true
isEmpty('') // true
isEmpty(0) // false ← 0 不算空
isEmpty(false) // false
isEmpty([]) // false
isEmpty(' ') // false(有空格的字符串不算空)
加上空白字符串判断
如果全是空格的字符串也要视为空:
function isEmpty(value) {
return value == null ||
(typeof value === 'string' && value.trim() === '');
}
isEmpty(' ') // true
场景对照表
| 场景 | 推荐写法 |
|---|---|
| 只判断 null/undefined | value == null |
| null/undefined/空字符串 | value == null || value === '' |
| 同时包含空白字符串 | value == null || value?.trim() === '' |
| 非空对象(有属性) | Object.keys(value).length > 0 |
| 非空数组 | Array.isArray(value) && value.length > 0 |
空值合并运算符 ??
ES2020 引入的 ?? 只在左侧为 null 或 undefined 时取右侧默认值,不误判 0 和 false:
const count = userInput ?? 0; // userInput 为 null/undefined 时取 0
// 对比 ||:
const count2 = userInput || 0; // userInput 为 0 时也会取右侧!
需要默认值时优先用 ?? 而非 ||。
