2013-03-15 29 views
14

Jaką regułę muszę przestrzegać przy wyodrębnianiu numerów z DOM i kalkulacji z nimi? Jak javascript wie, że wartość jest liczbą, czy nie? Czy zawsze powinienem używać parseInt?Kiedy używać parseInt

Biorąc pod uwagę następujący kod:

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++); 

daje następujące dane wyjściowe:

5 
6 
51 
5 

Fiddle: http://jsfiddle.net/ytxKU/3/

Odpowiedz

12

Metoda zawsze zwraca ciąg znaków. Niektóre operatory, takie jak operator +, są przeciążone, aby wykonywać operacje arytmetyczne i łańcuchowe. W przypadku łańcuchów wykonuje konkatenację, stąd wynik "51".

Jeśli masz ciąg znaków i musisz użyć operatora niewymagającego, będziesz musiał użyć parseInt (lub innej metody konwersji na liczbę).

Jednak operator * na przykład implikację wykonuje tę koercję, więc w tej sytuacji nie potrzebujesz wywołania parseInt (patrz na przykład updated fiddle).

Należy zauważyć, że operator 2 przyrostu ++ wymusza jego operand, ale używałeś operatora postfiksu, aby nie wywoływał żadnego efektu. Użyj operatora przedrostka i widać to działa:

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

Tak więc, aby podsumować:

// 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); 

marginesie: to uważane za dobre praktyki na zawsze przejdzie do drugiego argumentu (Radix) do parseInt.Zapewnia to liczba jest analizowany w prawidłowej podstawy:

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

Brzmi rozsądnie. Czasami miałem kilka poważnych problemów podczas obliczania z liczbą wyodrębnioną z DOM, więc Icame zawsze używa parseInt podczas pracy z numerem. Twoja odpowiedź to potwierdza. W ten sposób jestem po bezpiecznej stronie. – iappwebdev

+1

http://stackoverflow.com/questions/11786758/why-parseint08-is-giving-0-whereas-parseint07-is-giving-7?rq=1 To pytanie wyjaśnia również, dlaczego należy zawsze dostarczać bazę ze względu na niektóre dziwne przeglądarki dziwaczne w analizowaniu liczb całkowitych. –

1

Tak, zawsze należy używać metody parseInt() lub Number(), aby zachować bezpieczną stronę. Javascript inaczej zadecyduje, co z nim zrobić

  • Sama wartość jest ciągiem
  • Korzystanie z operatorem + będzie złączyć dwa ciągi
  • Korzystanie z operatorem - obliczy różnicę liczbową
  • ...
7

Jedna zasada:

Każda wartość pobierana z DOM jest łańcuchem znaków.

+4

... i każda wartość wstawić z powrotem do DOM staje się ciągiem. –

1

To zawsze dobrze używać parseInt po prostu się na bezpiecznej stronie, zwłaszcza że można dostarczyć drugi parametr dla systemu liczbowego do wykorzystania.

Nawiasem mówiąc, w ostatnim przykładzie powinno być ++value jeśli chcesz go równa 6.

Powiązane problemy