为什么“undefined == false”返回false?

问题描述 投票:0回答:7

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

undefined == false;
null == false;

返回 false。为什么?

javascript
7个回答
46
投票

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

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
是假的


1
投票

来自无与伦比的 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 这个看似“糟糕”的方面实际上是一种力量的源泉。


0
投票

所以 undefined 确实意味着未定义。非 False、非 True、非 0、非空字符串。因此,当您将 undefined 与 anything 进行比较时,结果始终为 false,它not 等于那个。


-1
投票

你的问题是一半,因为我们将 undefined/ null 与任何其他类型进行比较。 我们将得到错误的回报。 即使我们使用 == 运算符,也不会发生强制转换。


-2
投票

未定义与 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

-2
投票

事情就是这样,因为事情就是这样。 :)

在此处阅读 ECMA 标准:https://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3


-2
投票

根据规范流程

如果 Type(y) 为 Boolean,则返回比较结果 x == ToNumber(y).

1) undefined == false; -> undefined == Number(false); -> undefined == 0;
2) null == false; -> null == Number(false); -> null == 0;

这些情况没有规则,因此请遵循最后一步中的行为:

返回错误。

© www.soinside.com 2019 - 2024. All rights reserved.