当我将 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
以同样的方式处理。它没有任何价值。但是,false 确实有一个值。它告诉我们事情并非如此。鉴于undefined
并且null
不应该给我们带来任何价值。同样,它也没有任何东西可以转换为它的抽象相等比较,因此结果总是错误的。这也是null == undefined
返回 true 的原因(它们都没有任何值)。应该注意的是,null === undefined
由于它们的类型不同,返回 false。(在控制台中使用typeof(null)
andtypeof(undefined)
来检查它)
不过,我很好奇的是,NaN
与任何东西进行比较总是会返回错误的。即使将其与自身进行比较。[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 中的新功能)。
选择使用哪种操作取决于您要执行的比较类型。
简而言之,双等号在比较两个事物时会进行类型转换;三等号将在不进行类型转换的情况下进行相同的比较(如果类型不同,则始终返回 false);和 Object.is 的行为方式与三等号相同,但对 NaN 和 -0 和 +0 进行了特殊处理,因此最后两个不一样,而 Object.is(NaN, NaN) 将为真. (通常将 NaN 与 NaN 进行比较——即,使用双等号或三等号——计算结果为假,因为 IEEE 754 是这样说的。)请注意,它们之间的区别都与它们对原语的处理有关。他们都没有比较参数在结构上是否在概念上相似。对于任何具有相同结构但本身是不同对象的非原始对象 x 和 y,上述所有形式都将评估为假。
有关 JavaScript 中相等性全貌的可视化概览: https ://dorey.github.io/JavaScript-Equality-Table/
事实是,当您了解 JavaScript 的工作原理时,JavaScript 的这个看似“坏”的方面是强大的源泉。
之所以如此,是因为如此。:)
在此处阅读 ECMA 标准:https ://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
根据上面提到的规范:
如果 Type(y) 是 Boolean,则返回比较结果 x == ToNumber(y)。
Number(undefined) = NaN;
false == NaN // false
此外,如果我们更改订单false == undefined
如果 Type(x) 是 Boolean,则返回比较 ToNumber(x) == y 的结果。
Number(false) = 0;
0 == undefined
这种情况没有规则,所以使用默认行为:
返回假。
您的问题是一半,因为我们将 undefined/null 与任何其他类型进行比较。我们会有错误的回报。即使我们使用 == 运算符,也不会发生强制。
Undefined 与 false 不同,false
它是一个布尔对象(其值为 0,因此它确实已定义)。
一个例子:
var my_var;
var defined = (my_var === undefined)
alert(defined); //prints true. It is true that my_var is undefined
my_var = 22;
defined = (my_var === undefined)
alert(defined); //prints false. my_var is now defined
defined = (false === undefined)
alert(defined); //prints false, false is defined
defined = (true === undefined)
alert(defined); //prints false, true is defined