Difference between null / undefined / not defined?

null vs undefined vs not defined 差在哪?

前言

JavaScript 当中 nullundefined 两者都代表着存取的值不存在,甚至使用鬆散比較 == 时,两者也会被视为相等。但是在根本上两者是截然不同的东西,藉由这篇文章我来厘清解释他们两者之间的关系。

console.log(null == undefined); // true
console.log(null === undefined); // false

Null

null 意味着「存在但没有东西」,只能透过明确的赋予 null 来得到它。所以当拿到 null 数值时代表是开发者有意识的赋予,而不是因为其他原因而产生。比如说一个搜索功能,如果没有搜索到任何结果,那么就可以赋予 null 来代表结果没有任何东西。

const search = null;
console.log(search); // null

Undefined

undefined 意味着「不存在没东西」,默认情况下所有的变量都是 undefined,除非明确的赋予了其他的值之前它都会是 undefined。所以当拿到这个值大多数时候代表该数值真实意义上不存在。

let foo;
console.log(foo); // undefined

Not Defined

除了 nullundefined,还有另一个情境:not defined。这并不是一个具体的值,而是当你尝试存取一个根本没声明的变量时会直接抛出 not defined 错误。

console.log(bar); // ❌ ReferenceError: bar is not defined

总结

两者之间的差异只在于开发者的「意图」,虽然都代表「没东西」,但一个是「存在」一个是「不存在」,大多数时候会希望定义 null

奇怪的是实际上 undefined 可以被定义出来,定义定义上不存在的东西,是一件很奇怪但可行的事情,尽量不要这么做 😅 。

参考资料