2013-05-18 9 views
18
a = 1; 
b = "1"; 
if (a == b && a = 1) { 
    console.log("a==b"); 
} 

Il codice JavaScript di cui sopra si tradurrà in un errore nel if dichiarazione in Google Chrome 26.0.1410.43:Perché l'operatore Javascript "&&" è così strano?

Uncaught ReferenceError: Invalid left-hand side in assignment

Penso che questo sia perché la variabile a nella seconda parte della dichiarazione && , a=1 non può essere assegnato. Tuttavia, quando provo il codice qui sotto, sono totalmente confuso!

a = 1; 
b = "1"; 
if (a = 1 && a == b) { 
    console.log("a==b"); 
} 

Perché l'unica affermazione è giusta, ma l'altra affermazione è errata?

+3

Cosa stai cercando di realizzare qui? Cosa dovrebbe fare effettivamente il codice? –

+2

Usa sempre '(' e ')' per la precedenza degli operatori –

+1

Qui hai commesso un errore, devi scrivere così 'if (a == 1 && a == b)'. –

risposta

21

La seconda versione è analizzata come a = (1 && a == b); ovvero, il risultato dell'espressione 1 && a == b è assegnato a a.

La prima versione non funziona perché il lato sinistro dell'assegnazione non viene analizzato come previsto. Analizza l'espressione come se si stia tentando di assegnare un valore a a tutto sul lato destro - (a == b && a) = 1.

Questo è tutto basato sulla precedenza dei vari operatori. Il problema qui deriva dal fatto che = ha una precedenza inferiore rispetto agli altri operatori.

+2

entrambe le espressioni vengono analizzate perfettamente correttamente. Non sono analizzati nel modo in cui l'OP si aspetta ... – Alnitak

+0

@Alnitak: Sì, penso che il tuo fraseggio sia migliore. –

+1

Vedere https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence per l'elenco di precedenza degli operatori – MofX

6

Perché l'ordine delle operazioni non è quello che ci si aspetta. a == b && a = 1 equivale a (a == b && a) = 1 che equivale a false = 1.

Se si desidera eseguire effettivamente il compito, è necessario utilizzare le parentesi attorno ad esso: a == b && (a = 1).

60

= has lower operator precendence than both && and ==, il che significa che il vostro primo incarico si trasforma in

if ((a == b && a) = 1) { 

Dal momento che non è possibile assegnare ad un'espressione in questo modo, questo vi darà un errore.

+0

grazie! – sherlock

+0

Questo era nuovo per me, grazie per aver pubblicato il link a MDN –

2

In if (a = 1 && a == b),

Le operazioni da eseguire è prima 1 && a == b. 1 && viene eseguito il risultato di a == b. Il risultato di questa operazione && è assegnato a a.

+0

Questo non è del tutto corretto. == ha una precedenza più alta di &&. Il risultato è il seguente ordine di valutazione: 1. 1 2. && -> il lato sinistro è già vero, non valutare il lato destro 3.a = 1 Il risultato è lo stesso di quello che hai detto. Ma 1 && a non viene valutato per primo, è 1 && (a == b) dove a == b non viene mai valutato. In generale, per a = b && c == d l'ordine di valutazione sarebbe (supponendo b è falsy): 1. b 2. c == d 3. b && (c == d) 4. a = (b && (c == d)) – MofX

+0

Siamo spiacenti. Ho corretto l'errore. – Deepu

+0

Anche il mio commento è sbagliato;) Hai capito bene questa volta. Con un && b dato b verrà valutato solo se a è vero. Nel mio ultimo commento ho detto che doveva essere falso. – MofX