En regardant un code source en ligne, je suis tombé sur cela en haut de plusieurs fichiers source.
var FOO = FOO || {};
FOO.Bar = …;
Mais je n'ai aucune idée de ce que || {}
ça fait.
Je sais que {}
c'est égal à new Object()
et je pense que le ||
est pour quelque chose comme "s'il existe déjà, utilisez sa valeur, sinon utilisez le nouvel objet.
Pourquoi verrais-je cela en haut d'un fichier source?
javascript
namespaces
variable-declaration
or-operator
Ricardo Sanchez
la source
la source
Réponses:
Votre estimation de l'intention de
|| {}
est assez proche.Ce modèle particulier vu en haut des fichiers est utilisé pour créer un espace de noms , c'est-à-dire un objet nommé sous lequel des fonctions et des variables peuvent être créées sans polluer indûment l'objet global.
La raison pour laquelle il est utilisé est que si vous avez deux fichiers (ou plus):
et
qui partagent le même espace de noms, peu importe dans quel ordre les deux fichiers sont chargés, vous obtenez toujours
func1
etfunc2
correctement défini dans l'MY_NAMESPACE
objet correctement.Le premier fichier chargé créera l'
MY_NAMESPACE
objet initial et tout fichier chargé ultérieurement augmentera l'objet.Utilement, cela permet également le chargement asynchrone de scripts qui partagent le même espace de noms, ce qui peut améliorer les temps de chargement des pages. Si les
<script>
balises ont l'defer
attribut défini, vous ne pouvez pas savoir dans quel ordre elles seront interprétées, donc comme décrit ci-dessus, cela résout également ce problème.la source
||
est également très utile lorsque vous souhaitez fournir des arguments optionnels et les initialiser aux valeurs par défaut s'ils ne sont pas fournis:function foo(arg1, optarg1, optarg2) { optarg1 = optarg1 || 'default value 1'; optarg2 = optart2 || 'defalt value 2';}
||
opérateur ne peut pas direundefined
defalsey
.Fondamentalement, cette ligne indique définir la
AEROTWIST
variable sur la valeur de laAEROTWIST
variable, ou la définir sur un objet vide.Le double tube
||
est une instruction OR, et la seconde partie de OR n'est exécutée que si la première partie renvoie false.Par conséquent, s'il a
AEROTWIST
déjà une valeur, elle sera conservée comme cette valeur, mais si elle n'a pas été définie auparavant, elle sera définie comme un objet vide.c'est fondamentalement la même chose que de dire ceci:
J'espère que cela pourra aider.
la source
Une autre utilisation courante pour || est de définir une valeur par défaut pour un paramètre de fonction non défini également:
L'équivalent dans d'autres programmes est généralement:
la source
var
dea
,a
entre le contexte d'exécution de la fonction en tant que paramètre formel , il est donc déjà déclaré.Il y a deux parties principales qui
var FOO = FOO || {};
couvrent.# 1 Empêcher les remplacements
Imaginez que votre code soit divisé sur plusieurs fichiers et que vos collègues travaillent également sur un objet appelé
FOO
. Ensuite, cela pourrait conduire au cas où quelqu'un a déjà définiFOO
et affecté des fonctionnalités (comme uneskateboard
fonction). Ensuite, vous le remplaceriez, si vous ne vérifiiez pas s'il existe déjà.Cas problématique:
Dans ce cas, la
skateboard
fonction disparaîtra si vous chargez le fichier JavaScripthomer.js
aprèsbart.js
dans votre HTML car Homer définit un nouvelFOO
objet (et remplace donc celui existant de Bart) afin qu'il ne connaisse que ladonut
fonction.Vous devez donc utiliser
var FOO = FOO || {};
ce qui signifie "FOO sera assigné à FOO (s'il existe déjà) ou à un nouvel objet vide (si FOO n'existe pas déjà).Solution:
Parce que Bart et Homer vérifient maintenant l'existence de
FOO
avant de définir leurs méthodes, vous pouvez chargerbart.js
ethomer.js
dans n'importe quel ordre sans remplacer les méthodes de l'autre (si elles ont des noms différents). Ainsi, vous obtiendrez toujours unFOO
objet qui a les méthodesskateboard
etdonut
(Yay!).# 2 Définition d'un nouvel objet
Si vous avez lu le premier exemple, alors vous savez déjà quel est le but du
|| {}
.Parce que s'il n'y a pas d'
FOO
objet existant, le cas OR deviendra actif et créera un nouvel objet, vous pouvez donc lui attribuer des fonctions. Comme:la source
S'il n'y a pas de valeur dans AEROTWIST ou si elle est nulle ou non définie, la valeur affectée au nouvel AEROTWIST sera {} (un objet vide)
la source
L'
||
opérateur prend deux valeurs:Si a est vrai , il reviendra
a
. Sinon, il reviendrab
.Les valeurs falsy sont
null
,undefined
,0
,""
,NaN
etfalse
. Les valeurs de vérité sont tout le reste.Donc, si
a
n'a pas été défini (est-ceundefined
), il reviendrab
.la source
||
JS (et Perl) et la version en C, C ++ et Java est que JS ne convertit pas le résultat en booléen. C'est toujours un opérateur logique.Notez que dans certaines versions d'IE, ce code ne fonctionnera pas comme prévu. Parce que le
var
, la variable est redéfinie et assignée donc - si je me souviens bien du problème - vous finirez par avoir toujours un nouvel objet. Cela devrait résoudre le problème:la source