Dowolna liczba, to liczba. Ciąg wygląda jak liczba, to liczba. Wszystko inne idzie na NaN.
'a' => NaN
'1' => 1
1 => 1
javascript
beatak
źródło
źródło
'1a'
sznurkiem? Z' 1'
jednym? Innymi słowy, dlaczego najpopularniejsze metody, aby to zrobić (Number(x)
iparseInt(x, 10)
) nie są dla Ciebie wystarczające?Odpowiedzi:
O ile wiem, są na to 4 sposoby.
Ten szybki test, który zrobiłem, w rzeczywistości zależy od przeglądarek.
http://jsperf.com/best-of-string-to-number-conversion/2
Implicit
oznaczony najszybciej w 3 przeglądarkach, ale sprawia, że kod jest trudny do odczytania… Wybierz więc, co chcesz!źródło
1*
do konwersji daty na numer, która jest podobna do+
powyższej. tj.1*new Date()
zamiast+new Date()
. Być może jest bardziej czytelny?1*
jest preferowany, ponieważ jest mniej podatny na błędy. Niepożądana zmienna wisząca wcześniej+1
nie jest błędem analizy. To sztuczka podobna do używaniaif (MYCONSTANT == myvar)
wC
.Można to zrobić na co najmniej 5 sposobów:
Jeśli chcesz konwertować tylko na liczby całkowite, innym szybkim (i krótkim) sposobem jest użycie dwóch bitów nie (tj. Użycie dwóch znaków tyldy):
na przykład
~~x;
Źródła : http://james.padolsey.com/cool-stuff/double-bitwise-not/
Pięć znanych dotychczas sposobów konwertowania ciągu znaków na liczbę ma swoje różnice (istnieje więcej działających operatorów bitowych, ale wszystkie dają ten sam wynik co
~~
). Ten JSFiddle pokazuje różne wyniki, których można oczekiwać w konsoli debugowania: http://jsfiddle.net/TrueBlueAussie/j7x0q0e3/22/Konsola debugowania:
Te
~~x
wyniki wersja numeru w „więcej” przypadkach, gdy inni często skutkująundefined
, ale to nie z powodu nieprawidłowych wejścia (np powróci0
, jeśli ciąg zawiera znaki spoza numerycznych po ważnego numeru).Przelewowy
Uwaga: przepełnienie liczby całkowitej i / lub obcięcie bitów może wystąpić w
~~
przypadku innych konwersji, ale nie. Chociaż wprowadzanie tak dużych wartości jest niezwykłe, musisz być tego świadomy. Przykład zaktualizowany w celu uwzględnienia znacznie większych wartości.Niektóre testy wydajności wskazują, że standard
parseInt
iparseFloat
funkcje są w rzeczywistości najszybszymi opcjami, prawdopodobnie wysoce zoptymalizowanymi przez przeglądarki, ale wszystko zależy od Twoich wymagań, ponieważ wszystkie opcje są wystarczająco szybkie : http://jsperf.com/best-of-string-to -konwersja liczby / 37Wszystko zależy od konfiguracji testów perf, ponieważ niektóre z nich pokazują, że parseInt / parseFloat jest znacznie wolniejsze.
Moja teoria brzmi:
źródło
~~4294967296
Zwraca0
.Poprzedź ciąg z
+
operatorem.źródło
Szybkim sposobem na przekonwertowanie ciągów znaków na liczbę całkowitą jest użycie bitów lub tak:
Chociaż zależy to od tego, w jaki sposób zostanie wdrożony, w teorii powinien być stosunkowo szybki (przynajmniej tak szybki, jak
+x
), ponieważ najpierw będzie rzutowałx
na liczbę, a następnie wykona bardzo wydajne lub.źródło
Oto prosty sposób na zrobienie tego: var num = Number (str); w tym przykładzie str jest zmienną zawierającą ciąg. Możesz przetestować i zobaczyć, jak to działa, otwórz: narzędzia programistyczne Google chrome , a następnie przejdź do konsoli i wklej następujący kod. przeczytaj komentarze, aby lepiej zrozumieć, jak przebiega konwersja.
źródło
Uważam, że
num * 1
jest to proste, przejrzyste i działa dla liczb całkowitych i zmiennoprzecinkowych ...źródło
Prawdopodobnie nie jest to tak szybkie, ale ma dodatkową zaletę polegającą na upewnieniu się, że numer ma co najmniej określoną wartość (np. 0) lub co najwyżej określoną wartość:
Jeśli chcesz zapewnić minimalną wartość, zwykle to robisz
Math.max(..., 0)
oszczędza ci pisania dwóch stwierdzeń.źródło
Math.abs(input)
? Konwertuje również łańcuchy na liczby dodatnie i zapisuje kilka dodatkowych znaków.input
nie można przekonwertować na numer, otrzymaszNaN
Możesz spróbować użyć UnitOf , biblioteki pomiarów i konwersji typów danych, którą właśnie oficjalnie wydaliśmy! UnitOf jest super szybki, mały i skuteczny w konwersji dowolnego typu danych bez zgłaszania błędu lub wartości null / undefined. Zdefiniowane wartości domyślne lub wartości domyślne UnitOf są zwracane, gdy konwersja zakończy się niepowodzeniem.
źródło
Najszybszym sposobem jest użycie -0:
źródło