为什么“未定义等于假”返回假?

IT技术 javascript
2021-02-28 01:39:16

当我将 undefined 和 null 与 Boolean false 进行比较时,该语句返回 false:

undefined == false;
null == false;

它返回假。为什么?

6个回答

由于原始答案指向规范被删除,我想在此处提供规范的链接和简短摘录。

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 确实有值。它告诉我们有些事情并非如此。undefinednull不应该被给予我们的任何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 与任何内容进行比较时,结果总是错误的,它等于那个。

undefined == null 是真的。
2021-04-22 01:39:16
@asantaballa null == undefined 因为它被定义为这样:ecma-international.org/ecma-262/5.1/#sec-11.9.3
2021-04-25 01:39:16
哇,@SLaks。看起来如此,我很惊讶,也有点失望。读起来似乎是因为“==”运算符可以在两者之间进行强制转换。同意 Xander 的观点,“===”没有用,对我来说更“直观”。很高兴你长大了,今天自己学到了一些东西!
2021-05-08 01:39:16
在 JavaScript 中尽可能使用 ===。== 给人一种错觉,即两个值实际上可能不完全相等。(5 ==“5”为真。5 ===“5”为假。)
2021-05-10 01:39:16

来自无与伦比的 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 的这个看似“糟糕”的方面是强大的源泉。

@Bergi 我很清楚谁为 MDN 做出了贡献。不过,MDN 本身是由 Mozilla 创建的。如果你要学究气,那就做对了。
2021-04-30 01:39:16
不,MDN 不是由公司创建的。这些文章是由任意志愿者撰写的,它是一个 wiki :-)
2021-05-14 01:39:16

根据上面提到的规范:

如果 Type(y) 是布尔值,则返回比较结果 x == ToNumber(y)。

Number(undefined) = NaN;

false == NaN // false

此外,如果我们改变顺序 false == undefined

如果 Type(x) 是布尔值,则返回比较结果 ToNumber(x) == y。

Number(false) = 0;
0 == undefined

这种情况没有规则,因此请使用默认行为:

返回假。

它来自规范,所以我刚从这里得到它。如果你有什么要说的,请继续。
2021-04-24 01:39:16
我说你误读或误解了规范。顺便说一句,链接您引用的文档会很好。
2021-05-08 01:39:16
ToNumber永远不会被调用undefined不知道你从哪里得到的。
2021-05-17 01:39:16

您的问题是一半,因为我们将 undefined/null 与任何其他类型进行比较。我们将得到虚假回报。没有强制发生,即使我们使用 == 操作符。