It's a fairly common trick used to coerce a value to a boolean type, instead of using (bool)
. !window.attachEvent
would negate the truth value of window.attachEvent
, giving you a boolean; !!window.attachEvent
negates that, giving you the original truth value but as a boolean instead of the type of window.attachEvent
I dont understand whats the difference between
!!window.attachEvent
and using justwindow.attachEvent
.
The key of understanding this, is to know that the Boolean Logical Operators can return an operand, and not a Boolean result necessarily:
The Logical AND operator (&&
), will return the value of the second operand if the first is truly:
true && "foo"; // "foo"
And it will return the value of the first operand if it is by itself falsy:
undefined && "anything"; // undefined
NaN && "anything"; // NaN
0 && "anything"; // 0
So, in the snippet !!window.attachEvent && !isOpera
, we already know that isOpera
is a boolean value, !!
will just make sure that Browser.IE
is a boolean result also.
An example: let's say we are in Firefox, window.attachEvent
is undefined
and !isOpera
is true
, if you don't use the double negation, Browser.IE
would be undefined
instead false
.