Название | JavaScript – Das Handbuch für die Praxis |
---|---|
Автор произведения | David Flanagan |
Жанр | Математика |
Серия | |
Издательство | Математика |
Год выпуска | 0 |
isbn | 9783960104926 |
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)
3.9.3Umwandlung von Objekten in primitive Datentypen
In den vorangegangenen Abschnitten wurde erläutert, wie Sie Werte eines Typs explizit in einen anderen Typ konvertieren können, und es wurden die impliziten Umwandlungen von Werten eines primitiven Typs in einen anderen primitiven Typ erläutert. Dieser Abschnitt behandelt die komplizierten Regeln, die JavaScript nutzt, um Objekte in primitive Werte umzuwandeln. Er ist lang, und es wird etwas undurchsichtig – falls Sie also dieses Kapitels zum ersten Mal lesen, können Sie diesen Abschnitt ruhig überspringen und mit 3.10 weitermachen.
Ein Grund für die Komplexität der Umwandlungen von Objekten in primitive Datentypen in JavaScript liegt darin, dass einige Objekttypen mehr als nur eine primitive Darstellung haben. Datumsobjekte können z.B. als Zeichenketten oder als numerische Zeitstempel dargestellt werden. Die JavaScript-Spezifikation definiert drei grundlegende Algorithmen zur Umwandlung von Objekten in primitive Werte:
prefer-string
Dieser Algorithmus gibt als primitiven Wert bevorzugt einen String zurück, falls eine Konvertierung in eine Zeichenkette möglich ist.
prefer-number
Dieser Algorithmus gibt als primitiven Wert bevorzugt eine Zahl zurück, falls eine solche Umwandlung möglich ist.
no-preference
Dieser Algorithmus besitzt keine Präferenz hinsichtlich des erwünschten primitiven Werts, und Klassen können ihre eigenen Umrechnungen definieren. Fast alle eingebauten JavaScript-Typen implementieren diesen Algorithmus als prefer-number – nur die Date-Klasse implementiert ihn als prefer-string.
Weitere Details zu diesen Algorithmen finden Sie am Ende dieses Abschnitts. Zuerst schauen wir uns jedoch an, wie sie in JavaScript verwendet werden.
Umwandlung von Objekten in boolesche Werte
Die Umwandlung von Objekten in boolesche Werte ist trivial: Alle Objekte werden in true konvertiert. Übrigens wird für diese Umwandlung keiner der eben erwähnten Algorithmen benötigt. Zudem erfolgt diese Konvertierung bei allen Objekten – leere Arrays und das Wrapper-Objekt new Boolean(false) eingeschlossen.
Umwandlung von Objekten in Strings