2013-06-03 19 views
11

Można konwertować ciąg na liczbę całkowitą na wiele sposobów, np.Najlepszy sposób na analizowanie int w JavaScript

  • parseInt("-1",10)
  • Math.floor("-1")
  • Number("-1")
  • "-1"|0
  • ~~"-1"

przyjąć, że pierwszy z nich ma postać kanoniczną, lecz na przykład używa trzeciej do wymuszenia ints. Prawdopodobnie jest na to więcej sposobów.

Jakie są różnice i zalety korzystania z każdego z nich? Który powinien być najszybszy?

+1

Dodaj podstawę w parsent, aby mieć pewność, że uzyskasz to, co chcesz we wszystkich przeglądarkach. –

+4

[jsperf - ciąg do liczby całkowitej] (http://jsperf.com/str2intbench) – Sirko

+0

@Sirko To bardzo cenny link! Wygląda na to, że 'eval (" - 1 ")' jest najwolniejszym (zdecydowanie), a arytmetyczne * hacki * są najszybsze. Łał. Możesz łatwo zmienić to w interesującą odpowiedź. – emesx

Odpowiedz

8

Kanoniczny sposób analizy liczby dziesiętnej to parseInt(str, 10).

Jeśli chodzi o inne rozwiązania:

  • parseInt("-1"): używają go tylko, jeśli chcesz żyć niebezpiecznie (niektóre przeglądarki zakładać "009" jest dziesiętny, nie wszystkie)
  • Math.floor("-1"): może to być podłoga i nie int , ale to nie jest właściwa droga, jeśli chcesz być pewien, że jest liczbą całkowitą
  • Number("-1"): może chcesz obiektu, dzięki czemu można wywołać metody bez promocji i chcesz mieć pewność, że nie ma śmieci (Number('3 flowers') ==>NaN)
  • , ~~"-1" i inne kombinacje niejawnej konwersji i operacji binarnej: lubisz kod golfa i nie chcesz, aby twój kod był łatwy w utrzymaniu (dla tych, którzy zastanawiają się: operacja binarna przyjmuje całkowitą część liczby). Jak zauważył Blender w komentarzu, rozwiązania te nie są odpowiednie dla dużych liczb (dodatnich lub ujemnych).

Nie powinieneś używać innego rozwiązania niż parseInt(str,10), jeśli nie potrzebujesz, aby ciąg zawierał tylko int. To najszybsze rozwiązanie i, co ważniejsze, najbardziej czytelne. Jeśli silnik JS przeprowadza pewne optymalizacje, nie ma powodu, aby inne rozwiązania były szybsze niż ten.

+6

Również '' n '| 0' i '~~" n "' nie działają dla wszystkich liczb większych niż '2^31 - 1' (i myślę, że są mniejsze niż' -2^31 - 1'. – Blender

2

Co z unarnym plusem? Wygląda jak specjalnie zaprojektowany do typowania konwersji.

+"-1" // -1 
Powiązane problemy