Rolf B: Array-Elemente nach Typ auswerten

Beitrag lesen

Hallo effel,

ich habe deinen Code mal als Code markiert, damit man wenigstens ein bisschen lesen kann. Und ich nehme an, dass Raketenwilli deinen Code korrekt als JavaScript erraten hat und habe den Beitrag entsprechend getaggt.

Wenn Du die Chance hast, deine Zahlen als Zahlen zu speichern, dann tu das. Dann funktioniert typeof.

Die von Raketenwilli notierte Abfrage Number.isNaN(arr[i]*1) sieht merkwürdig aus, aber die Sache mit der Zahlenerkennung ist tatsächlich nicht so einfach.

  • parseInt würde auch "3a" als Zahl liefern, nämlich 3
  • Es gibt zwei isNaN Funktionen: eine globale und (seit ECMAScript 2015) auch eine isNaN Methode am Number Objekt. Da man auf den IE keine Rücksicht mehr nehmen muss, kann man die verwenden, ohne Polyfills im Hintergrund halten zu müssen.
  • Problem der globalen isNaN Funktion: sie wandelt ihr Argument zuerst in eine Zahl um. Jeder falsy-Wert (0, "", false, null) wird zu 0 umgewandelt und würde deshalb als Zahl erkannt werden. Das mag ok für Dich sein - keine Ahnung.
  • Number.isNaN prüft dagegen exakt auf den NaN Wert (Not A Number - ein spezieller Wert in JavaScript für Rechenergebnisse, die nicht numerisch sind). Wenn Du arr[i] mit 1 multiplizierst, fordert das JavaScript auf, das Array-Element zunächst in eine Zahl zu konvertieren. Das geschieht nicht mit parseInt oder parseFloat, sondern durch Einsatz von Number als Funktion, und dieser Aufruf ist sehr strikt. Leerzeichen vorn und hinten sind ok, aber jedes andere falsche Zeichen erzeugt den NaN Wert.

Das funktioniert zwar, ist aber nicht 100% klar. Eine klarere Formulierung ist aus meiner Sicht der Test isNaN(Number(arr[i])). Damit wird das Array-Element explizit in eine Zahl konvertiert, das Ergebnis ist entweder eine gültige Zahl (dann liefert isNaN false) oder eben NaN und dann liefert isNaN true. Andererseits spricht auch nichts gegen einen typeof Test, nachdem Du den Wert mit Number versuchsweise konvertiert hast.

Also so:

let num = Number(arr[i]);
if (typeof(num) == 'number'
   // Als Zahl verarbeiten
} 
else {
   // Als String verarbeiten
}

oder so

let num = Number(arr[i]);
if (!isNaN(num)) {
   // Als Zahl verarbeiten
} 
else {
   // Als String verarbeiten
}

Im zweiten Beispiel könnte man den then und else Teil auch vertauschen, um den Not-Operator weglassen zu können.

Rolf

--
sumpsi - posui - obstruxi