From the google analytics tracking code:
var _gaq = _gaq || [];
how does this work?
Is it a conditional variable value assignment? Is i
It's the same as saying:
if( !(_gaq) ) {var _gaq = [];}
(This can be done since the var is hoisted above the conditional check, thereby avoiding a 'not defined' error, and it will also cause _gaq to be automatically treated as local in scope.)
Yes, it is.
The ||
operator evaluates to its leftmost "truthy" operand.
If _gaq
is "falsy" (such as null
, undefined
, or 0
), it will evaluate to the right side ([]
).
The or operator (||
) will return the left hand side if it is a true value, otherwise it will return the right hand side.
It is very similar to your second example, but since it makes use of the var
keyword, it also establishes a local scope for the variable.
Actually it's not the same as saying:
if (!_gaq) _gaq = [];
at least not necessarily. Consider this:
function outer() {
var _gaq = null;
function inner() {
var _gaq = _gaq || [];
// ...
}
inner();
_gaq = 1;
inner();
}
When there's a "_gaq" (I hate typing that, by the way) in an outer lexical scope, what you end up with is a new variable in the inner scope. The "if" statement differs in that very important way — there would only be one "_gaq" in that case.