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"

list"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"

list"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"

litera „l”

!+[] 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

list"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ęść:[][[]]

questionAnswers(2)

yourAnswerToTheQuestion