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

时间:2013-10-09 16:21:11

标签: javascript

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

undefined == false;
null == false;

它返回false。为什么呢?

8 个答案:

答案 0 :(得分:34)

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

http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

ECMA规范文档列出了undefined == false返回false的原因。虽然没有直接说明为什么会这样,但回答这个问题最重要的部分在于这句话:

The comparison x == y, where x and y are values, produces true or false.

如果我们查找null的定义,我们会发现类似这样的内容:

NULL or nil means "no value" or "not applicable".

在Javascript中,undefined的处理方式相同。它没有任何价值。但是,false确实有价值。它告诉我们事情并非如此。而undefinednull不应该给我们任何价值。同样,它没有什么可以转换为它的抽象相等比较,因此结果总是错误的。这也是null == undefined返回true的原因(它们都没有任何值)。应该注意的是null === undefined因为它们的类型不同而返回false。 (在控制台中使用typeof(null)typeof(undefined)进行检查)

我很好奇的是,将NaN与任何内容进行比较总是返回false。即使将它与自身进行比较。 [NaN == NaN返回false]

另外,另一条奇怪的信息:[typeof NaN返回“数字”]


严格平等

如果可能,您应该避免使用==运算符来比较两个值。而是使用===来真正看出两个值是否彼此相等。 ==给出一种错觉,即当两个值可能不是通过使用强制时,它们确实完全相同。例子:

5 == "5"是真的

5 === "5"是假的

"" == false是真的

"" === false是假的

0 == false是真的

0 === false是假的

答案 1 :(得分:1)

这是因为它是如此。 :)

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

答案 2 :(得分:0)

所以未定义的确意味着未定义。不是假,不是真,不是0,不是空字符串。因此,当您将undefined与任何进行比较时,结果始终为false, not 等于该值。

答案 3 :(得分:0)

From the incomparable MDN, sponsored by the company of JavaScript's creator.

  

JavaScript提供了三种不同的值比较操作:

     
      
  • 严格平等(或“三等于”或“身份”)使用===,
  •   
  • 使用==,
  • 的松散等式(“双等于”)   
  • 和Object.is(ECMAScript中的新增功能> 6)。
  •   
     

选择使用哪种操作取决于哪种操作   比较你想要表现。

     

简而言之,double equals会在比较时执行类型转换   两件事情;三等于   将在没有类型转换的情况下进行相同的比较   如果类型不同则返回false);和Object.is将表现出来   与三等于相同,但对NaN和-0进行特殊处理   和+0,以便最后两个不相同,而   Object.is(NaN,NaN)将为true。 (比较NaN和NaN   通常 - 即,使用双等于或三等于评估   为假,因为IEEE 754这么说。)请注意区别   这些都与他们对原语的处理有关;没有   他们比较了参数在概念上是否相似   结构体。对于具有相同的任何非原始对象x和y   结构,但它们本身就是不同的对象,所有上述形式   将评估为假。

用于直观地了解JavaScript中的完整图片: https://dorey.github.io/JavaScript-Equality-Table/

事实是,当你理解它的工作原理时,JavaScript看似“坏”的一面是权力的来源。

答案 4 :(得分:-1)

未定义不能= false,因为它尚未定义,因此不知道它是否存在

用英语说Anonymous = Fred或Anonymous!= Fred。

可能是弗雷德,可能是比尔,但目前我们还没有线索。

Null的类似规则。一开始你的头部有点痛苦,但这是一个非常有价值的规则,如果没有它,各种各样的模糊可能会蔓延到你的设计中。

例如,如何区分尚未输入的内容(空)或空白。

答案 5 :(得分:-1)

根据上面提到的规范:

  

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

Number(undefined) = NaN;

false == NaN // false

此外,如果我们更改订单false == undefined

  

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

Number(false) = 0;
0 == undefined

此案例没有规则,因此请使用默认行为:

  

返回false。

答案 6 :(得分:-1)

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

答案 7 :(得分:-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