2010-12-15 36 views
10

En javascript, si nous avons un code tel queComment fonctionne l'affectation logique javascript?

var a = "one"; 
var b = q || a; 
alert (b); 

L'opérateur logique OU assignera la valeur a à b, et l'alerte sera « un. »

Est-ce limité aux affectations seulement ou pouvons-nous l'utiliser partout?

Il semble qu'une chaîne vide est traitée de la même manière que non définie. Est-ce correct?

Comment cela fonctionne avec les variables AND? Qu'en est-il des combinaisons d'entre eux?

Quel est un bon exemple de quand utiliser ces idiomes, ou quand ne pas le faire?

+1

Voir [JavaScript OR (||) explication de l'affectation ] (http://stackoverflow.com/questions/2100758/javascript-or-variable-assignment-explanation) et [En Javascript, qu'est-ce que cela veut dire quand il y a un opérateur logique dans une déclaration de variable? ] (http://stackoverflow.com/questions/3088098/in-javascript-what-does-it-mean-when-there-is-a-logical-operator-in-a-variable-d). –

+1

Ne l'utilisez pas. C'est une construction syntaxique stupide qui n'est pas intuitive et ralentit beaucoup de gens en lisant le code. –

+5

@MK, n'excluez pas une construction commune juste parce que les gens qui ne connaissent pas (encore) JavaScript ne le connaissent pas. –

Répondre

21

Pour votre q || a d'évaluer à a, q devrait être une valeur 'falsy'. Ce que vous avez fait est appelé "évaluation de court-circuit".

répondre à vos questions:

  1. Les opérateurs logiques (comme et - &&, ou - ||) peuvent être utilisés dans d'autres situations. Plus généralement dans les instructions conditionnelles comme if. More here

  2. La chaîne vide n'est pas traitée comme undefined. Les deux sont des valeurs falsifiées. Il y a quelques autres fausses valeurs. More here

  3. AND, ou && dans JavaScript, n'est pas une variable.C'est un opérateur

  4. L'idiome que vous avez utilisé est assez commun.

    var x = val || 'default'; //is generally a replacement for

    var x = val ? val : 'default' //or

    if (val) var x = val; else var x = 'default';

6

La façon || fonctionne en Javascript est:

  1. Si l'opérande gauche est évaluée comme true, retourner l'opérande gauche
  2. Sinon, retournez le droit opérande

& & fonctionne de façon similaire.

Vous pouvez utiliser cela pour des contrôles d'existence en ligne, par exemple:

var foo = (obj && obj.property) 

sera mis foo-obj.property si obj est défini et « truthy ».

+0

Très bien expliqué !! – eddy

+1

* "Si l'opérande de gauche évalue comme vrai, retourne l'opérande de gauche" * Non, c'est faux. * Vérité *, pas "vrai". –

1

Ce comportement est partagé avec d'autres langages de script tels que Perl. L'opérateur OU logique peut être utilisé comme raccourci syntaxique pour spécifier des valeurs par défaut du fait que l'opérateur OU logique arrête d'évaluer ses opérandes lorsqu'il rencontre la première expression évaluée comme vraie: "évalue le premier opérande et si la valeur est interprétée sinon faux, assignez-le, sinon répétez pour le second opérande. "

Je trouve que j'utilise souvent ce comportement pour spécifier des valeurs par défaut pour les paramètres de fonction. Par exemple.

function myFunction(foo, bar) { 
    var fooValue = foo || "a"; 

    // no need to test fooValue -- it's guaranteed to be defined at this point 
} 
+0

Que faire si la valeur de foo est false (pas "false")? – JVM

+0

Cela entraînera fooValue == "a". Dans un contexte booléen, false, null, undefined, 0, NaN et la chaîne vide tous évaluent à false - voir https://developer.mozilla.org/en-US/docs/Glossary/Falsy pour plus de détails –

+0

Correct. Ensuite, cela peut échouer à l'endroit où l'on a réellement besoin de false comme valeur. – JVM

1

Je ne suis pas sûr que je suis votre question. Vous pouvez utiliser une expression n'importe où vous pouvez utiliser une expression, et un opérateur logique sur deux expressions entraîne une expression.

alert(q||a); 
alert(true||false); 

var x=5; 
var y=0; 
if (y!=0 && x/y>2) { /*do something*/ } 

Le dernier bit est utile. Comme la plupart des langages, Javascript «court-circuite» les AND et les ORs. Si la première partie d'un AND est fausse, elle n'évalue pas le second bit, ce qui vous permet d'économiser une division par zéro. Si la première partie d'un OR est vraie, elle n'évalue pas la seconde.

Mais vous pouvez utiliser des opérateurs booléens partout où vous pouvez utiliser une expression.

1

Javascript évalue la logique par la pureté/la fausseté. Des valeurs telles que (false, "", null, undefined, 0, -0) sont évaluées comme étant fausses logiques.

Ajoutez à cela l'évaluation paresseux « ou » opérations sont maintenant évalués à partir left to right et arrêts une fois true se trouve. Puisque, dans votre exemple, la transparence n'est pas littéralement un booléen, la valeur est renvoyée.

Dans ce cas:

x = 0; y = 5; alert(y || x)/*returns 5*/; alert(x || y)/*also returns 5*/; 

cela peut aussi être d'autres objets.

functionThatReturnsTrue() || functionThatDoesSomething(); 
0

IMHO - ne pas utiliser pour l'affectation de type booléen. Cela peut être déroutant. Comme non défini! == faux, c'est-à-dire que le faux lui-même est une valeur.

E.g. Si tu veux copier une valeur de champ d'un objet si et seulement si ce champ est défini

var bar.value = false; 
var foo = true; 

var foo = bar.value || foo; // ==> should be false as bar.value is defined 

Pour affectation de type booléen, u devrait vraiment utiliser la variable

var foo = (bar.value !== undefined) ? bar.value : foo;