Signatur
Beschreibung
isFinite() ist eine Funktion des globalen Objekts. Sie gibt true zurück, wenn der übergebene Wert nach der Umwandlung in eine Zahl endlich ist, also weder NaN noch Infinity oder -Infinity. In allen anderen Fällen gibt sie false zurück.
Wichtig ist die implizite Typumwandlung: Ist das Argument keine Zahl, wird es zuerst wie bei Number(value) umgewandelt. Deshalb liefern isFinite("42"), isFinite(""), isFinite(null) und isFinite(true) alle true. Leere Zeichenketten und null werden nämlich zu 0. Werte vom Typ BigInt oder Symbol lösen dabei einen TypeError aus.
Das Verhalten ist gewollt, wenn Sie „alles, was sich als endliche Zahl deuten lässt“ akzeptieren möchten, zum Beispiel beim schnellen Prüfen von Formulareingaben. Für eine strikte Prüfung, ob ein Wert wirklich eine endliche Zahl vom Typ number ist, ist Number.isFinite() die bessere Wahl. Diese Methode wandelt nichts um und gibt für jeden Wert, der keine Zahl ist, false zurück.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $value Pflicht | any | Der zu prüfende Wert. Ist er keine Zahl, wird er vorher mit Number()-Semantik umgewandelt. Fehlt das Argument, wird undefined geprüft, und das Ergebnis ist false. |
Rückgabewert
true, wenn der umgewandelte Wert eine endliche Zahl ist. false bei NaN, Infinity oder -Infinity.Beispiele
Grundverhalten mit Zahlen und Sonderwerten
console.log(isFinite(42)); // true
console.log(isFinite(-3.14)); // true
console.log(isFinite(Infinity)); // false
console.log(isFinite(-Infinity)); // false
console.log(isFinite(NaN)); // false
console.log(isFinite(1 / 0)); // false
Fallstrick: implizite Typumwandlung im Vergleich zu Number.isFinite()
const werte = ['42', '', ' ', null, true, undefined, '12px', [5]];
for (const w of werte) {
console.log(JSON.stringify(w), isFinite(w), Number.isFinite(w));
}
Formulareingabe robust validieren
const parseBetrag = (eingabe) => {
const text = String(eingabe).trim().replace(',', '.');
// Leere Eingaben ausschließen, da isFinite('') true liefert
if (text === '') return null;
const zahl = Number(text);
return Number.isFinite(zahl) ? zahl : null;
};
console.log(parseBetrag('19,99')); // 19.99
console.log(parseBetrag(' ')); // null
console.log(parseBetrag('1e400')); // null (Infinity)
console.log(parseBetrag('abc')); // null
Division absichern
const durchschnitt = (summe, anzahl) => {
const ergebnis = summe / anzahl;
return isFinite(ergebnis) ? ergebnis : 0;
};
console.log(durchschnitt(100, 4)); // 25
console.log(durchschnitt(100, 0)); // 0 (statt Infinity)
console.log(durchschnitt(0, 0)); // 0 (statt NaN)
// Wichtig · Fallstricke
- Überraschende Umwandlung:
isFinite(""),isFinite(" "),isFinite(null),isFinite(false)undisFinite([])lieferntrue, weil diese Werte zu0werden. Prüfen Sie leere Eingaben deshalb gesondert, oder verwenden SieNumber.isFinite(). - TypeError:
isFinite(10n)undisFinite(Symbol())werfen einenTypeError, weil sichBigIntundSymbolnicht implizit innumberumwandeln lassen.Number.isFinite(10n)gibt dagegen einfachfalsezurück. - Kein Ganzzahltest:
isFinite(0.5)isttrue. Ob eine Zahl ganzzahlig ist, prüfen Sie mitNumber.isInteger()oderNumber.isSafeInteger(). - Objekte mit eigenem
valueOf()oderSymbol.toPrimitivewerden dabei aufgerufen. Das kann Nebenwirkungen haben. - Die Funktion wird in allen Browsern und in Node.js unterstützt. Viele Linter-Regeln (z. B.
no-restricted-globalsin ESLint-Konfigurationen wie Airbnb) empfehlen stattdessenNumber.isFinite(), das seit ES2015 verfügbar ist.