288 votes

Que signifie cette construction (x = x || y)?

Je suis en train de déboguer du javascript, et je ne peux pas expliquer ce que ce "||" Est-ce que?

   loadingError: function(title, msg){
        var title   = title || 'Error';
        var msg     = msg || 'Error on Request';

        new my.widget.InformationBox({
            title: title,
            message: msg,
            type: 'error'
        }).show();
    }
 

Quelqu'un peut-il me donner un indice, pourquoi ce gars utilise var title = title || 'ERREUR' ??

237voto

cletus Points 276888

Cela signifie que le title de l'argument est facultatif. Donc, si vous appelez la méthode sans argument, il utilisera la valeur par défaut de "Error".

C'est une abréviation de l'écriture:

if (!title) {
  title = "Error";
}

Ce genre de raccourci truc avec des expressions booléennes est commun en Perl. Avec l'expression:

a OR b

il évalue true si a ou b est true. Donc, si a est vrai que vous n'avez pas besoin de vérifier l' b . Cela s'appelle de court-circuit booléen évaluation:

var title = title || "Error";

fondamentalement, vérifie si title évalue false. Si elle le fait, elle "retourne" "Error", sinon elle renvoie title.

29voto

eteubert Points 1990

Si le titre n'est pas défini, utilisez "ERROR" comme valeur par défaut.

Plus générique:

 var foobar = foo || default;
 

Lit: réglez foobar sur foo ou default . Vous pouvez même enchaîner cela plusieurs fois:

 var foobar = foo || bar || something || 42;
 

14voto

Expliquer cela un peu plus...

L' || de l'opérateur est la logique-or de l'opérateur. Le résultat est true si la première partie est vraie et c'est vrai si la deuxième partie est vrai et c'est vrai si les deux parties sont vraies. Pour plus de clarté, le voici dans un tableau:

 X | Y | X || Y 
---+---+--------
 F | F |   F    
---+---+--------
 F | T |   T    
---+---+--------
 T | F |   T    
---+---+--------
 T | T |   T    
---+---+--------

Maintenant, remarquez quelque chose ici? Si X est vrai, le résultat est toujours vrai. Donc, si nous savons qu' X est vrai nous n'avons pas à vérifier l' Y . De nombreuses langues ainsi de mettre en œuvre le "court-circuit" évaluateurs pour logiques-or (et logique-and venant de l'autre sens). Ils vérifient le premier élément et si c'est vrai, ils n'ont pas pris la peine de vérifier la deuxième. Le résultat (en termes logiques) est le même, mais en termes d'exécution il y a potentiellement une énorme différence si le deuxième élément est coûteux à calculer.

Alors qu'est-ce que avez à faire avec votre exemple?

var title   = title || 'Error';

Regardons-les. L' title élément est passé dans votre fonction. En JavaScript si vous n'avez pas à passer un paramètre, la valeur par défaut à une valeur null. Aussi en JavaScript si votre variable est une valeur null, il est considéré comme faux par les opérateurs logiques. Donc, si cette fonction est appelée avec un titre donné, c'est une non-valeur false et donc assigné à la variable locale. Si, toutefois, il n'est pas une valeur, c'est une valeur null et donc faux. La logique-or opérateur évalue ensuite la deuxième expression et renvoie "Erreur" à la place. Alors maintenant, la variable locale est donnée de la valeur "Erreur".

Cela fonctionne en raison de la mise en œuvre des expressions logiques en JavaScript. Il ne renvoie pas une bonne valeur booléenne (true ou false), mais au lieu de cela renvoie à la valeur qu'il a été donné en vertu de certaines règles quant à ce qui est considéré comme équivalent à true et ce qui est considéré comme équivalent à false. Trouvez votre JavaScript de référence pour apprendre le JavaScript qui considère être vrai ou faux dans boolean contextes.

10voto

dbemerlin Points 6257

Fondamentalement, il vérifie si la valeur avant le || est évalué à true, si oui, il prend cette valeur, sinon, il prend la valeur après le ||.

Valeurs pour lesquelles il prendra la valeur après le || (Autant que je m'en souvienne):

  • indéfini
  • faux
  • 0
  • '' (Chaîne null ou null)

8voto

Juriy Points 1315

Double pipe signifie "OU" logique. Ce n'est pas vraiment le cas lorsque le paramètre "non définie", puisque strictement dans le code javascript, si vous avez un code comme ceci:

function foo(par) {
}

Puis des appels

foo()
foo("")
foo(null)
foo(undefined)
foo(0)

ne sont pas équivalentes.

Double pipe (||) va lancer le premier argument booléen et si elle résulte booléen est vrai - de le refaire sinon il va affecter la partie droite.

C'est important si vous cochez la case pour désactiver le paramètre.

Disons que nous avons une fonction setSalary qui a un paramètre facultatif. Si l'utilisateur ne fournit pas le paramètre, la valeur par défaut de 10, doit être utilisé.

si vous ne la case comme ceci:

function setSalary(dollars) {
    salary = dollars || 10
}

Cela donnera le résultat inattendu sur appel comme

setSalary(0) 

Il sera toujours définir le 10, le suivi des flux décrits ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X