Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 54
3.9.2Explizite Umwandlung
ОглавлениеObgleich JavaScript viele Typumwandlungen automatisch durchführt, werden Sie gelegentlich Umwandlungen explizit vornehmen müssen oder möchten dies vielleicht einfach tun, um den Code verständlicher zu gestalten.
Am einfachsten können Sie eine explizite Typumwandlung mit den Funktionen Boolean(), Number() und String() vornehmen:
Number("3") // => 3
String(false) // => "false": Oder verwenden Sie false.toString().
Boolean([]) // => true
Alle Werte außer null und undefined besitzen eine toString()-Methode, deren Ergebnis üblicherweise dem entspricht, was von der Funktion String() geliefert wird.
Übrigens können die Funktionen Boolean(), Number() und String() auch – mit new – als Konstruktor aufgerufen werden. Auf diese Weise erhalten Sie ein Wrapper-Objekt, das sich genauso verhält wie ein einfacher boolescher Wert, ein Zahlen- oder ein String-Wert. Diese Wrapper-Objekte sind ein historisches Überbleibsel aus den frühesten Tagen von JavaScript, und es gibt keinen guten Grund, sie zu verwenden.
Bestimmte JavaScript-Operatoren führen implizite Typumwandlungen durch und werden gelegentlich explizit eingesetzt, um eine Umwandlung zu erzwingen. Ist einer der Operanden des +-Operators ein String, wird auch der andere in einen String umgewandelt. Der unäre +-Operator wandelt seinen Operanden in eine Zahl um, der unäre !-Operator wandelt seinen Operanden dagegen in einen booleschen Wert um und negiert diesen. Diese Umstände sind für die folgenden Idiome für Typumwandlungen verantwortlich, auf die Sie gelegentlich in Code stoßen können:
x + "" // => String(x)
+x // => Number(x)
x-0 // => Number(x)
!!x // => Boolean(x): Beachten Sie das doppelte !.
Computerprogramme stehen häufig vor der Aufgabe, Zahlen formatieren und parsen zu müssen, und JavaScript besitzt spezialisierte Funktionen und Methoden, die eine genauere Kontrolle von Zahl-zu-String- und String-zu-Zahl-Umwandlungen ermöglichen.
Die toString()-Methode, die von der Klasse Number definiert wird, akzeptiert ein optionales Argument, das eine Basis für die Umwandlung angibt. Verzichten Sie auf dieses Argument, erfolgt die Konvertierung zur Basis 10. Sie können Zahlen aber auch zu anderen Basen (zwischen 2 und 36) umwandeln, zum Beispiel:
let n = 17;
let binary = "0b" + n.toString(2); // binary == "0b10001"
let octal = "0o" + n.toString(8); // octal == "0o21"
let hex = "0x" + n.toString(16); // hex == "0x11"
Wenn Sie mit Daten aus dem Finanzwesen oder der Wissenschaft arbeiten, wollen Sie bei der Umwandlung von Zahlen in Strings vielleicht mitunter festlegen, wie viele Nachkommastellen oder signifikante Ziffern das Ergebnis hat oder dass die wissenschaftliche Notation (die Exponentialschreibweise) verwendet wird. Die Klasse Number definiert drei Methoden für diese Art von Umwandlungen von Zahlen in Zeichenketten. toFixed() wandelt eine Zahl in einen String mit einer bestimmten Anzahl von Nachkommastellen um. Diese Methode nutzt nie die wissenschaftliche Notation. toExponential() liefert eine String-Darstellung einer Zahl in Exponentialschreibweise mit einer Stelle vor dem Komma und einer angegebenen Anzahl von Nachkommastellen (das heißt, dass die Anzahl signifikanter Stellen um eins größer ist als der von Ihnen angegebene Wert). toPrecision() wandelt eine Zahl in einen String mit der angegebenen Anzahl signifikanter Stellen um. Diese Methode nutzt die exponentielle Notation, wenn die Anzahl signifikanter Stellen nicht ausreicht, um den ganzzahligen Anteil der Zahl vollständig anzuzeigen. Beachten Sie bitte, dass alle drei Methoden die verbleibenden Stellen entweder runden oder mit Nullen auffüllen. Dazu die folgenden Beispiele:
let n = 123456.789;
n.toFixed(0) // => "123457"
n.toFixed(2) // => "123456,79"
n.toFixed(5) // => "123456,78900"
n.toExponential(1) // => "1.2e+5"
n.toExponential(3) // => "1.235e+5"
n.toPrecision(4) // => "1.235e+5"
n.toPrecision(7) // => "123456.8"
n.toPrecision(10) // => "123456.7890"
Zusätzlich zu den hier gezeigten Zahlenformatierungsmethoden definiert die Klasse Intl.NumberFormat eine allgemeinere, internationalisierte Methode zur Formatierung von Zahlen. Einzelheiten dazu finden Sie in 11.7.1.
Wenn Sie der Umwandlungsfunktion Number() einen String übergeben, versucht diese, den String als Ganzzahl- oder Gleitkommaliteral zu parsen. Number() funktioniert nur bei ganzen Zahlen zur Basis 10 und erlaubt nach dem Zahlliteral keine weiteren Zeichen, die nicht Teil des Literals sind. Die Funktionen parseInt() und parseFloat() – beides globale Funktionen, keine Methoden irgendeiner Klasse – sind flexibler. parseInt() parst nur ganze Zahlen, während parseFloat() dazu sowohl bei Ganzzahlen als auch bei Gleitkommazahlen in der Lage ist. Wenn eine Zeichenkette mit 0x oder 0X beginnt, interpretiert parseInt() sie als hexadezimale Zahl. Sowohl parseInt() als auch parseFloat() überspringen führende Leerzeichen, parsen so viele numerische Zeichen wie möglich und ignorieren alles, was folgt. Wenn das erste Nicht-Whitespace-Zeichen kein zulässiger Bestandteil eines numerischen Literals ist, liefern beide NaN:
parseInt("3 blind mice") // => 3
parseFloat(" 3.14 meters") // => 3.14
parseInt("-12.34") // => -12
parseInt("0xFF") // => 255
parseInt("0xff") // => 255
parseInt("-0XFF") // => -255
parseFloat(".1") // => 0.1
parseInt("0.1") // => 0
parseInt(".1") // => NaN: Ganze Zahlen dürfen nicht mit einem "."
// beginnen.
parseFloat("$72.47") // => NaN: Zahlen dürfen nicht mit "$" beginnen.
parseInt() akzeptiert ein optionales zweites Argument, über das die Basis der zu parsenden Zahl angegeben werden kann. Für dieses Argument sind Werte zwischen 2 und 36 erlaubt, zum Beispiel:
parseInt("11", 2) // => 3: (1*2 + 1)
parseInt("ff", 16) // => 255: (15*16 + 15)
parseInt("zz", 36) // => 1295: (35*36 + 35)
parseInt("077", 8) // => 63: (7*8 + 7)
parseInt("077", 10) // => 77: (7*10 + 7)