Javascript “为什么?”;未定义等于假;返回错误?
当我将undefined和null与Boolean false进行比较时,语句返回false:Javascript “为什么?”;未定义等于假;返回错误?,javascript,Javascript,当我将undefined和null与Boolean false进行比较时,语句返回false: undefined == false; null == false; 它返回false。为什么?所以未定义实际上意味着未定义。非False、非True、非0、非空字符串。因此,当您将undefined与任何东西进行比较时,结果总是false,它并不等于false。undefined与false不是一回事,false是一个布尔对象(它的值为0,因此确实定义了它) 例如: var my_var; var
undefined == false;
null == false;
它返回false。为什么?所以未定义实际上意味着未定义。非False、非True、非0、非空字符串。因此,当您将undefined与任何东西进行比较时,结果总是false,它并不等于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
由于原始答案指向规范被删除,我想在这里提供一个链接和规范的简短摘录 ECMA规范文档列出了
undefined==false
返回false的原因。虽然没有直接说明原因,但回答这个问题最重要的部分在于这句话:
The comparison x == y, where x and y are values, produces true or false.
比较x==y,其中x和y是值,生成true或false。
如果我们查找null的定义,我们会发现如下内容:
NULL or nil means "no value" or "not applicable".
NULL或nil表示“无值”或“不适用”。
在Javascript中,未定义
的处理方式相同。它没有任何价值。但是,false确实有一个值。它告诉我们事情并非如此。而undefined
和null
不应该给我们任何价值。同样,它也无法转换为抽象的相等比较,因此结果总是错误的。这也是null==undefined
返回true的原因(它们都没有任何值)。但是应该注意,null===undefined
返回false,因为它们的类型不同。(在控制台中使用typeof(null)
和typeof(未定义)
检查它)
但我好奇的是,将NaN
与任何东西进行比较将始终返回false。即使是和它自己比较。[NaN==NaN
返回false]
另外,另一条奇数信息:[typeof NaN
返回“number”]
严格平等 如果可能,应该避免使用==运算符来比较两个值。而是使用===来真正查看两个值是否相等给人一种错觉,即两个值实际上完全相等,而不是使用强制。示例:
5==“5”
为真
5==“5”
为false
“”==false
为true
“”==false
为false
0==false
为true
0===false
为false之所以如此,是因为事实如此。:)
阅读此处的ECMA标准:根据上述规范: 如果类型(y)为布尔值,则返回比较结果x== 汤姆伯(y) 此外,如果我们更改订单
false==未定义
如果类型(x)是布尔值,则返回比较结果到数字(x)
==y
这种情况下没有规则,因此使用默认行为:
返回false
JavaScript提供了三种不同的值比较操作:
- 严格相等(或“三重相等”或“恒等式”),使用==
- 松散相等(“双相等”)使用==
- 和Object.is(ECMAScript>6中新增)
事实是,当你了解JavaScript的工作原理时,它的这个看似“糟糕”的方面是一个强大的源泉。当我们将未定义/null与任何其他类型进行比较时,你的问题是一半。 我们会有虚假的回报。
没有强制发生,即使我们使用==运算符。为什么你会认为它是真的?@SLaks因为
0==false
是真的,等等@abdulraziq:“我的意思是未定义也是假的”
-不,不是。它是未定义的
。顺便说一句,你应该使用严格的等式。为了说明false
和未定义的
之间的区别。。。我有三个苹果。我给简三个苹果。我还有苹果吗?(错)我还有桔子吗?(未定义)undefined==null
是真的。哇,@SLaks。看起来是这样,我很惊讶,也有点失望。读起来,似乎是因为“==”操作符可以在两者之间进行强制。同意Xander的观点,“==”不起作用,对我来说更“直观”。很高兴你长大了,今天我自己也学到了一些东西@Asantabala null==未定义,因为它被定义为so:在JavaScript中尽可能使用===始终使人产生错觉,认为两个值实际上完全相等,但它们可能不相等。(5==“5”为真。5==“5”为假。)@WesleyMurch也==!==。但是!undefined==true
是true:)@vp_arth我最喜欢的是undefined==null
和undefined!==null
(两者均为真)如果您要链接到某个标准,请链接到官方标准:在向下投票之前找到任何差异?除了您的
Number(undefined) = NaN;
false == NaN // false
Number(false) = 0;
0 == undefined