50

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

undefined == false;
null == false;

它返回假。为什么?

4

7 回答 7

43

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

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

于 2013-10-09T16:42:06.510 回答
0

所以未定义实际上意味着未定义。不是 False,不是 True,不是 0,不是空字符串。因此,当您将 undefined 与任何东西进行比较时,结果总是错误的,它等于那个。

于 2013-10-09T16:23:32.217 回答
0

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

于 2015-08-06T17:04:47.680 回答
-1

之所以如此,是因为如此。:)

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

于 2013-10-09T16:43:22.423 回答
-1

根据上面提到的规范:

如果 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

这种情况没有规则,所以使用默认行为:

返回假。

于 2015-08-06T16:45:26.970 回答
-1

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

于 2018-06-07T05:12:27.747 回答
-2

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
于 2013-10-09T16:23:40.923 回答