当我将 undefined 和 null 与 Boolean false 进行比较时,该语句返回 false:
undefined == false;
null == false;
它返回假。为什么?
当我将 undefined 和 null 与 Boolean false 进行比较时,该语句返回 false:
undefined == false;
null == false;
它返回假。为什么?
由于原始答案指向规范被删除,我想在此处提供规范的链接和简短摘录。
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
ECMA 规范文档列出了undefined == false
返回 false的原因。虽然没有直接说为什么会这样,但回答这个问题最重要的部分在于这句话:
比较 x == y,其中 x 和 y 是值,产生真或假。
如果我们查找 null 的定义,我们会发现如下内容:
NULL 或 nil 表示“无值”或“不适用”。
在 Javascript 中,undefined
处理方式相同。它没有任何value。但是,false 确实有值。它告诉我们有些事情并非如此。而undefined
和null
不应该被给予我们的任何value。同样,对于抽象的相等比较,它无法转换为任何内容,因此结果始终为假。这也是null == undefined
返回 true 的原因(它们都没有任何value)。但应该注意的是,null === undefined
由于它们的类型不同,返回 false。(在控制台中使用typeof(null)
和typeof(undefined)
进行检查)
不过,我很好奇的是,NaN
与任何东西进行比较总是会返回 false。甚至在与自己进行比较时。[NaN == NaN
返回假]
另外,另一个奇怪的信息:[typeof NaN
返回“数字”]
如果可能,您应该避免使用 == 运算符来比较两个值。而是使用 === 来真正查看两个值是否彼此相等。== 给人一种错觉,即两个值实际上是完全相等的,但它们可能不是通过使用强制转换来实现的。例子:
5 == "5"
是真的
5 === "5"
是假的
"" == false
是真的
"" === false
是假的
0 == false
是真的
0 === false
是假的
所以未定义真的意味着未定义。不是 False,不是 True,不是 0,不是空字符串。因此,当您将 undefined 与任何内容进行比较时,结果总是错误的,它不等于那个。
来自无与伦比的 MDN,由 JavaScript 的创建者公司赞助。
JavaScript 提供了三种不同的值比较操作:
- 使用 === 的严格相等(或“三重相等”或“同一性”),
- 使用 == 的松散相等(“双重相等”),
- 和 Object.is(ECMAScript 中的新功能 > 6)。
选择使用哪种操作取决于您要执行的比较类型。
简而言之,double equals 将在比较两个事物时执行类型转换;三重相等将在没有类型转换的情况下进行相同的比较(如果类型不同,则总是返回 false);和 Object.is 的行为方式与三重相等,但对 NaN 和 -0 和 +0 进行了特殊处理,因此最后两个不相同,而 Object.is(NaN, NaN) 将为真. (通常将 NaN 与 NaN 进行比较——即使用双等号或三等号——计算结果为 false,因为 IEEE 754 是这样说的。)请注意,这些之间的区别都与它们对原语的处理有关;他们都没有比较参数在结构上在概念上是否相似。对于任何具有相同结构但本身是不同对象的非原始对象 x 和 y,上述所有形式都将评估为假。
有关 JavaScript 中平等全貌的视觉概览:https : //dorey.github.io/JavaScript-Equality-Table/
事实是,当您了解 JavaScript 的工作原理时,JavaScript 的这个看似“糟糕”的方面是强大的源泉。
根据上面提到的规范:
如果 Type(y) 是布尔值,则返回比较结果 x == ToNumber(y)。
Number(undefined) = NaN;
false == NaN // false
此外,如果我们改变顺序 false == undefined
如果 Type(x) 是布尔值,则返回比较结果 ToNumber(x) == y。
Number(false) = 0;
0 == undefined
这种情况没有规则,因此请使用默认行为:
返回假。
您的问题是一半,因为我们将 undefined/null 与任何其他类型进行比较。我们将得到虚假回报。没有强制发生,即使我们使用 == 操作符。