Javascript: est-ce une affectation conditionnelle?

Du code de suivi Google Analytics:

var _gaq = _gaq || []; 

Comment cela marche-t-il?

Est-ce une affectation de valeur variable conditionnelle? Est-ce le même que dire:

 if( !(_gaq) ) {_gaq = []; } 

?

L'opérateur ou ( || ) renverra le côté gauche s'il s'agit d'une valeur réelle, sinon il retourne le côté droit.

Il est très similaire à votre deuxième exemple, mais comme il utilise le mot-clé var , il établit également une portée locale pour la variable.

Oui, ça l'est.

Le || L'opérateur évalue à son opérande «vérité» le plus à gauche.
Si _gaq est "falsy" (tel que null , undefined ou 0 ), il évaluera sur le côté droit ( [] ).

C'est le même que dire:

 if( !(_gaq) ) {var _gaq = [];} 

(Cela peut être fait puisque la var est hissée au-dessus de la vérification conditionnelle, évitant ainsi une erreur «non définie», et cela entraînera également que _gaq soit automatiquement traité comme étant local.)

En fait, ce n'est pas le même que dire:

 if (!_gaq) _gaq = []; 

Au moins pas nécessairement. Considère ceci:

 function outer() { var _gaq = null; function inner() { var _gaq = _gaq || []; // ... } inner(); _gaq = 1; inner(); } 

Quand il y a un «_gaq» (je déteste le fait de taper, au fait) dans une portée lexique externe, ce que vous finissez par une nouvelle variable dans la portée intérieure. La déclaration "if" diffère de cette façon très importante – il n'y aurait qu'un "_gaq" dans ce cas.