双感叹号?

可能重复:
是什么 !! (不)没有运算符在JavaScript中?
什么! 运算符(双重感叹号)在JavaScript中的意思是?

所以我正在调试一些代码并运行这个:

var foo.bar = 0; // this is actually passed from another function, adding it for context

function(foo)
    var someVar = !!foo.bar;
    if(foo.bar){
      // ..stuff happens
    }
    else{
      // .. something else happens
    }
}

好的,我的问题是什么? 所做的就是使0 === false

  • boolean(foo.bar)相比,使用它有什么好处吗?

  • foo.bar可以在if中进行评估,因为0 === false已经是,所以为什么要通过转换? (someVar不会在其他地方重复使用)


  • 这将值转换为布尔值并确保布尔类型

    "foo"      =    "foo"
    !"foo"     =    false
    !!"foo"    =    true
    

    如果foo.bar通过,那么它可能不是0,而是一些其他的falsy值。 看下面的真值表:

    真理表的JavaScript

    ''        ==   '0'           // false
    0         ==   ''            // true
    0         ==   '0'           // true
    false     ==   'false'       // false
    false     ==   '0'           // true
    false     ==   undefined     // false
    false     ==   null          // false
    null      ==   undefined     // true
    " trn" ==   0             // true
    

    资料来源:Doug Crockford

    当涉及到NaN值时,JavaScript也变得非常奇怪。 而且这是我能想到的唯一情况! 会表现不同于===。

    NaN   ===  NaN     //false
    !!NaN === !!NaN    //true
    
    // !!NaN is false
    

    我认为答案是没有多少意义。 我们可以推测它是如何产生的:

  • 也许早期版本的函数在多个地方使用someVar ,或者真正从truefalse获益的方式,所以这更有意义。
  • 也许写这个函数的人很习惯使用!! 转化为true / false ,他甚至没有注意到这里没有必要。
  • 也许写这个函数的人会感觉到每个计算(在这种情况下,布尔转换)都应该通过给结果赋一些变量来赋予一个有意义的名字。
  • 也许,因为JavaScript中的布尔转换出人意料地容易出错(因为例如new Boolean(false)是一个真值数值),编写该函数的人感觉应始终明确而非隐式地完成 - 即使效果是一样的 - 只是为了引起人们的注意,将其视为潜在的错误点。
  • 当然,这是以编写函数的人想到的为前提的!! 作为“显式”布尔转换。 技术上讲,它不是-它使用相同的隐式转换的布尔认为if那样-但如果你已经习惯了这个成语,那么它相当于一个明确的转换。
  • 但根据我的主观看法,这些原因都不是非常好的!


    如上所述,它强制使用布尔类型的对象。 你可以亲眼看到:

    (function typecheck() {
      var a = "a";
      var b = !a;
      var c = !!a;
    
      alert("var a = " + typeof(a) + "n" +
            "var b = " + typeof(b) + "n" +
            "var c = " + typeof(c));
    })();
    

    如果你只是在做比较,那么转换只是在稍后为你节省一个类型强制。

    仅供参考,以下值在JavaScript中被强制为FALSE:

  • 0
  • “”
  • 空值
  • 未定义
  • 链接地址: http://www.djcxy.com/p/12639.html

    上一篇: Double exclamation points?

    下一篇: Can someone explain this 'double negative' trick?