2012-03-21 13 views

Odpowiedz

11

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.

+0

Dzięki! Początkowo byłem zdezorientowany, ponieważ '{''} + 'a'' zwraca' NaN', ale teraz zdałem sobie sprawę, że dzieje się tak z powodu +. – callumacrae

+2

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). –

+0

@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. –

Powiązane problemy