为什么(!a)和(a == false)不相等?

Mak*_*evs 0 javascript

谈话很便宜,我会展示我的代码.

    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
Run Code Online (Sandbox Code Playgroud)

这返回true但我确信它会返回false,因为当我使用double equal时,undefined与false相同.

当我尝试使用时,事情变得奇怪

if(!a){..} else {..};
// false
Run Code Online (Sandbox Code Playgroud)

在这里,我得到了我的假,但直到这一刻,我认为(!a)和(a == false)绝对等于.

Fel*_*ing 6

简短的回答:

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

这是两种不同的操作.


!a相当于Boolean(a) ? false : true.如果是,则Boolean(a)返回falsea

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

在其他每种情况下它都会返回true.

什么发生在a == false一个更进化的有点,但并不是很复杂.发生的最重要的事情false是转换为数字,所以你实际上是比较a == 0.但undefined在比较算法中以特殊方式处理.它没有转换为任何其他类型,因此算法只返回false.

为JavaScript课程编写了以下交互式工具,它显示了在比较两个值时执行算法的哪些步骤:

在此输入图像描述


类似的问题: