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.)
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? –
@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 '+ []'). –
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? –