2012-08-13 26 views
28

Powiel możliwe:
What is the explanation for these bizarre JavaScript behaviours mentioned in the 'Wat' talk for CodeMash 2012?Dlaczego {} + [] zwraca 0 w JavaScript?

Wiem, że kiedy [] jest zmuszany do łańcucha zwraca pusty ciąg (""), a gdy {} jest zmuszany do łańcucha zwraca "[object Object]" .

Kiedy biegnę [] + {} w konsoli JavaScript przeglądarki, to powraca jak bym się spodziewał:

>> [] + {} 
"[object Object]" 

Ale kiedy biegnę {} + [], zwraca zupełnie nieoczekiwaną wartość:

>> {} + [] 
0 

co mogłoby powodować, że zwróci 0?

+0

Wygląda na to, że dodajesz wartość null do wartości null. Byłoby to równoważne 0 + 0. Ale to tylko przypuszczenie. – Trisped

+4

@Tisped: żadna z nich nie ma wartości NULL. – SLaks

+2

To pytanie jest zawarte w http://stackoverflow.com/questions/9032856/what-is-the-explanation-for-these-bizarre-javascript-beavavours- mentioned-in-the (które od teraz ma 301 głosów) ..... –

Odpowiedz

49

Kiedy jest { na początku oświadczenia, że ​​będą interpretowane jako blok, który może zawierać zero lub więcej instrukcji bloku Wi. żadne instrukcje w nim nie będą miały pustej wartości kontynuacji.

Innymi słowy, w tym przypadku {} jest interpretowany jako pusty blok kodu.

Instrukcja kończy się po nawiasie końcowym }, co oznacza, że ​​kolejne trzy znaki +[] zawierają własne wyrażenie.

Na początku wyrażenia lub instrukcji, + jest operatorem jednoargumentowym plus, który wymusza operand na liczbę.

Tak więc +[] jest taki sam jak Number([]), który jest oceniany jako 0.

W skrócie, {} + [] jest pustym blokiem kodu, po którym następuje tablica wymuszona na liczbie.


Wszystko, co powiedział, jeśli oceniać {} + []wewnątrz wyrażenia, zwróci czego oczekujesz:

>> ({} + []) 
"[object Object]" 

Inną ciekawą rzeczą jest to, że nie można rozpocząć oświadczenie z obiektem dosłownym ponieważ interpreter spróbuje przeanalizować to jako wypowiedź.Wykonanie tej czynności spowoduje wygenerowanie błędu składni. Powrót na górę

+4

Co ciekawe, literał obiektu z pojedynczą właściwością nie jest błędem składni na początku instrukcji, jeśli opuścisz wyłączyć cytaty z nazwy nieruchomości. To po prostu nie znaczy, jak to wygląda. Na przykład '{object:" literal "}' interpretowane jest jako instrukcja blokowa z pojedynczą instrukcją, '" literal "'. 'object' staje się etykietą instrukcji. –

+0

@MatthewCrumley Dzieje się tak dlatego, że 'object:' jest traktowane jako etykieta (te, których można użyć z instrukcjami break) –

18

Ponieważ {} jest traktowany jako blok. Zatem Twój rachunek jest faktycznie:

{ 

//empty block here 
} 

+[] //0 same as Number([]) 

To dlaczego jest nieważny javascript:

eval('{hello: "world", key: "value"}') //Syntax error 

Możesz dodać(), aby to wyrażenie (bloki nie mogą być użyte w wyrażeniu tak będzie inicjator obiektu:

eval('({hello: "world", key: "value"})') //Object 
+2

Nie jest dla mnie oczywiste, co jest nie tak z tą odpowiedzią, więc proszę wyjaśnij zdanie. – Esailija

+2

+1 do przesunięcia w dół. Masz około 25 sekund wcześniej i myślę, że Twój przykład wielowierszowy jest znacznie wyraźniejszy. – Izkata

2

Pusty blok zostaje wymuszony na zero. Następnie operator + postanawia przymusić numer [].

+0

Pusty blok jest pustym blokiem, nie jest do niczego przymuszany. – alex

+0

@alex, masz rację, po przeczytaniu odpowiedzi Petera Olsena, rozumiem, że jedynym przymusem jest Array w liczbie i pierwszy zestaw nawiasów jest po prostu ignorowany, ostatnie zdanie jest zwracane –

Powiązane problemy