为什么“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
的处理方式相同。 这是没有任何价值的。 然而,错误确实有价值。 这是告诉我们,事情并非如此。 而undefined
和null
不应该给我们任何价值。 同样,没有什么可以转换为抽象的平等比较,因此结果总是假的。 这也是为什么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