Konwersje typów ECMAScript
- Poprzednia strona Typy oryginalne ECMAScript
- Następna strona Typy referencyjne ECMAScript
Jedną z najważniejszych cech wszystkich języków programowania jest możliwość przekształcania typów.
ECMAScript oferuje deweloperom wiele prostych metod przekształceń typów.
Większość typów ma metody do prostych przekształceń, a kilka globalnych metod można użyć do bardziej złożonych przekształceń. W każdym przypadku, w ECMAScript, przekształcenie typu jest krótkim krokiem operacji.
Konwersja na ciąg znaków
Ciekawe w przypadku wartości prymitywnych Boolean, liczb i stringów w ECMAScript jest to, że są to pseudo-objekty, co oznacza, że mają one właściwości i metody.
Na przykład, aby uzyskać długość stringa, można użyć poniższego kodu:
var sColor = "red"; alert(sColor.length); // Wyjście "3"
Choć "red" jest typem prymitywnym string, ma właściwość length, która przechowuje rozmiar ciągu znaków.
W sumie, trzy główne typy prymitywne Boolean, liczby i stringi mają metodę toString(), która może przekształcić ich wartości na ciąg znaków.
Wskazówka:Może się zapytać, czy string ma metodę toString(), czy to nie jest nadmiarowe? Tak, rzeczywiście, ECMAScript definiuje, że wszystkie obiekty mają metodę toString(), niezależnie od tego, czy są to pseudo-objekty, czy prawdziwe obiekty. Ponieważ typ String należy do pseudo-objektów, musi mieć metodę toString().
Metoda toString() typu Boolean wyświetla "true" lub "false", wynik zależy od wartości zmiennej:
var bFound = false; alert(bFound.toString()); // Wyświetla "false"
Metoda toString() typu Number jest wyjątkowa, ponieważ ma dwa tryby, tj.Tryb domyślnyiWzorzec bazyW domyślnym trybie, metoda toString() wyświetla wartość liczby w odpowiednim formacie stringa (czy to całkowita liczba, liczba zmiennoprzecinkowa czy liczba w formacie wykładniczym), jak pokazane poniżej:
var iNum1 = 10; var iNum2 = 10.0; alert(iNum1.toString()); // Wyświetla "10" alert(iNum2.toString()); // Wyświetla "10"
Komentarz:W domyślnym trybie, niezależnie od tego, w jakim formacie został zadeklarowany oryginalnie numer, metoda toString() typu Number zwraca dziesiętną reprezentację liczby. Dlatego liczby zadeklarowane w formie ósemkowej lub szesnastkowej są wyświetlane w formie dziesiętnej.
Używając wzorca bazy metody toString() typu Number, można używać różnychBazowaWyświetl liczbę, na przykład baza dla systemu binarnego to 2, dla ósemkowego to 8, a dla szesnastkowego to 16.
BazowaTo tylko inna forma dodawania, która jest parametrem metody toString():
var iNum = 10; alert(iNum.toString(2)); // Wyświetla "1010" alert(iNum.toString(8)); // Wyświetla "12" alert(iNum.toString(16)); // Wyświetla "A"
W poprzednim przykładzie liczba 10 została wyświetlona w trzech różnych formach: binarnej, ósemkowej i szesnastkowej. HTML używa szesnastkowej formy do reprezentacji kolorów, co jest bardzo przydatne przy przetwarzaniu liczb w HTML.
Komentarz:Wywołanie toString(10) dla liczby i wywołanie toString() jest takie samo, oba zwracają dziesiętną formę liczby.
Zobacz:
Zobacz Podręcznik JavaScriptSzczegółowe informacje dotyczące metody toString():
Konwersja na liczbę
ECMAScript oferuje dwa metody do konwersji wartości pierwotnych, które nie są liczbami, na liczby: parseInt() i parseFloat().
Jak można się spodziewać, pierwsza z nich przekształca wartość na liczbę całkowitą, a druga na liczbę zmiennoprzecinkową. Te metody działają tylko na typie String; dla innych typów zwracają NaN.
parseInt()
Przed sprawdzeniem, czy ciąg znaków jest wartością liczbową, metoda parseInt() oraz parseFloat() dokładnie analizują ciąg znaków.
Metoda parseInt() najpierw sprawdza znak na pozycji 0, aby określić, czy jest to liczba; jeśli nie, metoda zwraca NaN i nie kontynuuje wykonywania innych operacji. Jeśli znak jest liczbą, metoda sprawdza znak na pozycji 1 i tak dalej, aż do znalezienia znaku, który nie jest liczbą. W tym momencie metoda przekształci ciąg znaków do liczby.
Na przykład, jeśli chcemy przekształcić ciąg "12345red" na liczbę całkowitą, metoda parseInt() zwróci 12345, ponieważ gdy dojdzie do znaku r, proces sprawdzania zostanie zatrzymany.
Liczby literane w ciągu znaków będą poprawnie przekształcane na liczby, np. "0xA" będzie poprawnie przekształcane na liczbę 10. Jednak ciąg "22.5" będzie przekształcany na 22, ponieważ dla liczb całkowitych kropka jest znakiem nieważnym.
Oto kilka przykładów:
var iNum1 = parseInt("12345red"); //zwraca 12345 var iNum1 = parseInt("0xA"); //zwraca 10 var iNum1 = parseInt("56.9"); //zwraca 56 var iNum1 = parseInt("red"); //zwraca NaN
Metoda parseInt() ma również tryb podstawy, który pozwala na konwersję ciągów binarnych, ósemkowych, szesnastkowych oraz innych systemów liczenia na liczby całkowite. Baza jest określana przez drugi argument metody parseInt(), więc aby zinterpretować wartości szesnastkowe, należy wywołać metodę parseInt() w następujący sposób:
var iNum1 = parseInt("AF", 16); //zwraca 175
Oczywiście, można tak wywołać metodę parseInt() dla binarnego, ósemkowego oraz dziesiętnego (domyślnego) systemu liczenia:
var iNum1 = parseInt("10", 2); //zwraca 2 var iNum2 = parseInt("10", 8); //zwraca 8 var iNum3 = parseInt("10", 10); //zwraca 10
Jeśli dziesiętna liczba zawiera wiodące 0, lepiej użyć bazy 10, aby uniknąć przypadkowego uzyskania wartości ósemkowej. Na przykład:
var iNum1 = parseInt("010"); //zwraca 8 var iNum2 = parseInt("010", 8); //zwraca 8 var iNum3 = parseInt("010", 10); //zwraca 10
W tym kodzie, dwie linie kodu interpretują ciąg "010" jako liczbę. Pierwsza linia kodu traktuje ten ciąg jako wartość ósemkową, interpretując go w ten sam sposób jak druga linia kodu (oznaczająca bazę jako 8). Ostatnia linia kodu oznacza bazę jako 10, więc iNum3 ostatecznie równa się 10.
Zobacz
Zobacz Podręcznik JavaScriptSzczegółowe informacje dotyczące metody parseInt():parseInt().
parseFloat()
Metoda parseFloat() działa podobnie jak metoda parseInt(), od pozycji 0 rozpoczynając każdą literę, aż do znalezienia pierwszego nieważnego znaku, a następnie przekształca wszystkie znaki przed tym znakiem w liczbę.
Jednak dla tej metody, pierwszy występujący punkt przecinka jest ważnym znakiem. Jeśli jest dwa punkty przecinka, drugi punkt przecinka jest uznawany za nieważny. parseFloat() przekształci wszystkie znaki przed tym punktem przecinka w liczbę. Oznacza to, że ciąg "11.22.33" zostanie zinterpretowany jako 11.22.
Innym różnikiem użycia metody parseFloat() jest to, że ciąg znaków musi być przedstawiony w formacie dziesiętnym, a nie ósemkowym lub szesnastkowym. Ta metoda ignoruje wiodące 0, więc ósemkowy numer 0102 zostanie zinterpretowany jako 102. Dla szesnastkowego liczby 0xA, metoda zwróci NaN, ponieważ w liczbach zmiennoprzecinkowych, x nie jest ważnym znakiem. (Komentarz:Testy pokazują, że konkretna implementacja przeglądarki zwraca 0 zamiast NaN).
Metoda parseFloat() nie ma również podstawowego trybu.
Poniżej znajdują się przykłady użycia metody parseFloat():
var fNum1 = parseFloat("12345red"); //zwraca 12345 var fNum2 = parseFloat("0xA"); //zwraca NaN var fNum3 = parseFloat("11.2"); //zwraca 11.2 var fNum4 = parseFloat("11.22.33"); //zwraca 11.22 var fNum5 = parseFloat("0102"); // zwraca 102 var fNum1 = parseFloat("red"); // zwraca NaN
Zobacz
Zobacz Podręcznik JavaScriptPoniżej znajduje się szczegółowa informacja na temat metody parseFloat():parseFloat().
Konwersji przymusowej
Możesz również użyćKonwersja przymusowa (type casting)Do przetwarzania typów wartości. Użycie konwersji przymusowej umożliwia dostęp do określonych wartości, nawet jeśli są one innego typu.
Uwaga autora:Słowo "cast" ma znaczenie "kucie", co idealnie pasuje do znaczenia "konwersji przymusowej".
Dostępne w ECMAScript 3 rodzaje konwersji typów to:
- Boolean(value) - przekształca podaną wartość na typ Boolean;
- Number(value) - przekształca podaną wartość na liczbę (może to być liczba całkowita lub zmiennoprzecinkowa);
- String(value) - przekształca podaną wartość na ciąg znaków;
Użycie jednego z tych trzech funkcji do przekształcenia wartości tworzy nową wartość, która zawiera wartość bezpośrednio przekształconą z oryginalnej wartości. Może to prowadzić do niespodziewanych konsekwencji.
Funkcja Boolean()
Jeśli wartość do przekonwertowania jest ciągiem znaków z co najmniej jednym znakiem, niezerową liczbą lub obiektem, funkcja Boolean() zwróci true. Jeśli wartością jest pusty ciąg znaków, liczba 0, undefined lub null, funkcja zwróci false.
Możesz przetestować konwersję typów Boolean za pomocą poniższego kodu:
var b1 = Boolean(""); //false - pusty ciąg znaków var b2 = Boolean("hello"); //true - niepusty ciąg znaków var b1 = Boolean(50); //true - liczba niezerowa var b1 = Boolean(null); //false - null var b1 = Boolean(0); //false - zero var b1 = Boolean(new object()); //true - obiekt
Funkcja Number()
Konwersja typów z użyciem funkcji Number() działa podobnie jak metody parseInt() i parseFloat(), ale konwertuje całą wartość, a nie jej część.
Pamiętasz, że metody parseInt() i parseFloat() konwertują tylko ciąg znaków przed pierwszym niewłaściwym znakiem, więc "1.2.3" zostanie odpowiednio przekształcone na "1" i "1.2".
Przymusowa konwersja za pomocą Number(), "1.2.3" zwróci NaN, ponieważ cała wartość ciągła nie może być przekształcona na liczbę. Jeśli wartość ciągła może być całkowicie przekształcona, Number() oceni, czy jest to wywołanie metody parseInt() czy parseFloat().
Poniższa tabela wyjaśnia, co się dzieje, gdy wywołuje się metodę Number() dla różnych wartości:
Użycie | Wynik |
---|---|
Number(false) | 0 |
Number(true) | 1 |
Number(undefined) | NaN |
Number(null) | 0 |
Number("1.2") | 1.2 |
Number("12") | 12 |
Number("1.2.3") | NaN |
Number(new object()) | NaN |
Number(50) | 50 |
Funkcja String()
Ostatni sposób przymusowej konwersji, funkcja String(), jest najprostszy, ponieważ może przekształcić każdą wartość w ciąg znaków.
Aby wykonać tę przymusową konwersję, wystarczy wywołać metodę toString() wartości przekazanej jako parametr, np. przekształcić 12 w "12", true w "true", false w "false", itd.
Różnica między przymusowym konwersją na ciąg znaków a wywołaniem metody toString() polega na tym, że przymusowa konwersja wartości null i undefined na ciąg znaków może generować ciąg znaków bez wywoływania błędu:
var s1 = String(null); //"null" var oNull = null; var s2 = oNull.toString(); //wywoła błąd
W przypadku pracy z językami słabego typowania, takimi jak ECMAScript,强制类型转换 jest bardzo przydatny, ale należy upewnić się, że używa się wartości poprawnych.
- Poprzednia strona Typy oryginalne ECMAScript
- Następna strona Typy referencyjne ECMAScript