Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript “为什么?”;未定义等于假;返回错误?_Javascript - Fatal编程技术网

Javascript “为什么?”;未定义等于假;返回错误?

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和null与Boolean false进行比较时,语句返回false:

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中新增)
选择使用哪种操作取决于哪种类型的操作 您希望执行的比较

简单地说,双等于将在比较时执行类型转换 两件事;三等分 将在不进行类型转换的情况下执行相同的比较(只需始终 如果类型不同,则返回false);和Object.is将表现为 与三重相等的方式相同,但对NaN和-0进行了特殊处理 和+0,因此后两个不是相同的,而 Object.is(NaN,NaN)将为真。(将NaN与NaN进行比较) 通常-即,使用双等于或三等于计算 错误,因为IEEE 754这么说。)请注意 这两者之间都与它们对原语的处理有关;没有一个 其中比较了参数在概念上是否相似 结构。对于具有相同属性的任何非基本体对象x和y 结构本身是不同的对象,所有上述形式 将计算为false

要查看JavaScript中平等性的全貌,请执行以下操作:


事实是,当你了解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