Dlaczego i jak ([! []] + [] [[]]) [+! + [] + [+ []]] Ocenia literę „i”? [duplikować]
To pytanie ma już tutaj odpowiedź:
Dlaczego ++ [[]] [+ []] + [+ []] zwraca ciąg „10”? 9 odpowiedzi(! [] + []) [+ []]… Wyjaśnij, dlaczego to działa 1 odpowiedźPodczas czytaniaten artykuł opublikowano na dzone Pierwotnie znalazłem fragment kodu JavaScriptopublikowany na Twitterze przez Marcusa Lagergrena.
Poniższy kod najwyraźniej drukuje ciąg"fail"
(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]];
Wiąże się to z niejawnym rzutowaniem typu i próbuję zrozumieć, jak dokładnie ta linia jest interpretowana.
Wyodrębniłem każdą postać
(![]+[])[+[]]
wydruki"f"
(![]+[])[+!+[]]
wydruki"a"
([![]]+[][[]])[+!+[]+[+[]]]
wydruki"i"
(![]+[])[!+[]+!+[]]
wydruki"l"
Udało mi się również przełamać wyrażenia zwracające każdą literę z wyjątkiem"i"
"f"
![]
pusta tablica to obiekt, który zgodnie zDokumentacja ECMAScript, punkt 9.2 ocenia natrue
po konwersji na aboolean
to jestfalse
false+[]
jak zaPunkt 11.6.1 oba argumenty pliku binarnego+
operator zostanie przekonwertowany na String, dlatego otrzymujemy"false"+""
, który ocenia"false"
+[]
unary plus operator powoduje aToNumber
konwersja, po której następuje aToPrimitive
konwersja, jeśli argument jestObject
. Wynik takiej konwersji jest określany przez wywołanie[[DefaultValue]]
wewnętrzna metoda obiektu. W przypadku pustej tablicy domyślnie0
. (Dokumentacja ECMAScript, sekcje:11.4.6, 9.3, 9.1 )
"false"[0]
uzyskujemy dostęp do znaku w indeksie0
, stąd"f"
"a"
Ta sama historia, jedyną różnicą są tutaj dodatkowe konwersje w części w nawiasach kwadratowych (co oznacza liczbę wskazującą inny znak w ciągu"false"
), wywołany przez użycie unary+
i!
operatorów.
+[]
ocenia na0
, jak wyjaśniono powyżej.
!0
ocenia natrue
jak zdefiniowano wSekcja 9.2 iSekcja 11.4.9. Pierwszy,0
jest konwertowany na logicznąfalse
a następnie operator odwraca wartość.
+true
znowu unary plus uruchamia aToNumber
konwersja, która zwraca a1
na binarnytrue
(Sekcja 11.4.6 i9.3)
"false"[1]
zwraca drugi znak w ciągu, który jest"a"
!+[]
ocenia natrue
jak wyjaśniono powyżej
true+true
za pomocą pliku binarnego+
na prymitywnych wyzwalaczach aToNumber
konwersja. W przypadku prawdy jego wynik jest1
i1+1
równa się2
"false"[2]
- wyjaśnienie
"i"
To, co mnie zostawia, to list"i"
. Widzę, że druga część (w nawiasach kwadratowych) ocenia ciąg"10"
i że pierwsza część (w nawiasach) powraca"falseundefined"
aleNie potrafię ogłosić, jak to się dzieje. Czy ktoś mógłby to wyjaśnić krok po kroku? Zwłaszcza magia, która ma miejsce w nawiasach kwadratowych? (tablice i dostęp do tablicy)
Jeśli to możliwe, chciałbym, aby każdy krok zawierał link do podstawowych zasad ECMAScript.
Najbardziej tajemnicza jest dla mnie ta część:[][[]]