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