jpa*_*o84 180 javascript
可能重复:
什么是!! (不是)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
}
}
Run Code Online (Sandbox Code Playgroud)
好的,我的问题是什么意思!!
?所有这一切都在做0 === false
.
与之相比,使用它有什么好处boolean(foo.bar)
?
foo.bar可以在if中进行评估,因为0 === false
已经,所以为什么要进行转换?(someVar不会在其他任何地方重复使用)
Gaz*_*ler 291
这会将值转换为布尔值并确保布尔类型.
"foo" // Evaluates to "foo".
!"foo" // Evaluates to false.
!!"foo" // Evaluates to true.
Run Code Online (Sandbox Code Playgroud)
如果foo.bar
通过,那么它可能不是0而是其他一些假值.请参阅以下真值表:
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
Run Code Online (Sandbox Code Playgroud)
资料来源:Doug Crockford
当谈到NaN值时,Javascript也变得非常奇怪.这是我能想到的最好的情况!会对===表现不同.
NaN === NaN //false
!!NaN === !!NaN //true
// !!NaN is false
Run Code Online (Sandbox Code Playgroud)
rua*_*akh 13
我认为答案是没有太多意义.我们可以推测它是如何产生的:
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));
})();
Run Code Online (Sandbox Code Playgroud)
如果您只是进行比较,转换只会在以后为您节省类型强制.
仅供参考,以下值在JavaScript中被强制为FALSE: