2010-01-11 6 views

Répondre

8

L'expression est évaluée à myvarmyvar si est Falsey et foo() si myvar est truthy. Les extraits suivants sont presque identiques.

var x = (myvar && foo()); 

if(myvar){ var x = foo(); } else { var x = myvar; } 
4

c'est une expression qui équivaut à "si myVar n'est pas falsey, exécutez la fonction foo()". S'il est utilisé comme ceci: var x = (myVar && foo()), le résultat sera:

si myVar n'est pas falsey, x sera mis à la sortie de foo(). Si myVar est Falsey, x sera défini sur myVar.

+0

Si myvar est truthy x est pas défini le vrai, son jeu à la valeur de foo(), quel qu'il soit. – brad

+0

Ce n'est pas tout à fait exact. Si myVar vaut 0, alors x est mis à 0, pas faux. –

+0

Vous avez tous les deux raison. Réponse modifiée. – glomad

1

L'expression fait une utilisation intelligente du court-circuit dans les expressions booléennes. foo() ne s'exécutera que si myVar est évalué à true.

if (myVar) { 
    foo(); 
} 

est beaucoup plus clair. Il y a probablement des cas où ce genre de code a du sens, mais les vérificateurs de style (si vous êtes intéressés par ce genre de chose) vont vous mettre dessus. Voir http://javascript.crockford.com/code.html. C'est une bonne pratique d'éviter de se fier aux instructions d'insertion et d'expression par points-virgules.

edit: Notez que var x = a && b(); n'est probablement pas une si mauvaise idée dans certains contextes. Cependant, (a && b()) en soi est erronée de plusieurs façons. (Insertion de point-virgule, un état d'expression, en plus d'être sémantiquement cryptique)

+2

je l'ai vu sur un script jquery (dialogue ui) ... – Val

+2

"Exploitant" "stupide" ce sont des mots forts :) Si vous utilisez souvent JS, il est logique et clair comme il se présente. –

+3

Il y a certainement des circonstances où un tel code n'est pas stupide par une mesure raisonnable. Comme dans le contexte de 'if (enabled && isVisible()) ...' ou une telle situation. – Grumdrig

3

La fonction foo() ne sera appelée que si myVar ne Falsey: ce qui signifie qu'il ne peut pas être faux "", 0, null, ou non définie. (Tous les autres)?

Il est plus typique pour voir un exemple comme celui-ci:

window.console && console.log("some helpful debug info"); 

Cela est interprété comme suit ...

« Si la variable « fenêtre » a un membre appelé ' console » ... "

(Il est important de préfixe 'console' par 'fenêtre.' parce que, si la console est définie, vous obtenez une erreur JavaScript au lieu de faux.)

" ... dans voke la méthode 'log' sur l'objet 'console'. "

+1

* "D'autres?" * Juste -0 et NaN, je pense. –

+1

@Jason: '0',' NaN', une chaîne de longueur nulle, 'undefined',' null' et bien sûr 'false' sont des * falsy * ... – CMS

+0

Ah, j'ai pensé à NaN pendant que j'écrivais, mais oublié de le taper. Merci! –

0

lorsque & & sont évalués de la main gauche est évaluée en premier à savoir myVar, si cela est vrai, alors que le côté droit est évalué à savoir foo(). En effet, dans une instruction A & & B si A est faux, alors l'expression A & & B sera toujours évaluée comme fausse.

La déclaration ci-dessus est habituellement utilisé de la manière suivante:

var x = myVar && foo(); 

cela peut aussi être écrit:

if myVar is truee x = foo(), else x = false