2013-05-31 11 views

Odpowiedz

4

JavaScript jest dość elastyczny pod względem konwersji między typami danych. Pierwszą rzeczą jest fakt, że +[] ocenia 0. * który pozwala nam przepisać wyraz jak:

++[[]][0] + [0] 

Następną rzeczą jest fakt, że ++[[]][0] jest operatorem preincrement zastosowane do pierwszego elementu [[]]. Zwykle nie można zastosować ++ do tablicy, ale JavaScript łaskawie przekształca pierwszy element na 0, więc wynikiem jest, że ++[[]][0] ocenia na 1 (pierwszy element z [[]], który został teraz zwiększony). To niby tak:

var a = [[]]; 
var b = ++a[0]; 
// now a will be [1] and b will be 1 

To pozostawia nam:

1 + [0] 

JavaScript konwertuje teraz int i tablicę do strun (od [0] nie jest wartością numeryczną) i łączy je ze sobą. Gotowe!

* Moje zrozumienie jak +[] staje 0 jest to, że jest to proces dwuetapowy: najpierw [] jest konwertowana na ciąg pierwotny, który jest pusty. Pusty łańcuch następnie konwertuje na liczbę, która wynosi zero. Za pomocą tej samej trasy [1] ocenia się na '1', a następnie na 1, [2] ocenia się na 2 itd.Jednak wartość parametru [1, 2] jest równa '1,2', która wynosi NaN. (Ostatni, ponieważ separator kropek dziesiętnych to ., a nie ,. Nie wiem, co by się stało, gdyby moje ustawienia regionalne były inne.)

+0

Prawie założyłem, że tak daleko. Zastanawiam się tylko nad przekształceniem części "[[]] [0]" w "0". Która reguła konwersji jest stosowana podczas tego procesu? –

+1

@SayemAhmed - Chociaż '++' nie może być zastosowane do tablicy, może być zastosowane do elementu tablicy. Pierwszym elementem '[[]]' jest '[]'; próba zastosowania '++' do tego powoduje, że JS konwertuje '[]' na 0 (tak jak miało to miejsce w przypadku '+ []'). –

+0

Dobra, rozumiem twój punkt widzenia. Właśnie znajduję zachowanie operatora ++ nieco trudnego do zrozumienia. Nie można go zastosować do tablicy, którą otrzymuję. Ale kiedy zastosujesz go do elementu tablicy i jeśli element sam jest tablicą, to zostanie przekonwertowany na element pierwotny? Czy specyfikacja ECMA zawiera gdzieś to zachowanie? –

2

Wyrażenie stringifies ważne JavaScript konstrukcjach yelds NaN, liczby, itp logiczna undefined

np

+[] -> 0 //The unary plus operator is applied to the result of toString applied to an empty array (which is an empty string) 

!+[] -> true 

można spojrzeć także na this question, i na no alnum cheat sheets.

+0

Wymyśliłem tę część. Zredukowalem wyraenie do '++ [[]] [0] + [0]', po prostu nie moge zrozumiec, jak '1' pojawia si tutaj ...... –

+0

OK, widzę cheata arkusz podał '++ [[]] [+ []]' jako odpowiednik '1', ale nie daje żadnego wyjaśnienia ........ –

2

+[] jest konwersja numer z tablicy do numeru, który jest 0.

i +[0] jest także 0.

więc wynik końcowy można wywnioskować do (++0) + [0] która 1+[0].

I dla numeru dodającego tablicę. Są konwertowane na ciąg znaków, więc wynik jest w rzeczywistości "10".

Możesz zalogować się typeof(++[[]][+[]]+[+[]]), aby zweryfikować.

Powiązane problemy