2013-11-26 31 views
12

In C so true e false valutano rispettivamente 1 e 0. show in questo caso stampa semplicemente sullo schermo ... Non so cosa sta succedendo qui. Mi aspetto di riavere true. Questo 1 sta incasinando il mio karma.Perché (true && 1) restituisce 1, ma (1 && true) restituisce true?

show(1 && true); 
true 



show(true && 1); 
1 
+1

Vorrei solo sottolineare che questo tipo di comportamento è abbastanza comune nei linguaggi dinamici che consente di utilizzare qualsiasi valore in un contesto booleano (Javascript, Python, Lua, ecc.). C è anche uno strano caso d'angolo in quanto non ha un tipo booleano separato e quindi mix utilizza gli interi per quello. – hugomg

risposta

23

In poche parole - è così che è definito &&. In Javascript, a && b restituisce a se a è falsy e b se a è vero.

Viceversa a || b rendimenti a se a è truthy e b se a è falsy.

Questo ha un senso intuitivo - se a è falso in a && b, allora perché preoccuparsi di leggere il resto dell'espressione? Sai già che l'intera faccenda è falsa. Quindi restituisci solo false. Ma Javascript prende la decisione di restituire a, che è falsy, invece di costituire il valore false per tornare dal nulla.

Questo è basato sulla valutazione di cortocircuito comune a tutti i linguaggi in stile C.

Consente molta espressività in Javascript. Per esempio questo modello:

var foo = function(opts) { 
    opts = opts || {} 
    // ... 
} 

implementa un parametro opzionale opts. Se opts non viene inoltrato affatto, opts = opts || {} imposta opts su {}, quindi il resto del codice non deve sapere che opts non è stato passato.

In-lunga mano è equivalente al seguente:

var x = a || b; // is equivalent to 
var x; 
if(a) { 
    x = a; 
} 
else { 
    x = b; 
} 

e

var y = a && b; // is equivalent to 
var y; 
if(!a) { 
    y = a; 
} 
else { 
    y = b; 
} 

Pertanto JavaScript può essere molto più conciso di C o Java, in quanto semplici if dichiarazioni possono essere sostituiti da || o && interamente. A volte questo rende il codice più conciso e meno leggibile e più simile a Perl, altre volte consente nuovi modelli Javascript, come opts = opts || {}.

Un altro utilizzo è nei modelli come

var displayName = user.fullname || user.email; 

che significa "utilizzare il nome completo, se disponibile;. Se non, ripiegare per e-mail" Personalmente ritengo che questo sia espressivo e leggibile, ma è discutibilmente terso e oscuro a seconda di quale parte della comunità Javascript provenga. A causa di esempi come questo, ed essenzialmente del fatto che i valori di verità sono molto più diversi dei valori falsi, usare il cortocircuito || è molto più comune del cortocircuito &&, come nella tua domanda.

+0

Questa è una risposta eccellente. Grazie. –

+0

È abbastanza comune in Javascript usare il && || convenzione per dichiarazioni semplici se? Mi piace quanto sia conciso. –

+1

@KeithGrout entrambi gli esempi che ho dato sono utilizzati nel codice di produzione nella mia azienda. È discutibilmente conciso, "intelligente" e illeggibile, ma molte persone lo accettano come un modello comune. È il tuo giudizio. – djechlin

Problemi correlati