JavaScript 类型问题:NaN、null、undefined 的判断
在 JavaScript 开发中,类型判断是每天都会遇到的基础问题。这三个值——NaN、null、undefined——看似简单,却经常让人混淆。掌握它们的判断方法,是写好 JavaScript 代码的第一步。
先搞懂:这三个值有什么区别?
理解本质,才能正确判断。这三个值代表完全不同的含义。
NaN 是 "Not a Number"(非数字)的缩写,表示一个数学运算失败了。比如用 0 除以 0,或者把 "abc" 转成数值时,就会得到 NaN。特别注意:NaN 的数据类型仍然是 number,这是一个常见的困惑点。
null 表示"空值"或"无对象",是开发者主动赋值的结果,用来告诉程序这个变量当前没有指向任何有效对象。
undefined 表示"未定义"。变量声明后没赋值、函数没有返回值、访问对象不存在的属性时,返回的就是 undefined。
精确判断:每种值的最佳实践
判断 undefined
判断 undefined 有两种常用方式。第一种是直接用严格相等运算符:
let a;
console.log(a === undefined); // true
let obj = { name: 'Tom' };
console.log(obj.age === undefined); // true,属性不存在
第二种是用 typeof,这种方式更安全,即使访问一个未声明的变量也不会报错:
console.log(typeof a === 'undefined'); // true
console.log(typeof undefined === 'undefined'); // true
判断 null
判断 null 必须用严格相等运算符 ===,绝对不能用 ==:
let a = null;
console.log(a === null); // true
console.log(null === null); // true
这里有一个重要的坑:typeof null 返回的是 'object' 而不是 'null'。这是 JavaScript 诞生时留下的历史 bug,不能用来判断 null。
判断 NaN
NaN 是最特殊的值,因为它有一个反直觉的特性——它与任何值的比较,包括与自身比较,结果都是 false:
console.log(NaN === NaN); // false
console.log(NaN == NaN); // false
所以判断 NaN 必须用 Number.isNaN() 方法:
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(0 / 0)); // true
console.log(Number.isNaN(5)); // false
区分 isNaN() 和 Number.isNaN()
全局函数 isNaN() 和 Number.isNaN() 行为不同。前者会先把参数转成数值再判断:
console.log(isNaN('hello')); // true,'hello' 转成 NaN
console.log(isNaN('123')); // false,'123' 可以转成 123
console.log(Number.isNaN('hello')); // false,'hello' 不是 NaN
console.log(Number.isNaN(NaN)); // true
优先使用 Number.isNaN(),它只在值真正是 NaN 时才返回 true。
综合场景:如何一次判断多种情况?
封装一个判断函数是常用的实践方式:
function isUndefined(value) {
return value === undefined;
}
function isNull(value) {
return value === null;
}
function isNaN(value) {
return Number.isNaN(value);
}
function isEmpty(value) {
return value === undefined || value === null;
}
常见误区:千万别这么写
误区一:试图用 typeof 判断 null
console.log(typeof null); // 'object',这是语言 bug
console.log(typeof null === 'null'); // false,错误!
误区二:用 == 同时判断 null 和 undefined
console.log(null == undefined); // true,但这不意味着它们是同一个值
抽象相等会让 null 和 undefined 相等,但判断时必须明确指定。
误区三:把假值当作 null 或 undefined 处理
空字符串 ''、数字 0、布尔值 false 都是合法的值,不要误判:
console.log('' === null); // false
console.log(0 === undefined); // false
console.log(false === null); // false
如果业务上需要判断这些"假值",应该用更宽泛的条件:
function isFalsy(value) {
return !value;
}
console.log(isFalsy('')); // true
console.log(isFalsy(0)); // true
console.log(isFalsy(null)); // true
一张表记住所有判断方法
| 判断需求 | 正确写法 | 返回 true 的情况 |
|---|---|---|
| 判断 undefined | value === undefined |
值是 undefined |
| 判断 null | value === null |
值是 null |
| 判断 NaN | Number.isNaN(value) |
值是 NaN |
| 判断 null 或 undefined | value === null \|\| value === undefined |
值是 null 或 undefined |
| 判断假值(空字符串、0、false 等) | !value |
值是任意假值 |
实际开发中的建议
处理用户输入或外部数据时,按以下顺序判断是稳妥的做法:
- 先判断 undefined 或 null:用
value === null || value === undefined - 再判断 NaN:特别是涉及数学运算时
- 最后处理具体业务逻辑
function processInput(input) {
if (input === null || input === undefined) {
return '请输入有效值';
}
if (Number.isNaN(input)) {
return '请输入数字';
}
return input * 2;
}
优先使用 Number.isNaN() 判断 NaN,使用 === undefined 判断 undefined,使用 === null 判断 null。这些方法可靠、直观、不易出错。

暂无评论,快来抢沙发吧!