null
undefined
语法
这是最容易解释的。看:
// This is null: null // This is undefined: undefined
两者使用完全不同的语法结构,这是因为它们表示两种不同的事物。
语义学
编程语言中的一切都是有原因的。没有两件事是相同的。如果您认为它们是,也许您没有考虑导致其概念和设计的用例。
今天讨论的两个也不例外。按如下方式考虑 和 语义值 会有所帮助:null
undefined
undefined
是隐含的价值缺失;null
是极度缺乏价值的。
解释这一点的最好方法是举个例子。我会厚颜无耻地偷走 Ryan Florence 写的那篇:
我的钥匙在柜台上吗?
undefined
: 不知道,我没看。null
:我检查了,没有键。
用更编程的术语来说,指向内存中已分配但尚没有任何值的空间。,则指向内存中分配的指针,该指针表示无效的内存访问。undefined
null
斯蒂芬·柯蒂斯 (Stephen Curtis) 写了一篇关于这个主题的精彩文章。我强烈建议你阅读它。
更实际地说,用于描述价值的缺失,因为我们不知道它是否存在,而描述价值的缺失,因为我们知道它不存在。is 直到我们获取它们,如果服务器没有返回任何用户,则 becomes 。undefined
null
user
undefined
user
null
运行
当然,两者在 runtime 上的行为完全不同。
undefined
是 Literal 类型。这就是为什么你要检查一下 type 是否根本没有定义。typeof thing === 'undefined'
thing
null
是一个对象。如果你觉得这很奇怪,下一句话就会让你的世界天翻地覆。
JavaScript 中的一切都是一个对象。
字符串是对象,数字是对象,数组是对象,类是对象,而对象是对象。指向值的所有东西都是一个对象。为方便起见,会缩小一些指针的类型,例如 is a string,而不是 object。既然你刚刚知道这是一个指针,请考虑它可能是什么类型。typeof 'foo'
null
这也是为什么使用严格相等运算符 (包括它们的类型进行比较) 时不匹配,但在使用松散相等运算符 (忽略类型并专注于值,两者都缺少值) 时不匹配的原因。
null
undefined
===
==
在运行时,隐式和显式缺失值之间的差异可以帮助您处理不同的情况。不过,这通常是我们追求的价值,而不是它缺失的原因,这可能会导致误解,例如关于和成为同一事物的误解。null
undefined
运行时行为也证实了这里的语义差异。
const user = { name: undefined } // Referencing the existing key that // equals to undefined... user.name // undefined // ...yields the same value and type // as referencing a non-existing key. user.address // undefined
等于 的对象键被视为缺失。等于的键仍然存在。亲自看看:undefined
null
JSON.stringify({ a: undefined, b: null }) // {"b":null}
希望这能为你解决这个问题。请随时与仍然犯错的人分享这篇文章,并保持原样。null
undefined