双感叹号?
可能重复:
是什么 !! (而不是)运营商的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
。
-
与
boolean(foo.bar)
相比,使用它有什么好处吗? -
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
- “”
- 空值
- 未定义