如果我们alert(null==undefined)
输出到true
.
这是什么逻辑原因。
这是在javascript中硬编码的东西还是对此有解释。
语言规范明确指出:
如果 x 为 null 且 y 未定义,则返回 true
我不知道任何解释该决定的原因的语言设计过程记录,但==
有处理不同类型的规则,并且“null”和“undefined”都是“无”的意思,所以让它们成为相等具有直观意义。
(如果您不想摆弄打字,请===
改用)。
使用双等号运算符会强制 Javascript 进行类型强制。
换句话说,当你这样做时x == y
,如果x
和y
不是同一类型,JavaScript 会在比较之前将一个值转换为另一个值,就像比较字符串和数字一样,字符串总是转换为一个数字然后比较
出于这个原因,在 JavaScript 中对混合类型的许多比较可能会导致出乎意料或违反直觉的结果。
如果你想在 JavaScript 中进行比较,通常最好使用三等号运算符===
而不是双等号。这不会进行类型强制;相反,如果类型不同,则返回 false。这通常是您需要的。
只有当你绝对确定你需要它时,你才应该使用 double-equal。
出于同样的原因0 == "0"
- javascript 是松散类型的 - 如果可以将某些内容转换为其他内容,那么除非您使用 ===
alert(null===undefined);
会给你假的。
至于为什么会发生这些特定的转换 - 答案很简单“规范说这是应该发生的”。除了“因为它这么说”之外,不需要其他原因来解释为什么编程语言会以某种方式表现。
编辑:稍微好一点的答案 - 在 Javascript 中,某些对象/值在转换为布尔值时是“真实的”或“虚假的”。0(整数零)、“0”(字符串中的字符零)、“”(空字符串)都是假的。如果没有更好的比较可以使用,则适用布尔运算。
这就是为什么“0”不等于空字符串,但“0”和“”都等于假的原因。
我们知道,
If x is null and y is undefined, return true
undefined == null => true,原因可能是两者都转换为布尔值,因为我们知道 javascript 执行类型转换。所以这将导致 null 和 undefined 转换为 false 并且 false == false 为 true
==
比较运算符不检查类型。null
并且undefined
都返回false
。这就是为什么您的代码实际上是在检查是否false
等于false
.
> null == undefined;
< true
> false == false
< true
但是它们的类型并不相同。
> typeof undefined;
< "undefined"
> typeof null;
< "object"
因此,下一条语句将返回 false,因为===
比较运算符会检查类型及其值。
> undefined === null;
< false