双感叹号?

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

所以我正在debugging一些代码,并跑过这个:

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

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

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

这将值转换为布尔值并确保布尔types

 "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 " \t\r\n" == 0 // true 

资料来源:Doug Crockford

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

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

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

  • 也许这个函数的早期版本在多个地方使用了someVar ,或者真正从true受益的方式,所以这样做更有意义。
  • 也许写这个函数的人是如此习惯使用!! (他)甚至没有注意到这里没有必要。
  • 也许编写这个函数的人会感觉到每个计算(在这种情况下,布尔转换)都应该赋予一个有意义的名字,通过给它的结果指定一个variables。
  • 也许,因为JavaScript中的布尔转换出人意料地容易出错(因为例如new Boolean(false)是一个真实值),编写函数的人感觉应该总是显式地而不是隐式地完成 – 即使效果是一样的 – 只是要把它作为一个潜在的错误点注意它。
    • 这当然是以编写这个函数的人的想法为前提的!! 作为“明确的”布尔转换。 从技术上说,它不是 – 它使用相同的隐式布尔转换, if这样做 – 但是如果你习惯了这个习惯用法,那么它就等于一个明确的转换。

但根据我的主观看法,这些原因都不是非常好的!

如上所述,它强制一个布尔types的对象。 你可以看到自己:

 (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)); })(); 

如果你只是在做比较,那么转换只是在稍后保存你的types强制。

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

  • 0
  • “”
  • 空值
  • 未定义