为什么“undefined等于false”返回false?

当我比较布尔值为false的undefined和null时,该语句返回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的处理方式相同。 这是没有任何价值的。 然而,错误确实有价值。 这是告诉我们,事情并非如此。 而undefinednull不应该给我们任何价值。 同样,没有什么可以转换为抽象的平等比较,因此结果总是假的。 这也是为什么null == undefined返回true(他们都没有任何价值)。 应该注意的是, null === undefined因为它们的types不同而返回false。 (在控制台中使用typeof(null)typeof(undefined)来检查它)

我很好奇的是,把NaN与任何东西进行比较总是会造成错误。 甚至在比较时也是如此。 [ NaN == NaN返回false]


严格平等

如果可能,应避免使用==运算符来比较两个值。 而是使用===来真正看看两个值是否相等。 ==给出了这样的错觉,即当两个值不可能被强制使用时,两个值是完全相等的。 例子:

5 == "5"是真的

5 === "5"是错误的

"" == false是真的

"" === false是假的

0 == false是真的

0 === false是假的

这是如此,因为它是如此:)

阅读ECMA标准: http : //ecma262-5.com/ELS5_HTML.htm#Section_11.9.3

PS:我使用这个网站,但官方是http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

来自JavaScript的创造者公司赞助的无与伦比的MDN。

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

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

select使用哪个操作取决于您要执行哪种比较。

简单地说,double等于比较两个事物时会执行一个types转换; 三倍等于没有types转换会做相同的比较(如果types不同,总是返回false); 而Object.is的行为方式与triple等同,但是对NaN和-0和+0进行了特殊的处理,所以最后两个不是相同的,而Object.is(NaN,NaN)将是true 。 (NaN和NaN通常比较,即使用double等于或者triple等于false,因为IEEE 754是这样说的)。注意这两者之间的区别都与它们对原语的处理有关。 没有一个比较参数在结构上是否在概念上相似。 对于任何具有相同结构但是不同对象本身的非原始对象x和y,所有上述forms将被计算为假。

对于JavaScript中整个图片的直观概述: https : //dorey.github.io/JavaScript-Equality-Table/

事实是,当你理解它是如何工作的时候,JavaScript的这个看似“坏”的方面是一个权力的来源。

所以未定义真的意味着未定义。 不是假的,不是真的,不是0,不是空string。 所以当你将undefined与任何东西进行比较的时候,结果总是假的, 等于那个。

Undefined can not = false,因为它尚未定义,所以不知道它是否存在

用英语来说,就像说匿名=弗雷德或匿名!=弗雷德。

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

类似的规则为空。 刚开始的时候总是有点痛苦,但这是一个非常有价值的规则,没有任何含糊不清的东西可能会蔓延到你的devise中。

例如如何区分未input的内容(null)或空白的内容。

根据上面提到的规范:

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

 Number(undefined) = NaN; false == NaN // false 

而且,如果我们改变命令false == undefined

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

 Number(false) = 0; 0 == undefined 

这种情况没有规则,所以工作的默认行为:

返回false。

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