Ćwiczyłem trochę JavaScript, gdy jeden z moich przyjaciół natknął się na ten kod JavaScript:
document.write(('b' + 'a' + + 'a' + 'a').toLowerCase());
Powyższy kod odpowiada "banana"
! Czy ktoś może wyjaśnić, dlaczego?
javascript
type-conversion
HV Sharma
źródło
źródło
+"a"
jestNaN
.+'a'
samodzielnie i zobacz, co się stanie.Odpowiedzi:
+'a'
rozwiązuje naNaN
(„Not a Number”), ponieważ wymusza ciąg znaków na liczbę, podczas gdy znaka
nie może zostać przeanalizowany jako liczba.banana
.Dodanie
NaN
do"ba"
zamieniaNaN
się w łańcuch"NaN"
ze względu na konwersję typu, dajebaNaN
. A potem jesta
tyłek, dawaniebaNaNa
.Odstęp między nimi
+ +
ma uczynić pierwszy jeden ciąg konkatenacji, a drugi jednoargumentowy operator dodatni (tj. „Dodatni”). Masz ten sam wynik, jeśli używasz'ba'+(+'a')+'a'
, rozwiązany jako'ba'+NaN+'a'
, co jest równoważne z'ba'+'NaN'+'a'
powodu żonglowania typami.źródło
... jest oceniany jako ...
(patrz: pierwszeństwo operatora )
(+'a')
próbuje przekonwertować'a'
na liczbę za pomocą jednoargumentowego operatora plus . Ponieważ'a'
nie jest liczbą, wynikiem jestNaN
( „Nie-liczba” ):Mimo, że
NaN
oznacza „Not a Number”, wciąż jest to typ liczbowy ; po dodaniu do ciągów łączy się tak, jak każda inna liczba:Wreszcie jest małe:
źródło
Dla jasności podzielmy to na dwa kroki. Najpierw otrzymujemy wartość wyrażenia w nawiasach, a następnie stosujemy
toLowerCase()
funkcję do wyniku.Krok pierwszy
Idąc LR , mamy:
'b' + 'a'
zwraca ba , jest to regularna konkatenacja.ba + + 'a'
próbuje połączyć ba z+ 'a'
. Ponieważ jednak operator jednoargumentowy+
próbuje przekonwertować swój operand na liczbę, zwracana jest wartość NaN , która jest następnie przekształcana w ciąg po połączeniu z oryginalnym ba - w ten sposób uzyskując baNaN .baNaN
+ „a” zwraca baNaNa . Znowu jest to regularna konkatenacja.Krok drugi
Zastosowanie
.toLowerCase()
wartości zwróconej z kroku pierwszego daje:W JavaScript jest wiele podobnych kalamburów , które możesz sprawdzić.
źródło
To tylko z powodu operatora + .
Dalszą wiedzę możemy uzyskać z fragmentu.
Na przykład
Możesz przekonwertować ciąg na liczbę na 2 sposoby:
Wróćmy do pierwotnego zapytania; Tutaj próbuje przekonwertować następny znak („a”) na liczbę, ale nagle otrzymaliśmy błąd NaN,
Ale traktuje to jako ciąg, ponieważ poprzedni znak był w ciągu. Tak będzie
I na koniec konwertuje to na LowerCase (), więc byłby bananem
Jeśli obok znajdziesz numer, Twój wynik ulegnie zmianie.
Byłby to „ba1a”
źródło
Ten wiersz kodu ocenia wyrażenie, a następnie wywołuje metodę na podstawie zwróconej wartości.
Wyrażenie
('b' + 'a' + + 'a' + 'a')
składa się wyłącznie z literałów łańcuchowych i operatorów dodawania.Podjęte działanie niejawne to wywołanie ToNumber w ciągu znaków
Interpretator ma zasady dotyczące parsowania wyrażenia, dzieląc je na składniki wyrażeń lewej i prawej ręki.
Krok 1:
'b' + 'a'
Lewe wyrażenie:
'b'
lewa Wartość: „b”
Operator: + (jedna ze stron wyrażenia jest łańcuchem, więc konkatenacja łańcucha)
Właściwe wyrażenie:
'a'
właściwa wartość: „a”Wynik:
'ba'
Krok 2:
'ba' + + 'a'
Lewe wyrażenie:
'ba'
lewe Wartość: „ba”
Operator: + (jedna ze stron wyrażenia jest łańcuchem, więc konkatenacja łańcucha)
Właściwe wyrażenie:
+ 'a'
(ocenia wartość matematyczną znaku „a” przy założeniu, że jest to liczba dodatnia ze znaku + - znak minus również by tu działał, wskazując liczbę ujemną - co powoduje, że NaN)Właściwa wartość: NaN (ponieważ operator jest konkatenacją łańcuchów, wywoływana jest taString dla tej wartości podczas konkatenacji)
Wynik: „baNaN”
Krok 3:
'baNaN' + 'a'
Lewe wyrażenie:
'baNaN'
lewe Wartość: „baNaN”
Operator: + (jedna ze stron wyrażenia jest łańcuchem, więc konkatenacja łańcucha)
Właściwe wyrażenie:
'a'
właściwa wartość: „a”
Wynik: „baNaNa”
Następnie zostało ocenione wyrażenie grupujące i wywoływane jest toLowerCase, co pozostawia nam banana.
źródło
Użycie + spowoduje konwersję dowolnej wartości na liczbę w JavaScript!
Więc...
Najważniejszą rzeczą, o której należy najpierw wiedzieć i uczyć się, jest użycie
+
przed jakąkolwiek wartością w JavaScript, przekształci tę wartość na liczbę , ale jeśli tej wartości nie można przekonwertować, silnik JavaScript zwróci NaN , co oznacza, że nie liczbę (nie można konwertować na liczbę, kolego!), a resztę historii jak poniżej:źródło
Przeczytaj więcej o NaN na W3Schools lub Mozilla Developer Network
źródło
Zobacz magię tutaj. Drugi plus to jednoargumentowy operator, który daje „NaN”
źródło