2011-12-19 4 views
16

JavaScript, ad esempio, non è un linguaggio scritto in modo non corretto come Java.Conversione del tipo JavaScript: (true && 1) vs (true | | 1)

Come sappiamo, converte il valore del risultato dipendente dal contesto:

"2" + "3" risultati "23"

"2" * "3" risultati 6

Questo è abbastanza chiaro e OK per la comprensione.

Ho appena provato seguenti espressioni, ma ho confuso:

true && 1 risultati 1
true || 1 risultati true

Perché nella prima sono indicati numero e la seconda dà booleano?

Considerando le regole di conversione JavaScript, mi aspetto di ottenere valori boolean in entrambi i casi, a causa del contesto di espressione boolean.

risposta

8

Controllare Douglas Crockford's site, si dice:

L'operatore & & è comunemente chiamato logico e. Può anche essere chiamato guardia . Se il primo operando è falso, nullo, non definito, "" (la stringa vuota ) o il numero 0, restituisce il primo operando. Altrimenti, restituisce il secondo operando. Questo fornisce un modo conveniente per scrivere un null-controllo:

var value = p && p.name; /* The name value will only be retrieved from 
p if p has a value, avoiding an error. */ 

Il || l'operatore è comunemente chiamato logico o. Può anche essere chiamato di default. Se il primo operando è falso, nullo, non definito, "" (la stringa vuota) o il numero 0, , restituisce il secondo operando. In caso contrario, restituisce il primo operando . Questo fornisce un modo conveniente per specificare i valori di default:

value = v || 10; /* Use the value of v, but if v doesn't have a value, 
use 10 instead. */ 
+0

grazie per la spiegazione - è un punto interessante su guardia e default – sergionni

+0

Prego. Tutto sommato, consiglierei di leggere la pagina di Douglas su JavaScript invece delle specifiche. Secondo me è molto più facile da capire. http://javascript.crockford.com/ –

+0

Ottima spiegazione! Vorrei poterti dare +3. –

9

A quote MDC;

&&; Restituisce expr1 se può essere convertito in falso; in caso contrario, restituisce expr2. Pertanto, se utilizzato con valori booleani, && restituisce true se entrambi gli operandi sono veri; in caso contrario, restituisce false.
||; Restituisce expr1 se può essere convertito in vero; in caso contrario, restituisce expr2. Pertanto, se utilizzato con valori booleani, || ritorna true se uno degli operandi è vero; se entrambi sono falsi, restituisce false.

Quindi nel primo esempio, 1 viene restituito perché expr1 non può essere convertito in falso.

Nel secondo esempio, true può essere convertito in true, quindi viene restituito.

+0

molte grazie, in realtà mi ricordi, quella risorsa Mozilla è molto prezioso come documentazione JavaScript – sergionni

0

Si possono fare anche altre cose come:

var myVar = Math.random() > 0.5; 

myVar && doFunc(); 

, che è lo stesso di

if(myVar) { 
    doFunc(); 
} 

Il || significa fondamentalmente "Se la prima cosa è falso, andare al secondo"

Il && significa in sostanza "Se la prima cosa è vera, vai al secondo"

Questo è il motivo per cui si vedono le cose come questo in cima funzioni:

function myFunction(options) { 
    options = options || {}; 
} 

Il che significa: Se opzioni è Falsey, rendono {}

9

Questo non ha nulla a che fare con la conversione del tipo.

|| restituisce il primo operando di verità. 1 || true ti darà 1

restituisce il primo operando di falsy o il secondo operando se entrambi sono veri.

Vedere pagina 58 del ECMAScript specification

+0

grazie, mai saputo di approccio "prima-ultima" – sergionni

0

Si sta confondendo il casting (gli operatori */+ lo faranno) con una valutazione logica (che è & &, ||) do.

+0

può riceverai la tua risposta – sergionni