2013-03-15 16 views
14

Welche Regel muss ich beachten, wenn ich Zahlen aus dem DOM extrahiere und mit ihnen kombiniere? Wie weiß Javascript, dass ein Wert eine Zahl ist oder nicht? Soll ich immer parseInt verwenden?Wann verwende ich parseInt?

Bei folgenden Code:

HTML

<div id="myvalue">5</div> 
<div id="withParseInt"></div> 
<div id="withoutParseInt"></div> 
<div id="withoutParseIntButIncrement"></div> 

JS & jQuery:

var value = $('#myvalue').text(); 
$('#withParseInt').text(parseInt(value) + 1); 
$('#withoutParseInt').text(value + 1); 
$('#withoutParseIntButIncrement').text(value++); 

gibt folgende Ausgabe:

5 
6 
51 
5 

Fiddle: 012.343.

Antwort

12

Die Methode .text() gibt immer eine Zeichenfolge zurück. Einige Operatoren wie der Operator + sind überladen, um sowohl arithmetische als auch Zeichenfolgenoperationen auszuführen. Im Falle von Strings führt es eine Verkettung durch, daher das Ergebnis "51".

Wenn Sie eine Zeichenkette haben und einen nicht erzwingenden Operator verwenden müssen, müssen Sie parseInt (oder eine andere Methode zur Umwandlung in eine Zahl) verwenden.

Der Operator * zum Beispiel implicity führt diesen Zwang aus, so dass Sie in dieser Situation den parseInt-Aufruf nicht benötigen (siehe beispielsweise updated fiddle).

Beachten Sie, dass der Operator seinen Operand erzwingt, aber Sie haben den Postfixoperator verwendet, so dass er keinen Effekt hat. Verwenden Sie den Präfix-Operator und Sie können sehen, es funktioniert:

$('#withoutParseIntButIncrement').text(++value); 

also zusammenfassen:

// Parses string to number and adds 1 
$('#withParseInt').text(parseInt(value) + 1); 

// Coerces number 1 to string "1" and concatenates 
$('#withoutParseInt').text(value + 1); 

// Implicity coerces string to number, but after it's been inserted into the DOM 
$('#withoutParseIntButIncrement').text(value++); 

// Implicity coerces string to number, before it's been inserted into the DOM 
$('#withoutParseIntButIncrement').text(++value); 

// Implicity coerces to number 
$('#withoutParseIntButMultiply').text(value * 2); 

Randbemerkung: gilt es als gute Praxis immer das zweite Argument übergeben (die Radix) zu parseInt.Dadurch wird sichergestellt, die Zahl in der richtigen Basis analysiert wird:

parseInt(value, 10); // For base 10 
+0

Das klingt vernünftig. Manchmal hatte ich einige ernsthafte Probleme, wenn ich mit Zahlen aus DOM rechnete, also kam ich immer dazu, parseInt zu verwenden, wenn ich mit der Nummer umging. Deine Antwort bestätigt es. So bin ich auf der sicheren Seite. – iappwebdev

+1

http://stackoverflow.com/questions/11786758/why-parseint08-is-giving-0-whereas-parseint07-is-giving-7?rq=1 Diese Frage erklärt auch, warum Sie wegen einiger immer eine Basis liefern sollten seltsame Browser-Macken beim Parsen von ganzen Zahlen. –

1

Ja, Sie sollten immer parseInt() oder Number() verwenden, um auf der sicheren Seite zu sein. Sonst wird Javascript entscheiden, was mit ihm selbst

  • Der Wert zu tun
  • ein String ist
  • -Operator + zwei Strings
  • Mit Operator verketten wird - die numerische Differenz
  • ... berechnen
7

Eine und einzige Regel:

Jeder Wert, den Sie aus dem DOM abrufen, ist eine Zeichenfolge.

+4

gleich ... und jeder Wert, den Sie DOM wird wieder einsetzen ein String. –

1

Es ist immer gut parseInt nur zu verwenden, um auf der sicheren Seite zu sein, vor allem, wie Sie einen zweiten Parameter für das numerische System liefern können, zu verwenden.

By the way, in Ihrem letzten Beispiel sollte es ++value sein, wenn Sie es 6. wollen

Verwandte Themen