前端最常见的”低级 bug”之一——接口返回:
{ "status": 0, "count": 0 }
代码里:
if (!data.status) {
// 走这里,本意是"没返回 status"
}
结果 status 明明是 0(业务成功),这段错误逻辑也被触发。!value 把 falsy 全当空,误伤面太大:
!0 // true
!false // true
!NaN // true
!"" // true
!null // true
!undefined// true
精确的”空”判断
如果空的定义是 null | undefined | "",那写:
function isEmpty(value) {
return value == null || value === "";
}
关键是 value == null——用宽松等号,同时匹配 null 和 undefined(这是 ESLint 少数允许 == 的地方)。
isEmpty(null) // true
isEmpty(undefined) // true
isEmpty("") // true
isEmpty(0) // false
isEmpty(false) // false
isEmpty([]) // false
想把 ” ” 也算空
用户输入常见”全是空格”的字符串:
function isEmpty(value) {
return value == null ||
(typeof value === "string" && value.trim() === "");
}
isEmpty(" ") // true
数组 / 对象也想算空
深一点的版本:
function isEmpty(value) {
if (value == null) return true;
if (typeof value === "string") return value.trim() === "";
if (Array.isArray(value)) return value.length === 0;
if (typeof value === "object") return Object.keys(value).length === 0;
return false;
}
isEmpty([]) // true
isEmpty({}) // true
isEmpty(0) // false
isEmpty(false) // false
lodash 的 _.isEmpty 差不多是这个思路。
?? vs ||:也是同一个坑
新版 JS 的空值合并:
const port = config.port ?? 3000; // 只有 null/undefined 才取默认
const port = config.port || 3000; // 0 也会被换掉,多半是 bug
配置里 port: 0 是合法的(让系统随机分配端口),用 || 会把它替换成 3000。这类场景统一用 ??。
表格速查
| 表达式 | 什么算”空” |
|---|---|
!value | falsy:0, false, NaN, "", null, undefined |
value == null | null, undefined |
value === "" || value == null | null, undefined, "" |
lodash _.isEmpty(value) | null, undefined, "", [], {}, Map(), Set() |
一句话总结
!value 判空是懒省事,业务代码里最好写 value == null || value === "",避免把 0 和 false 一起干掉。
