null == undefined
确实评估为真,但null === undefined
评估为假。
这两个语句的区别在于相等运算符。Javascript 中的双等号将在比较它们之前将两个项目转换为相同的类型;对于null == undefined
,这意味着null
在完成比较之前将 转换为未定义的变量,因此相等。
我们可以用字符串和整数证明同样的效果:"12" == 12
是真的,但是"12" === 12
是假的。
此示例为我们提供了一种更简单的方法来讨论您的下一点,即为每个点添加一个。在上面的例子中,给整数加 1 显然会得到13
,但是使用字符串"12" + 1
会给我们一个字符串"121"
。这是完全有道理的,你不会想要任何其他方式,但是使用双等号运算符,原始的两个值被报告为相等。
这里的教训是始终优先使用三等号运算符而不是双等号,除非您特别需要比较不同类型的变量。
你的最后一点表明了null
一般的善变本质。这是一种奇特的野兽,任何尝试过使用可空数据库字段的人都会告诉你。Null 在计算机科学中有一个非常具体的定义,它在多种语言中以类似的方式实现,所以你描述的情况并不是一个特殊的 Javascript 怪异。空是奇怪的。不要期望它表现得像 的替代名称false
,因为它不是那样工作的。内置infinity
值可以以类似奇怪的方式表现,并且出于类似的原因。
不过,Javascript 确实有其怪异之处。您可能有兴趣阅读http://wtfjs.com/,其中包含 Javascript 所做的大量奇怪事情的条目。其中相当一部分与null
and相关undefined
(您知道实际上可以重新定义内置undefined
对象的值吗?!),其中大多数都附有对实际发生的情况和原因的解释。它可能有助于向您展示为什么事情会以它们的方式工作,并且肯定会有助于向您展示要避免的事情!如果不出意外的话,看看人们试图对糟糕的语言进行的一些滥用,这将是一个很好的娱乐阅读。