前言
在JavaScript中,NaN、null和undefined都是特殊的值,它们各自有不同的含义和用途。
undefined
未定义的值和定义未赋值的,不存在的对象属性。在JavaScript中,如果一个变量被声明了,但没有赋值,那么它的值就是undefined。另外,如果一个对象没有某个属性,那么访问这个属性就会返回undefined。在函数内部,如果一个变量没有被声明,那么它就是undefined。使用typeof
运算符可以检测一个变量是否为undefined。
// 声明一个变量但没有赋值,默认值为 undefined
let declaredButNotAssigned;
console.log(declaredButNotAssigned); // 输出 undefined
// 访问未声明的变量会抛出错误
// console.log(undeclaredVariable); // ReferenceError: undeclaredVariable is not defined
// 函数内部未声明的变量
function checkUndefined() {
console.log(undeclared); // ReferenceError
}
checkUndefined();
// 访问对象的未定义属性
let obj = {};
console.log(obj.nonExistentProperty); // 输出 undefined
// 使用 typeof 检测 undefined
console.log(typeof declaredButNotAssigned); // 输出 undefined
null
null是一种特殊的对象,表示无值。在JavaScript中,null通常用于表示一个空对象或空引用。例如,如果一个函数没有返回任何值,那么它的返回值就是null。另外,如果一个对象的某个属性不存在或没有赋值,那么该属性的值也可以是null。需要注意的是,null和undefined在某些情况下是相等的,但它们在本质上是不同的。
// 声明一个变量并赋值为 null
let nothing = null;
console.log(nothing); // 输出 null
// null 是一个对象类型
console.log(typeof null); // 输出 object(这是一个历史遗留问题,实际上在ES5后更准确的描述应该是 null)
// 函数返回 null
function findUserById(id) {
// 假设没有找到用户
if (id !== 1) {
return null;
}
return { name: 'Alice' };
}
let user = findUserById(2);
console.log(user); // 输出 null
NaN
NaN是一种特殊的数字,表示非数字。当一个数学运算无法得出有效的数字结果时,就会返回NaN。例如,0除以0的结果就是NaN。另外,NaN有一些特殊的行为,例如它与任何值都不相等,包括它自己。使用isNaN()
函数可以检测一个值是否为NaN。
// NaN的产生
let result = 0 / 0; // 结果是 NaN
console.log(result); // 输出 NaN
// 检测 NaN
let num = parseInt("hello"); // 尝试将字符串转换为数字,但失败了,结果是 NaN
console.log(isNaN(num)); // 输出 true
// NaN与任何值(包括它自身)比较都会返回false
console.log(NaN === NaN); // 输出 false
console.log(NaN == NaN); // 输出 false
// 正确检测NaN的方法
function isReallyNaN(value) {
return value !== value; // NaN是唯一不等于自身的值
}
console.log(isReallyNaN(NaN)); // 输出 true
总结
总结来说,NaN、null和undefined都是JavaScript中的特殊值,它们各自有不同的含义和用途。NaN表示非数字,null表示无值或空引用,而undefined表示未定义或不存在的值。