views:

112

answers:

4

Can I get some clarification on why I would want to use this?

myVar = !!someOtherVar;
+8  A: 

In non-strictly typed languages, the ! operator converts a value to a boolean. Doing it twice would be equivalent to saying

myVar = (boolean)someOtherVar

Note that this is not recommended for code clarity.

phsource
... or is it not not unrecommended?
STW
There's no type casting in Javascript (note the "Javascript" tag), so !! is the best way to explicitly create a boolean value from the "truthiness" of an expression.
Pointy
@STW: http://www.youtube.com/watch?v=0QOya9-lwQk (see 1:44 and 8:38)
BoltClock
You can type cast in JS using `Boolean(someOtherVar)`
MooGoo
@BoltClock -- by the first minute I was having flashbacks to the South Park where Butters becomes a pimp; you know what I'm sayin?
STW
@MooGoo -- thanks for my "how didn't I know that exists?" moment of the day
STW
@MooGoo that is **not** a "type cast" - that's an object construction, and not the same thing at all.
Pointy
@STW: yes, I do.
BoltClock
@Pointy: in which situations does the difference between `Boolean()` and `!!` matter?
chelmertz
@chlmertz, @MooGoo - you're right; when the `Boolean()` constructor is *called* (as opposed to being invoked with `new`), it seems to return either `true` or `false` - in other words, the constants, and not an object. Thus `true === Boolean(2)` is `true`, while `true === new Boolean(2)` is `false`. The MDC page pretty much says exactly this (and leaves one wondering just what use the objects might be).
Pointy
@chimetz, @MooGoo I personally still wouldn't use the term "type cast", but I guess that's just a matter of preference.
Pointy
It creates a bona-fide object that wraps the primitive value. As far as uses go, there's not many. You can add properties to the object (whereas with a primitive any added properties would be ignored), but it is useless in comparisons, because objects are only == to themselves in JS. I would say "type cast" is appropriate because it describes the behavior exactly, even if the implementation here is different than in most other languages (calling a function that returns a value vs special syntax)
MooGoo
+4  A: 

(Rewritten to clarify, simplify)

That statement performs a couple different actions:

myVar = // This portion is a regular assignment, it will store the value of the suffix
        !!someOtherVar; // This portion is evaluated to a boolean result

The !!someOtherVar, I assume, is what you're really asking about. The answer is simple: it performs two logical NOT operations against the truthiness (a Javascript'ism) of someOtherVar.

In other words, if you understand the ! operator, this just combines two of them (!! isn't a different operator). By doing this it essentially returns the boolean evaluation of someOtherVar--in other words, it's a cast from whatever type someOtherVar is to boolean.

So... to walk through this, and pay attention to the result of myVar:

myVar = someOtherVar; // myVar will be whatever type someOtherVar is
myVar = !someOtherVar; // myVar will *always be boolean, but the inverse of someOtherVar's truthiness
myVar = !!someOtherVar; // myVar will *always be boolean, and be the equivalent of someOtherVar's truthiness
STW
+2  A: 

If you need to pass a boolean value to a function, or are anal about evaluating only booleans in conditional statements, that casts someOtherVar to a boolean for you by double-negating it.

BoltClock
+5  A: 

It's a double negation, but it also works for type casting. !somevar will return a boolean (true, if somevar is "truthy" and false if it is "falsey", as per Crockford's lectures). So, !!somevar will be not(bool) and hence it will be boolean.

naivists