JavaScript 判断空值:0 不算空的正确写法与 !value 的陷阱

JavaScript 里”空值”的定义因场景而异,!value 是最常见的误用——它会把 0falseNaN'' 全部当作空值处理,往往不符合预期。

陷阱:!value 的误判范围

const values = [0, false, NaN, '', null, undefined];
values.filter(v => !v);
// [0, false, NaN, '', null, undefined]  ← 全部被误判为空

如果 0 是有效值(比如数量、评分、坐标),用 !value 会导致它被误过滤。

== null:同时覆盖 null 和 undefined

== 宽松相等只在 nullundefined 之间成立,是检测这两者最简洁的方式:

null == null        // true
undefined == null   // true
0 == null           // false
'' == null          // false
false == null       // false

用法:

function isNullish(value) {
    return value == null;  // 等价于 value === null || value === undefined
}

加上空字符串判断

大多数场景下”空值”包括 nullundefined 和空字符串:

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/undefinedvalue == null
null/undefined/空字符串value == null || value === ''
同时包含空白字符串value == null || value?.trim() === ''
非空对象(有属性)Object.keys(value).length > 0
非空数组Array.isArray(value) && value.length > 0

空值合并运算符 ??

ES2020 引入的 ?? 只在左侧为 nullundefined 时取右侧默认值,不误判 0false

const count = userInput ?? 0;  // userInput 为 null/undefined 时取 0

// 对比 ||:
const count2 = userInput || 0; // userInput 为 0 时也会取右侧!

需要默认值时优先用 ?? 而非 ||