{1 + ''} + 10 // 10
{1 + ''} + '' // 0
Dlaczego tak się dzieje? Czy BlockStatements zwraca 0 i dlaczego?JavaScript BlockStatement confusion
{1 + ''} + 10 // 10
{1 + ''} + '' // 0
Dlaczego tak się dzieje? Czy BlockStatements zwraca 0 i dlaczego?JavaScript BlockStatement confusion
Czy BlockStatements zwraca 0 ...?
Nie, blocks zwraca wartość ostatniego wyrażenia w nich. Widać to po prostu robi:
{1 + 8}
... w konsoli JavaScript, który pokaże 9
.
{1 + ''} + 10 // 10
{1 + ''} + '' // 0
Dlaczego tak się dzieje?
Ponieważ chociaż blok zwraca wartość, ta wartość nie jest używana. Kod {1 + ''} + 10 // 10
jest oceniany jako dwie odrębne pozycje:
{1 + ''} // "1"
+10 // 10
... lub pisząc te o standardowej wcięcia i średnikami:
{
1 + '';
}
+10;
... i widzisz wynik drugiego, jakby tego pierwszego w ogóle nie było. +
nie ma operatora dodawania, to jest unary+
(podobny do unary -
, ale nie zmienia znaku jego operandu). +10
jest, oczywiście, 10
; i +''
jest 0
, ponieważ zastosowanie operatora do ciągu przekształca ciąg znaków na liczbę, a Number('')
to 0
.
Można udowodnić, że widzisz jednoargumentowych +
raczej niż operator dodawania, próbując w ten sposób:
{1 + ''} * 10
... co jest naprawdę
{
1 + '';
}
*10;
nie powiedzie się z błąd składni ponieważ nie ma unarnego *
.
Felix uprzejmie zwraca uwagę w komentarzach poniżej, do +
W przykładzie będzie operator dodawania (co skończyło się łączenie ciągów, w danym przypadku), musiałby to być between two expressions oraz blok to statement, a nie expression.
Dzięki! Początkowo byłem zdezorientowany, ponieważ '{''} + 'a'' zwraca' NaN', ale teraz zdałem sobie sprawę, że dzieje się tak z powodu +. – callumacrae
To nie jest w 100% poprawne: http://es5.github.com/#x12.1 * "Zwróć wynik oceny StatementList." *. Nie robi to jednak różnicy, ponieważ blok jest instrukcją i dlatego nie może być użyty wewnątrz wyrażenia (przynajmniej tak to rozumiem). –
@FelixKling: Dzięki za to! Usunąłem niepoprawny bit ("Bloki nie zwracają niczego"). A teraz muszę zagłębić się w gramatykę (której nie mam czasu w tej chwili), aby zrozumieć podstawowy powód, dla którego blok i wyrażenia następujące po nim zachowują odrębność i odrębność.Są, i wiedziałem, że są, ale nie wiem, co dokładnie mówi część gramatyki, która ... :-) To prawdopodobnie, jak powiedziałeś, zrobić z wypowiedziami a wyrażeniami. –