Que signifie "var FOO = FOO | | {}" (Assignez une variable ou un objet vide à cette variable) en Javascript?

en regardant un code source en ligne, je suis tombé sur ceci au sommet de plusieurs fichiers source.

var FOO = FOO || {};
FOO.Bar = …;

mais je n'ai aucune idée de ce que || {} fait.

je sais {} est égal à new Object() et je pense que le || est pour quelque chose comme "si elle existe déjà utiliser sa valeur soit utiliser le nouvel objet.

Pourquoi je le vois en haut d'un fichier source?

89
demandé sur JJJ 2011-06-22 16:10:57

7 réponses

Votre proposition à l'intention de || {} est assez proche.

ce motif particulier , vu en haut des fichiers, est utilisé pour créer un namespace , 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 pourquoi il est utilisé en est ainsi que si vous avez deux (ou plus) fichiers:

var MY_NAMESPACE = MY_NAMESPACE || {};
MY_NAMESPACE.func1 = {
}

et

var MY_NAMESPACE = MY_NAMESPACE || {};
MY_NAMESPACE.func2 = {
}

les deux qui partagent le même espace de nom alors n'a pas d'importance dans l'ordre dans lequel les deux fichiers sont chargés, vous obtenez toujours func1 et func2 correctement défini dans l'objet MY_NAMESPACE correctement.

le premier fichier chargé crée l'objet initial MY_NAMESPACE , et tout fichier chargé ultérieurement augmente l'objet.

permet aussi de charger asynchrone des scripts qui partagent le même espace de noms, ce qui peut améliorer les temps de chargement des pages. Si les balises <script> ont l'attribut defer , vous ne pouvez pas savoir dans quel ordre elles seront interprétées, donc comme décrit ci-dessus, cela corrige aussi ce problème.

142
répondu Alnitak 2011-06-23 07:23:02
var AEROTWIST = AEROTWIST || {};

fondamentalement, cette ligne dit de régler la variable AEROTWIST à la valeur de la variable AEROTWIST , ou de la régler à un objet vide.

la double pipe || est une instruction ou, et la seconde partie de la ou n'est exécutée que si la première partie retourne false.

par conséquent, si AEROTWIST a déjà une valeur, elle sera conservée comme cette valeur, mais si elle n'a pas été définie avant, alors elle sera définie comme vide objet.

c'est fondamentalement la même chose que de dire:

if(!AEROTWIST) {var AEROTWIST={};}

Espère que ça aide.

20
répondu Spudley 2011-06-22 12:15:09

une autre utilisation courante pour || est de définir une valeur par défaut pour un paramètre de fonction non défini aussi:

function display(a) {
  a = a || 'default'; // here we set the default value of a to be 'default'
  console.log(a);
}

// we call display without providing a parameter
display(); // this will log 'default'
display('test'); // this will log 'test' to the console

l'équivalent dans d'autres programmes est habituellement:

function display(a = 'default') {
  // ...
}
5
répondu alessioalex 2013-04-10 19:01:54

il y a deux parties principales que var FOO = FOO || {}; couvre.

# 1 prévenir les dérogations

Imaginez que vous ayez votre code divisé en plusieurs fichiers et que vos collègues travaillent aussi sur un objet appelé FOO . Cela pourrait conduire au cas où quelqu'un aurait déjà défini FOO et lui aurait assigné une fonctionnalité (comme une fonction skateboard ). Alors vous l'annuleriez, si vous ne vérifiiez pas si il existe déjà.

cas problématique:

// Definition of co-worker "Bart" in "bart.js"
var FOO = {};

FOO.skateboard = function() {
  alert('I like skateboarding!');
};

// Definition of co-worker "Homer" in "homer.js"
var FOO = {};

FOO.donut = function() {
  alert('I like donuts!');
};

dans ce cas, la fonction skateboard disparaîtra si vous chargez le fichier JavaScript homer.js après bart.js dans votre HTML parce que Homer définit un nouvel objet FOO (et remplace ainsi L'objet existant de Bart) de sorte qu'il ne connaît que la fonction donut .

vous devez donc utiliser var FOO = FOO || {}; qui signifie "FOO sera attribué à TOTO (si elle existe déjà) ou d'un nouvel objet vide (si FOO n'existe pas déjà).

Solution:

var FOO = FOO || {};

// Definition of co-worker Bart in bart.js
FOO.skateboard = function() {
  alert('I like skateboarding!');
};

// Definition of co-worker Homer in homer.js
var FOO = FOO || {};

FOO.donut = function() {
  alert('I like donuts!');
};

parce que Bart et Homer vérifient maintenant l'existence de FOO avant de définir leurs méthodes, vous pouvez charger bart.js et homer.js dans n'importe quel ordre sans passer par dessus les méthodes de l'autre (s'ils ont des noms différents). Vous obtiendrez donc toujours un objet FOO qui a les méthodes skateboard et donut (Yay!).

# 2 Définition D'un nouvel objet

si vous avez lu le premier exemple, alors vous avez déjà maintenant quel est le but du || {} .

parce que s'il n'y a pas d'objet FOO existant, alors L'or-case deviendra actif et créera un nouvel objet, de sorte que vous pourrez lui attribuer des fonctions. Comme:

var FOO = {};

FOO.skateboard = function() {
  alert('I like skateboarding!');
};
4
répondu Benny Neugebauer 2015-08-21 15:14:18

S'il n'y a pas de valeur dans AEROTWIST ou si elle est nulle ou non définie, la valeur attribuée au nouvel AEROTWIST sera {} (un objet vierge)

3
répondu sudipto 2011-06-22 12:13:07

l'opérateur || prend deux valeurs:

a || b

Si a est truthy , il retournera a . Sinon, il retournera b .

les valeurs de falsy sont null , undefined , 0 , "" , NaN et false . Les valeurs vraies sont tout le reste.

donc si a n'a pas été défini (est-ce undefined ) il sera retournez b .

1
répondu pimvdb 2011-06-22 12:15:00

notez que dans une certaine version de IE ce code ne fonctionnera pas comme prévu. Parce que le var , la variable est redéfinie et assigné ainsi – si je me souviens bien de la question – vous finirez par avoir toujours un nouvel objet. Cela devrait régler la question:

var AEROTWIST;
AEROTWIST = AEROTWIST || {};
-1
répondu ZER0 2012-03-14 12:21:19