JS 里的”空值”判断经常被 !value 搞坏——它会把 0、false、NaN 都当成空,实际业务里这三个通常是有效值。
不推荐:!value
if (!value) { /* 错误率很高 */ }
会把这些都当”空”:
null、undefined✓(确实空)''✓(确实空)0✗(数字零是有效值)false✗(布尔假是有效值)NaN✗(通常需要单独处理)
推荐:精确判断
if (value == null || value === '') {
// 空值:null、undefined、空字符串
}
value == null 利用了宽松相等,同时捕获 null 和 undefined,不会误伤 0 或 false。
封装成工具函数:
function isEmpty(value) {
return value == null || value === '';
}
isEmpty(null) // true
isEmpty(undefined) // true
isEmpty('') // true
isEmpty(0) // false
isEmpty(false) // false
isEmpty([]) // false(空数组不是空)
isEmpty({}) // false(空对象不是空)
加上空白字符串处理
如果 " " 也要算空:
function isEmpty(value) {
return value == null ||
(typeof value === 'string' && value.trim() === '');
}
isEmpty(' ') // true
isEmpty(' x ') // false
用 ??= 做默认值赋值
ES2021 的空值合并赋值更精确:
let count = 0;
count ||= 10; // count = 10,因为 0 是 falsy(错误)
count ??= 10; // count = 0,因为 0 不是 null/undefined(正确)
只想在 null / undefined 时设默认值,用 ??= 而不是 ||=。
几种场景对应的写法
| 场景 | 推荐写法 |
|---|---|
| 只判断 null/undefined | value == null |
| null/undefined/空字符串 | value == null || value === '' |
| 加上空白字符串 | value == null || String(value).trim() === '' |
| 设默认值(0 是有效值) | value ??= defaultVal |
| 设默认值(0 也算空) | value ||= defaultVal |
表单校验里的典型误用
// ❌ 数量字段输入 0,会被误判为"未填写"
if (!form.quantity) {
showError('数量不能为空');
}
// ✓ 正确写法
if (form.quantity == null || form.quantity === '') {
showError('数量不能为空');
}
记住:!value 是”falsy 检查”,不是”空值检查”。两者在大多数场景下不等价。
