Dlaczego aaa = 1,2,3
działa i ustawia wartość aaa
na 1
?
Dlaczego nie var bbb = 1,2,3
działa?
Dlaczego var bbb = (1,2,3)
działa i ustawia wartość bbb
na 3
?
Dlaczego aaa = 1,2,3
działa i ustawia wartość aaa
na 1
?
Dlaczego nie var bbb = 1,2,3
działa?
Dlaczego var bbb = (1,2,3)
działa i ustawia wartość bbb
na 3
?
Odpowiedzi:
Dużo się tu dzieje, ale w zasadzie wszystko sprowadza się do operatora przecinka .
Operator przecinka ocenia oba swoje operandy (od lewej do prawej) i zwraca wartość drugiego operandu.
Ten kod:
aaa = 1,2,3
Jest równa:
aaa = 1;
2;
3;
So aaa
jest niejawnie zadeklarowana i przypisana do wartości 1. Zwróć uwagę, że wynik na konsoli jest wynikiem ostatniej instrukcji 3.
Ten kod:
var bbb = 1,2,3
Jest błędem składniowym, ponieważ przecinki w deklaracjach zmiennych są używane do deklarowania wielu zmiennych w jednym wierszu. Jak wskazuje artykuł w MDN,
Zauważ, że przecinek w
var
instrukcji nie jest operatorem przecinka, ponieważ nie istnieje w wyrażeniu. Jest to raczej znak specjalny wvar
instrukcjach, łączący wiele z nich w jedno.
Więc ten kod jest z grubsza równoważny z:
var bbb = 1;
var 2;
var 3;
Oczywiście 2
nie jest prawidłowym identyfikatorem, więc w tym momencie nie działa.
Ten kod:
var bbb = (1,2,3)
Jest bardzo podobny do pierwszego, z wyjątkiem tego, że wartości liczbowe są zawarte w nawiasach, są one oceniane jako pierwsze. Więc jest to z grubsza równoważne z:
1;
2;
var bbb = 3;
=
in var bbb = 1;
nie jest tym samym, =
co in aaa = 1;
- pochodzą z różnych produkcji (Initialiser vs AssignmentExpression) w gramatyce i po prostu używają tego samego tokena.
a = 1, 2, 3
może być w nawiasach jako (a = 1), 2, 3
rozpoznawaną jak a = 1; 2; 3
(i zwraca 3, na przykład b = (a = 1, 2, 3)
by przypisać 3 do B). W przeciwieństwie do tego, zwraca a = (1, 2, 3)
wartość jako 1; 2; a = 3
i zwraca 3.
(1 + 2) * 3
, 1 + 2
najpierw jest oceniane, a wynik tego wyrażenia jest zastępowany z powrotem w zewnętrznym wyrażeniu do końca oceny.
Przecinek ma wiele zastosowań w JavaScript. W wyrażeniu:
a = 1, 2, 3;
jest to operator, który po prostu zwraca prawy argument. Ale jest to również część składni var
deklaracji, którymi są:
var var1 [ = val1 ], var2 [ = val2 ], var3 [ = val3 ], ...;
(gdzie [...]
oznacza, że ta część jest opcjonalna). W Twojej var
deklaracji brakuje nazw zmiennych po przecinkach, więc nie jest ona analizowana. Możesz uzyskać pożądany efekt dzięki:
var a = (1, 2, 3);
Nawiasy powodują, że przecinki są traktowane jako operatory, a nie jako separatory między deklaracjami zmiennych.
W twoich przykładach przecinek jest używany w dwóch kontekstach:
var
komunikatSkładnia var
instrukcji jest następująca:
var varname1 [= value1 [, varname2 [, varname3 ... [, varnameN]]]];
Tutaj przecinek jest używany do oddzielania par nazwa-wartość zmiennej. Poniższe nie zadziała, ponieważ nazwa zmiennej nie może zaczynać się od cyfry (zobacz nazwy identyfikatorów ):
var bbb = 1, 2, 3;
// SyntaxError: Unexpected number
Operator przecinka ocenia oba swoje operandy (od lewej do prawej) i zwraca wartość drugiego operandu. Następujące wyrażenia działają w następujący sposób:
aaa = 1, 2, 3;
aaa = 1, 2
daje 2
aaa = 1
jest oceniany jako pierwszy, ponieważ =
ma wyższy priorytet niż,
2, 3
daje 3var bbb = (1, 2, 3);
(1, 2, 3)
daje 3
jak opisano powyżejbbb
przypisywana jest wartość3
aaa = 1, 2, 3
=> Operator przecinek służy do oddzielenia 3 następujących instrukcji: aaa=1
, 2
i 3
. Wynikiem operatora przecinka jest wartość ostatniej instrukcji 3. Jednak aaa ma przypisaną wartość 1, co wyraźnie widać na zrzucie ekranu PO. Powodem tego jest pierwszeństwo operatora, przy czym operator przecinka ma najniższy priorytet.
W pierwszym przypadku:
aaa = 1,2,3
przecinki służą jako separatory wyrażeń. Wykonuje przypisanie do aaa
, następnie oblicza 2
i odrzuca je, a następnie oblicza3
i odrzuca.
W sekundę:
var bbb = 1,2,3
var
Kluczowe informuje kompilator Javascript, że następną rzeczą po ,
powinny być inna nazwa zmiennej. Nie znajduje się, więc umiera i dławia się.
var bbb = (1,2,3)
Tutaj kompilator najpierw go ocenia 1
i ignoruje. Następnie ocenia go 2
i ignoruje. Następnie oblicza 3
i to pozostaje na stosie, więc jest przypisanebbb
Chociaż używanie przecinków do oddzielania wyrażeń nie jest powszechne, czasami jest to przydatne w przypadku takich rzeczy, jak for
wygląd.
for (i = 0, l = 10; i < l; i++) {
console.log(i);
}
var a1,a2,a3;
po prostu zadeklaruje trzy zmienne lokalne.