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
?
javascript
syntax
Shankar Cabus
źródło
źródło
var a1,a2,a3;
po prostu zadeklaruje trzy zmienne lokalne.Odpowiedzi:
Dużo się tu dzieje, ale w zasadzie wszystko sprowadza się do operatora przecinka .
Ten kod:
Jest równa:
So
aaa
jest niejawnie zadeklarowana i przypisana do wartości 1. Zwróć uwagę, że wynik na konsoli jest wynikiem ostatniej instrukcji 3.Ten kod:
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,
Więc ten kod jest z grubsza równoważny z:
Oczywiście
2
nie jest prawidłowym identyfikatorem, więc w tym momencie nie działa.Ten kod:
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:
źródło
=
invar bbb = 1;
nie jest tym samym,=
co inaaa = 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ą jaka = 1; 2; 3
(i zwraca 3, na przykładb = (a = 1, 2, 3)
by przypisać 3 do B). W przeciwieństwie do tego, zwracaa = (1, 2, 3)
wartość jako1; 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:
jest to operator, który po prostu zwraca prawy argument. Ale jest to również część składni
var
deklaracji, którymi są:(gdzie
[...]
oznacza, że ta część jest opcjonalna). W Twojejvar
deklaracji brakuje nazw zmiennych po przecinkach, więc nie jest ona analizowana. Możesz uzyskać pożądany efekt dzięki:Nawiasy powodują, że przecinki są traktowane jako operatory, a nie jako separatory między deklaracjami zmiennych.
źródło
W twoich przykładach przecinek jest używany w dwóch kontekstach:
var
komunikatSkładnia
var
instrukcji jest następująca: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 ):
Operator przecinka
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
daje 2aaa = 1
jest oceniany jako pierwszy, ponieważ=
ma wyższy priorytet niż,
2, 3
daje 3(1, 2, 3)
daje3
jak opisano powyżejbbb
przypisywana jest wartość3
źródło
aaa = 1, 2, 3
=> Operator przecinek służy do oddzielenia 3 następujących instrukcji:aaa=1
,2
i3
. 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 oblicza2
i odrzuca je, a następnie oblicza3
i odrzuca.W sekundę:
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ę.Tutaj kompilator najpierw go ocenia
1
i ignoruje. Następnie ocenia go2
i ignoruje. Następnie oblicza3
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.źródło