当我将undefined和null与Boolean false进行比较时,该语句返回false:
undefined == false;
null == false;
它返回false。为什么呢?
答案 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确实有价值。它告诉我们事情并非如此。而undefined
和null
不应该给我们任何价值。同样,它没有什么可以转换为它的抽象相等比较,因此结果总是错误的。这也是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