Double exclamation points? [duplicate]
Possible Duplicate:
What is the !! (not not) operator in JavaScript?
What does the !! operator (double exclamation point) mean in JavaScript?
So I was debuging some code and ran across this:
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
}
}
Okay my questions is what is the point of !!
? All that is doing is making the 0 === false
.
Is there any benefit to using that compared to
boolean(foo.bar)
?foo.bar can be evaluated in an if as is because
0 === false
already, so why go through the conversion? (someVar is not reused anywhere else)
Solution 1:
This converts a value to a boolean and ensures a boolean type.
"foo" // Evaluates to "foo".
!"foo" // Evaluates to false.
!!"foo" // Evaluates to true.
If foo.bar
is passed through, then it may not be 0 but some other falsy value. See the following truth table:
Truth Table for 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
Source: Doug Crockford
Javascript also gets really weird when it comes to NaN values. And this is the only case I can think of off the top of my head where !! would behave differently to ===.
NaN === NaN //false
!!NaN === !!NaN //true
// !!NaN is false
Solution 2:
I think the answer is that there isn't really much point. We can speculate about how it came about:
- maybe an earlier version of the function used
someVar
in multiple places, or in ways that genuinely benefited from havingtrue
orfalse
, so this made more sense. - maybe the person who wrote the function is so used to using
!!
to convert totrue
/false
that (s)he didn't even notice that it wasn't necessary here. - maybe the person who wrote the function feels that every computation (in this case, Boolean conversion) should be given a meaningful name by assigning some variable to its result.
- maybe, since Boolean conversion in JavaScript is surprisingly error-prone (in that e.g.
new Boolean(false)
is a true-valued value), the person who wrote the function feels that it should always be done explicitly rather than implicitly — even though the effect is the same — just to call attention to it as a potential point of error.- this, of course, presupposes that the person who wrote the function thinks of
!!
as an "explicit" Boolean conversion. Technically it's not — it uses the same implicit Boolean conversion thatif
does — but if you're used to this idiom, then it amounts to an explicit conversion.
- this, of course, presupposes that the person who wrote the function thinks of
but in my subjective opinion, none of those reasons is a very good one!