Der Ganzzahltyp (Integer) verursacht in JavaScript häufig seltsame Probleme. In der ECMAScript-Spezifikation existieren sie nur als Konzepte:
Alle Zahlen sind Gleitkommazahlen und ganze Zahlen sind nur eine Menge von Zahlen ohne Dezimalstellen.
In diesem Blog erkläre ich, wie man prüft, ob ein Wert eine Ganzzahl ist.
ECMAScript 5
Es gibt viele Methoden, die Sie in ES5 verwenden können. Manchmal möchten Sie vielleicht Ihre eigene Methode verwenden: eine Funktion isInteger(x), die true zurückgibt, wenn es eine Ganzzahl ist, andernfalls false.
Schauen wir uns einige Beispiele an.
Restprüfung bestanden
Sie können die Restoperation (%) verwenden, um den Rest einer Zahl um 1 zu berechnen, um zu sehen, ob der Rest 0 ist.
function isInteger(x) { return x % 1 === 0; }
Ich mag diese Methode, weil sie sehr einfach und effektiv ist.
> isInteger(17) true > isInteger(17.13) false
Sie müssen bei Restoperationen vorsichtig sein, da das Ergebnis vom Vorzeichen der ersten Zahl abhängt. Wenn es positiv ist, ist es ansonsten negativ.
> 3.5 % 1 0.5 > -3.5 % 1 -0.5
Dann können wir auch nach 0 suchen, was eigentlich kein Problem darstellt. Das Problem ist jedoch: Diese Methode gibt auch für Nicht-Zahlen true zurück, da % sie in eine Zahl umwandelt:
> isInteger('') true > isInteger('33') true > isInteger(false) true > isInteger(true) true
Kann mit einer sehr einfachen Typprüfung gelöst werden:
function isInteger(x) { return (typeof x === 'number') && (x % 1 === 0); }
Wenn eine Zahl durch Math.round() mit ihrem vorherigen Wert nach dem Runden übereinstimmt, ist sie eine Ganzzahl. Dies kann über Math.round() in JavaScript überprüft werden:
function isInteger(x) { return Math.round(x) === x; }
Diese Methode ist auch gut
> isInteger(17) true > isInteger(17.13) false
Es können auch Nicht-Zahlen ermittelt werden, da Math.round() immer Zahlen zurückgibt und === nur dann true zurückgibt, wenn die Typen gleich sind.
> isInteger('') false
Wenn Sie den Code etwas klarer gestalten möchten, können Sie eine Typprüfung hinzufügen (was wir in früheren Versionen getan haben). Darüber hinaus funktionieren Math.floor() und Math.ceil() wie Math.round(). Überprüfen durch Bitoperationen Bitoperatoren bieten eine weitere Möglichkeit zum „Runden“:
function isInteger(x) { return (x | 0) === x; }
Diese Lösung hat (wie andere bitweise Operationen) einen Fehler: Sie kann keine Zahlen verarbeiten, die größer als 32 Bit sind.
> isInteger(Math.pow(2, 32)) false
Überprüfung durch parseInt() parseInt() bietet auch eine Methode ähnlich wie Math.round(), um Zahlen in ganze Zahlen umzuwandeln. Mal sehen, warum diese Methode gut ist.
function isInteger(x) { return parseInt(x, 10) === x; }
Wie die Math.round()-Lösung kann sie auch nicht-numerische Fälle verarbeiten, aber auch nicht alle Ganzzahlen korrekt:
> isInteger(1000000000000000000000) false
Warum? parseInt() erzwingt, dass das erste Argument als Zeichenfolge analysiert wird, bevor eine Ganzzahl analysiert wird. Daher ist die Verwendung dieser Methode zur Konvertierung von Zahlen in ganze Zahlen keine gute Wahl.
> parseInt(1000000000000000000000, 10) 1 > String(1000000000000000000000) '1e+21'
Genau wie oben hat parseInt() die Verarbeitung beim Parsen von „1e 21“ bei 1 gestoppt, sodass 1 zurückgegeben wird. ECMAScript 6 Zusätzlich zu Math.round() bietet ES6 eine weitere Zahlmethode zum Konvertieren in eine Ganzzahl: Math .trunc(). Diese Funktion entfernt den Dezimalteil einer Zahl.
> Math.trunc(4.1) 4 > Math.trunc(4.9) 4 > Math.trunc(-4.1) -4 > Math.trunc(-4.9) -4
Darüber hinaus muss sich ECMAScript 6 nicht mit der trivialen Aufgabe der Prüfung von Ganzzahlen befassen, da es über eine integrierte Funktion Number.isInteger() verfügt.