JS 判断空值别只写 !value:0 和 false 会被误伤

前端最常见的”低级 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——用宽松等号,同时匹配 nullundefined(这是 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。这类场景统一用 ??

表格速查

表达式什么算”空”
!valuefalsy:0, false, NaN, "", null, undefined
value == nullnull, undefined
value === "" || value == nullnull, undefined, ""
lodash _.isEmpty(value)null, undefined, "", [], {}, Map(), Set()

一句话总结

!value 判空是懒省事,业务代码里最好写 value == null || value === "",避免把 0 和 false 一起干掉。