23

如果我们alert(null==undefined)输出到true.

这是什么逻辑原因。

这是在javascript中硬编码的东西还是对此有解释。

4

5 回答 5

35

语言规范明确指出

如果 x 为 null 且 y 未定义,则返回 true

我不知道任何解释该决定的原因的语言设计过程记录,但==有处理不同类型的规则,并且“null”和“undefined”都是“无”的意思,所以让它们成为相等具有直观意义。

(如果您不想摆弄打字,请===改用)。

于 2013-05-17T11:27:17.440 回答
10

使用双等号运算符会强制 Javascript 进行类型强制。

换句话说,当你这样做时x == y,如果xy不是同一类型,JavaScript 会在比较之前将一个值转换为另一个值,就像比较字符串和数字一样,字符串总是转换为一个数字然后比较

出于这个原因,在 JavaScript 中对混合类型的许多比较可能会导致出乎意料或违反直觉的结果。

如果你想在 JavaScript 中进行比较,通常最好使用三等号运算符===而不是双等号。这不会进行类型强制;相反,如果类型不同,则返回 false。这通常是您需要的。

只有当你绝对确定你需要它时,你才应该使用 double-equal。

于 2013-05-17T11:29:43.687 回答
6

出于同样的原因0 == "0"- javascript 是松散类型的 - 如果可以将某些内容转换为其他内容,那么除非您使用 ===

alert(null===undefined);

会给你假的。

至于为什么会发生这些特定的转换 - 答案很简单“规范说这是应该发生的”。除了“因为它这么说”之外,不需要其他原因来解释为什么编程语言会以某种方式表现。

编辑:稍微好一点的答案 - 在 Javascript 中,某些对象/值在转换为布尔值时是“真实的”或“虚假的”。0(整数零)、“0”(字符串中的字符零)、“”(空字符串)都是假的。如果没有更好的比较可以使用,则适用布尔运算。

这就是为什么“0”不等于空字符串,但“0”和“”都等于假的原因。

于 2013-05-17T11:26:02.680 回答
0

我们知道,

If x is null and y is undefined, return true

undefined == null => true,原因可能是两者都转换为布尔值,因为我们知道 javascript 执行类型转换。所以这将导致 null 和 undefined 转换为 false 并且 false == false 为 true

于 2022-01-29T16:05:17.930 回答
-2

==比较运算符不检查类型。null并且undefined都返回false。这就是为什么您的代码实际上是在检查是否false等于false.

> null == undefined;
< true
> false == false
< true

但是它们的类型并不相同。

> typeof undefined;
< "undefined"
> typeof null;
< "object"

因此,下一条语句将返回 false,因为===比较运算符会检查类型及其值。

> undefined === null;
< false
于 2013-05-17T11:33:15.323 回答