2015-07-22 9 views
7

In meinem Code kann der Wert einer bestimmten Var aus einer beliebigen Anzahl von verschiedenen json-Quellen stammen. Für einige dieser Quellen ist das betreffende json-Element eine Zeichenkette (z. B. "temp": "10.2"), während das json-Element für andere Quellen bereits ein float (z. B. "temp": 10.2) ist.Übergabe einer Zahl an parseFloat() anstelle von String

Tut es etwas schaden (ist etwas wahrscheinlich zu brechen), wenn ich nur das Json-Element (aus welcher Quelle) durch eine parseFloat() übergeben, auch wenn es bereits ein Schwimmer ist? Es scheint zu funktionieren; Ich denke nur an gute/schlechte Praktiken und mögliche Brüche in Zukunft oder auf einer anderen Plattform.

Danke.

Antwort

0

Persönlich kann ich nicht sehen, dass dies ein Problem ist, was auch immer, um ehrlich zu sein, würde ich immer den parsefloat() aus einem Grund verwenden, und das ist Sicherheit. Sie können nie sicher sein, was passieren kann, so dass immer vorhersagen, die schlimmer: D

0

Nö gibt es kein Problem mit einer Nummer Leiten

MDN sagt, solange es auf eine Zahl, nichts überführt werden können Brechen sollte passieren.

Wenn das erste Zeichen nicht in eine Zahl konvertiert werden kann, gibt parseFloat NaN zurück.

Als Alternative können Sie den unären Operator + verwenden, die im Grunde macht das Gleiche wie parseFloat und gibt auch NaN, wenn es nicht funktioniert.

Zum Beispiel:

var myFloat = +('10.5'); 
var myOtherFloat = parseFloat('10.5', 10); 
var alreadyAFloat = parseFloat(10.5, 10); 

console.log(myFloat === myOtherFloat && myOtherFloat === alreadyAFloat); // true 
1

Sie sollten in der Lage sein parseFloat() auf einem Schwimmer anzurufen oder eine Zeichenfolge ohne Probleme. Wenn es bereits ein Float ist, wird es zuerst in einen String umgewandelt und dann wieder in einen Float, also ist es etwas weniger effizient, aber es sollte nicht zu viel Bedeutung haben.

Sie sollten immer noch das Ergebnis für NaN überprüfen, falls etwas unerwartetes in den Daten ist.

0

Ob es ein float ist oder ein String mit parseFloat() ist viel sicherer, um alle Arten von Fehlern zu vermeiden.

Wie Sie sagten, wird es immer funktionieren, aber wenn Sie es zu einem Float erzwingen werden Sie vermeiden, eine Ausnahme zu bekommen.

Beispiel:

Sowohl parseFloat('10.2', 10) und parseFloat(10.2, 10) perfekt funktionieren und werden Sie das gleiche Ergebnis, die 10.2 ist.

1

Die am besten geeignete Methode beliebigen Datentyp in eine Zahl umzuwandeln, ist die Number Funktion zu verwenden:

In einem nicht-Konstruktor Kontext (dh ohne den new Operator), Number kann verwendet werden, um eine Typumwandlung durchzuführen.

Number("1234") // 1234 
Number(1234)  // 1234 

Dieses Verfahren unterscheidet sich von parseFloat auf diese Weise zumindest:

  1. Anzahl Funktion nicht "double-conversion" nicht durchführt, wenn der Eingang ist bereits eine Reihe (ref)
    • Parse float konvertiert die Eingabe in eine Zeichenfolge und extrahiert dann die Nummer (ref)
  2. Die Zahlenfunktion gibt Common Sense-Werte für die meisten Datentypen zurück, z. Number(true) Ausbeuten 1
    • Parse Schwimmers den String-Wert von Eingabe verwendet so parseFloat(true) Versuche Anzahl von "true" zu parsen und ergibt NaN
  3. Anzahl Funktion fehlschlägt, wenn Eingabezeichenfolge eine ungültige Nummer ist z.B. Number("123abc") ergibt NaN
    • Parse Schwimmer versucht so viel von einer Anzahl wie möglich, z.B. parsen parseFloat("123abc") ergibt 123
1

Wenn Sie den Wert sind sicher, dass es immer eine gültige Zahl, sollten Sie Number(stringOrNumber) verwenden.

Wenn Sie einige zusätzliche Sicherheit benötigen parseFloat() verwenden Sie können auch Ihre eigene Funktion schreiben, die auch die Leistung optimiert:

function toFloat(value) { 
    return typeof value === 'number' ? value : parseFloat(value); 
} 

ich auch eine jsPerf test case geschaffen, das die Leistung zeigt> 30% besser als die Ebene parseFloat() für ein 1: 1-Verhältnis zwischen Strings und Zahlen als Eingabewerte.