Perché aaa = 1,2,3
funziona e imposta il valore di aaa
a 1
?
Perché non var bbb = 1,2,3
funziona?
Perché var bbb = (1,2,3)
funziona e imposta il valore di bbb
a 3
?
Perché aaa = 1,2,3
funziona e imposta il valore di aaa
a 1
?
Perché non var bbb = 1,2,3
funziona?
Perché var bbb = (1,2,3)
funziona e imposta il valore di bbb
a 3
?
Risposte:
C'è molto da fare qui, ma fondamentalmente si tratta dell'operatore virgola .
L'operatore virgola valuta entrambi i suoi operandi (da sinistra a destra) e restituisce il valore del secondo operando.
Questo codice:
aaa = 1,2,3
È equivalente a:
aaa = 1;
2;
3;
Quindi aaa
viene implicitamente dichiarato e assegnato un valore di 1. Si noti che l'output sulla console è il risultato dell'ultima istruzione, 3.
Questo codice:
var bbb = 1,2,3
È un errore di sintassi perché le virgole nelle dichiarazioni di variabili vengono utilizzate per dichiarare più variabili in una singola riga. Come sottolinea l'articolo di MDN,
Notare che la virgola
var
nell'istruzione non è l'operatore virgola, perché non esiste all'interno di un'espressione. Piuttosto, è un carattere speciale nellevar
affermazioni combinarne più in una.
Quindi questo codice è più o meno equivalente a:
var bbb = 1;
var 2;
var 3;
Ovviamente 2
non è un identificatore valido, quindi a quel punto fallisce.
Questo codice:
var bbb = (1,2,3)
È molto simile al primo, tranne perché i valori numerici sono racchiusi tra parentesi, vengono valutati per primi. Quindi questo è approssimativamente equivalente a:
1;
2;
var bbb = 3;
=
in var bbb = 1;
non è la stessa =
di in aaa = 1;
- provengono da produzioni diverse (Initialiser vs AssignmentExpression) nella grammatica e capita semplicemente di utilizzare lo stesso token.
a = 1, 2, 3
può essere tra parentesi come (a = 1), 2, 3
che valuta come a = 1; 2; 3
(e restituisce 3, ad esempio b = (a = 1, 2, 3)
assegnerebbe 3 a b). Al contrario, a = (1, 2, 3)
valuta come 1; 2; a = 3
e restituisce 3.
(1 + 2) * 3
, 1 + 2
viene valutato per primo e il risultato di quell'espressione viene sostituito di nuovo nell'espressione esterna per il resto della valutazione.
La virgola ha molteplici usi in Javascript. Nell'espressione:
a = 1, 2, 3;
è un operatore che restituisce semplicemente il suo argomento di destra. Ma fa anche parte della sintassi delle var
dichiarazioni, che sono:
var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;
(dove [...]
significa che la parte è facoltativa). Nella tua var
dichiarazione mancano i nomi delle variabili dopo le virgole, quindi non viene analizzata. Potresti ottenere l'effetto che desideri con:
var a = (1, 2, 3);
Le parentesi costringono le virgole a essere trattate come operatori anziché come delimitatori tra le dichiarazioni di variabili.
Nei tuoi esempi, la virgola viene utilizzata in due contesti:
var
dichiarazioneLa sintassi var
dell'istruzione è:
var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
Qui, la virgola viene utilizzata per separare le coppie nome-valore delle variabili. Quanto segue non funzionerà perché il nome di una variabile non può iniziare con una cifra (vedere i nomi degli identificatori ):
var bbb = 1, 2, 3;
// SyntaxError: Unexpected number
L'operatore virgola valuta entrambi i suoi operandi (da sinistra a destra) e restituisce il valore del secondo operando. Le seguenti espressioni funzionano come segue:
aaa = 1, 2, 3;
aaa = 1, 2
produce 2
aaa = 1
viene valutato per primo perché =
ha una priorità maggiore di,
2, 3
produce 3var bbb = (1, 2, 3);
(1, 2, 3)
produce 3
come descritto soprabbb
viene assegnato il valore3
aaa = 1, 2, 3
=> L'operatore virgola viene utilizzato per separare i seguenti 3 affermazioni: aaa=1
, 2
e 3
. Il risultato dell'operatore virgola è il valore dell'ultima istruzione 3. Tuttavia, aaa viene assegnato il valore 1, come si può chiaramente vedere dallo screenshot dell'OP. La ragione di ciò è la precedenza dell'operatore, con l'operatore virgola che ha la precedenza più bassa.
Nel primo caso:
aaa = 1,2,3
le virgole servono come separatori di espressioni. Esegue un'assegnazione a aaa
, quindi lo calcola 2
e lo scarta, quindi lo calcola 3
e lo scarta.
Nel secondo:
var bbb = 1,2,3
La var
parola chiave dice al compilatore Javascript che la cosa successiva dopo a ,
dovrebbe essere un altro nome di variabile. Non sta trovando, quindi muore e gag.
var bbb = (1,2,3)
Qui, il compilatore prima lo valuta 1
e lo ignora. Quindi lo valuta 2
e lo ignora. Quindi valuta 3
e viene lasciato in pila in modo da essere assegnato abbb
Sebbene l'uso di virgole per separare le espressioni non sia comune, a volte è utile in cose come l' for
aspetto.
for (i = 0, l = 10; i < l; i++) {
console.log(i);
}
var a1,a2,a3;
dichiarerà semplicemente tre variabili locali.