双感叹号?
可能重复:
是什么 !! (不)没有运算符在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
,或者真正从true
或false
获益的方式,所以这更有意义。 !!
转化为true
/ false
,他甚至没有注意到这里没有必要。 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: