前言
在 JavaScript 中,null、undefined 和 NaN 是三种不同的特殊值,它们在使用时有着不同的含义和用途。而我们在做项目时候,常常与它们打交道。
因此,在编写 JavaScript 代码时需要了解它们之间的区别和相互之间的隐式转换,以避免产生错误或不可预料的行为。比如:
1. 在使用 if 语句进行条件判断时,没有考虑到 undefined 可能隐式转换为 false。
let foo;
if (foo) {console.log("This should not be executed");
}
在这个例子中,由于 foo 的值为 undefined,因此 if 语句会将其隐式转换为 false,从而不执行其中的代码。如果忘记了这种隐式转换,就可能导致逻辑上的错误。
2. 在进行数学运算时,没有考虑到 NaN 的影响。
let bar = "hello";
console.log(bar - 1); // NaN
console.log(typeof (bar - 1)); // number
在这个例子中,由于将一个字符串减去一个数字会产生 NaN,因此 bar - 1 的结果就是 NaN。如果没有考虑到 NaN 的影响,就可能导致无效的计算结果或不可预测的行为。
3.在进行对象属性访问时,没有考虑到某个属性的值可能为 undefined。
let baz = {};
console.log(baz.prop); // undefined
console.log(baz.prop.foo.bar); // TypeError: Cannot read property 'foo' of undefined
在这个例子中,由于 baz 对象中不存在名为 prop 的属性,因此访问 baz.prop 会返回 undefined。然而,再次访问 undefined.prop.foo.bar 就会导致 TypeError 错误。如果没有考虑到这种情况,就可能导致运行时错误。
一、null
null 表示一个空对象指针。当一个变量被赋值为 null 时,它表示一个空对象引用,并且 typeof 运算符会返回 "object"。
let foo = null;
console.log(foo); // null
console.log(typeof foo); // object
二、undefined
undefined 表示一个未定义的值。当一个变量被声明但没有被赋值时,它的值为 undefined。同时,函数没有返回值时也会返回 undefined。typeof 运算符会返回 "undefined"。
let bar;
console.log(bar); // undefined
console.log(typeof bar); // undefinedfunction baz() {}
console.log(baz()); // undefined
三、NaN
NaN 表示不是数字的值。当进行无效的数学操作或将非数字字符串转换为数字时,会返回 NaN。NaN 与任何值(包括它自己)都不相等。
console.log(0 / 0); // NaN
console.log("hello" - 1); // NaN
console.log(NaN == NaN); // false
NaN 与任何值(包括它自己)都不相等这里可能有人不能理解。NaN和NaN明明长得一样,为什么不相等呢?可以从它的定义去理解“不是数字的值”表示这个值仅仅不是数字,可以是除数字外的任何值,既然是任何值了,两个不是数字的任何值,自然不相等。
四、==和===的情况
在 JavaScript 中,null、undefined 和 NaN 之间的相等比较是一个比较微妙的问题。由于它们的含义和类型都不同,因此它们之间的相等比较有时可能会产生出人意料的结果。
-
==的特殊情况
1. null 和 undefined
特别注意:null 和 undefined 相等比较时,它们会相等!这是因为在 JavaScript 中,它们被认为是相同类型的“空值”。
console.log(null == undefined); // true
console.log(null == null); // true
console.log(undefined == undefined); // true
console.log(null == 0); // false
console.log(undefined == "hello"); // false
2. NaN
NaN 和任何值,包括 NaN 自身,在相等比较时都不相等。这是因为 NaN 表示不是数字的值,它与任何值的比较结果都为 false。
console.log(NaN == NaN); // false
console.log(NaN == 0); // false
console.log(NaN == "hello"); // false
需要注意的是,虽然 NaN 与任何值比较的结果都为 false,但在使用 isNaN() 函数时,它会将传入的值转换为数字后再进行比较。
console.log(isNaN(NaN)); // true NaN转为数字是NaN
console.log(isNaN("hello")); // true 字符串转化为数字是NaN
console.log(isNaN(undefined)); // true undefined转化为数字是NaN,因为 undefined 表示一个未定义的值,在转换为数字时没有明确的意义
console.log(isNaN(null)); // false null转化为数字是0
-
===的特殊情况
ull、undefined 和 NaN 是不同的类型,在严格相等比较(===)时会被认为是不相等的。同时,与 NaN 进行严格相等比较时,无论与哪个值比较都会返回 false,因为 NaN 是唯一不等于自身的值。
console.log(null === undefined); // false
console.log(null === null); // true
console.log(undefined === undefined); // true
console.log(NaN === null); // false
console.log(NaN === undefined); // false
console.log(NaN === NaN); // false