9 Stimmen

Javascript String zu Nummer Typ Zwang

Ich bin neulich auf dieses Problem gestoßen und konnte nicht herausfinden, was genau unter der Haube vor sich geht. Was sind die Regeln für die Zwangsumwandlung einer Zeichenkette in einen Zahlentyp? und warum schlägt es in der Instanz von "5.0.1" fehl?

var numStr = '5.0';
var floatStr = '5.0.1';

//Passes
if (numStr >= 4) {
    alert('5 > 4');
}

//Fails
if (floatStr >= 4) {
    alert('5.0.1 > 4');
}

console.log(parseInt(numStr)); //5
console.log(parseInt(floatStr)); //5

console.log(Number(numStr)); //5
console.log(Number(floatStr)); //NaN

6 Stimmen

Was wäre die Entsprechung in der Mathematik? 5.0.1??

0 Stimmen

Mir ist klar, dass 5.0.1 keine Zahl ist. Ich bin auf der Suche nach einem Einblick in den Prozess der Zwangsbehandlung in diesem Fall. Was tut parseInt tun, dass der Prozess der String -> num nicht tun?

0 Stimmen

An dieser Stelle sei angemerkt, dass Sie bei der Verwendung von implizitem Zwang gegenüber *1 erhalten Sie auch das gleiche Verhalten wie bei der expliziten Typisierung. Das heißt floatStr*1 // NaN .

15voto

Peter Punkte 3879

Nun, zum einen, "5.0.1" ist keine gültige String Darstellung einer Gleitkommazahl. Ich hätte erwartet parseInt ebenfalls gescheitert zu sein.

Edita: Im Gegensatz zur Typisierung des Wertes, parseInt ist eine Funktion, die entwickelt wurde, um einen Wert mit größerer Toleranz gegenüber Rauschen zu extrahieren.

Die Einzelheiten der Implementierung sind in definiert: EMCA-262

Zum Beispiel bei der Anwendung eines Gipses Number([value]) die toNumber Funktion wird zur Durchführung der Konvertierung verwendet - wie in Abschnitt 9.3.1 beschrieben. Das Verhalten von parseInt ist in Abschnitt 15.1.2.2 beschrieben.

2voto

Craig M Punkte 5506

5.0.1 ist keine Zahl. 5.01 ist eine Zahl. Es funktioniert mit parseInt, weil parseInt alles nach der ersten Dezimalstelle ignoriert.

1voto

Neil Punkte 52506

("5.0.1" > 4) -> (Number("5.0.1") > 4) -> (NaN > 4) -> falsch.

0voto

DanC Punkte 8285

Es beginnt zu ignorieren, wenn eine ungültige Zeichenkette auftaucht, versucht aber, den ersten Teil zu parsen.

parseInt("23.2332adsasd") -> 23
parseFloat("23.23adsdsd") -> 23.23

-3voto

cpsp Punkte 1
Object.prototype.toNumber=function(){return this-0;}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X