2017-09-15 111 views
0

对话很便宜,我会显示我的代码。为什么(!a)和(a == false)不相等?

var a; // a = undefined 
    if(a == false){ // As I typed == not ===, a needs to be translated to boolean (undefined == false) but it doesn't 
     return false; 
    } 
    else { 
     return true; 
    } 
    // true 

这将返回true,但我相信,这将返回false,因为不确定的是一样的错误,当我使用双相等。当我试图用

if(!a){..} else {..}; 
// false 

事情来到这里的怪我得到了我的错误,但直到这一刻我以为(!a)和(A == false)被完全平等的。

+2

only'undefined == null'为'true' not'undefined == false'。 –

+1

@ibrahimmahrir:这与'null'有什么关系? –

+0

@FelixKling他可能将它们混合起来(当使用'=='时,所有的falsy值都是相等的,但只有'null'和'undefined')。 –

回答

6

简短的回答:

!a值转换为布尔。
a == false的值与布尔值进行比较。

这些是两种不同的操作。


!a相当于Boolean(a) ? false : trueBoolean(a)返回false如果a

  • undefined
  • null
  • 0
  • ''
  • NaN
  • false

在其他情况下,它返回true

a == false会发生什么是bit more evolved,但没有那么复杂。发生的最重要的事情是false被转换为一个数字,所以你实际上比较a == 0。但undefined在比较算法中以特殊方式处理。它不会转换为任何其他类型,因此该算法仅返回false

I wrote the following interactive tool为JavaScript当然它会显示这是比较两个值时执行的算法的步骤:

enter image description here


类似的问题:

2

唯一正确的答案是 “这事情是这样的”。您的困惑的来源是JavaScript的一个特性,称为type coercion以及不同类型的相等组合(JavaScript中的==,===)。

有一张有趣的表格,告诉你JavaScript Equality Tabletrue的比较结果。

只有两个值,这将给true时-compared ==nullnullundefined

换句话说,x == null将是true当且仅当是xnullundefined

1

你有一个错误的假设。 x == false不同系xboolean。实际上,==就是它的own equality table

如果你不相信,随机的相关博客文章,这里是spec

7.2.12摘要相等比较

比较X == y,其中x和y的值,产生真或 错误。这样的比较如下进行:

  1. ReturnIfAbrupt(x)。
  2. ReturnIfAbrupt(y)。
  3. 如果Type(x)与Type(y)相同,则返回执行严格等式比较x === y的结果。
  4. 如果x为null且y未定义,则返回true。
  5. 如果x未定义且y为null,则返回true。
  6. 如果Type(x)是Number和Type(y)是String,则返回比较结果x == ToNumber(y)。
  7. 如果Type(x)是String并且Type(y)是Number,则返回比较结果ToNumber(x)== y。
  8. 如果Type(x)是布尔型,则返回比较结果ToNumber(x)== y。
  9. 如果Type(y)是布尔型,则返回比较结果x == ToNumber(y)。
  10. 如果Type(x)是String,Number或Symbol且Type(y)是Object,则返回比较结果x == ToPrimitive(y)。
  11. 如果Type(x)是Object且Type(y)是String,Number或Symbol,则返回比较结果ToPrimitive(x)== y。
  12. 返回false。

所以对于undefined == false:首先我们打#9,然后#12,其计算结果为假。

1

(!a)和(a == false)是绝对相等的。

您使用两个不同的运营商,并假定它们是绝对等于 - 从来没有做到这一点,是有原因的2个不同的运营商存在的,而不是1

现在,想到NaN(作为一个例子,其他人可以申请)。根据定义NaNfalsy价值,但不false价值,所以:

if(!NaN) {} // this will execute 
if(NaN == false) {} // this will not execute 

你觉得为什么出现这种情况?

由于==操作者确实键入每类型/值强制,从而NaN不强制地向false,而另一些,如0可以,但两者都将使用!

求和被认为falsy并转换为true

  • 操作者!使用定义的一组falsy值(false0''""(空字符串),nullundefinedNaN)一切是truthy
  • 操作者==每类型转换如果原始值被转换后考虑falsy,所以不关于用途,它可以well truthy
+0

谢谢。 如果我理解正确,(a == true)和(a)也是不同的操作员,是不是? –

+1

你写他们一样吗?问是否“!”与“==”不同的是,如果“==”与“===”不同于“===”就像询问“1”是否与“2”不同“......在极少数情况下两个事物是相同的,人们会告诉你,每一个其他的假设只是常识:**你写它不同**意味着**它是不同的** – Azder

相关问题