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/
var values = ["123",
undefined,
"not a number",
"123.45",
"1234 error",
"2147483648",
"4999999999"
];
for (var i = 0; i < values.length; i++){
var x = values[i];
console.log(x);
console.log(" Number(x) = " + Number(x));
console.log(" parseInt(x, 10) = " + parseInt(x, 10));
console.log(" parseFloat(x) = " + parseFloat(x));
console.log(" +x = " + +x);
console.log(" ~~x = " + ~~x);
}
Konsola debugowania:
123
Number(x) = 123
parseInt(x, 10) = 123
parseFloat(x) = 123
+x = 123
~~x = 123
undefined
Number(x) = NaN
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = NaN
~~x = 0
null
Number(x) = 0
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = 0
~~x = 0
"not a number"
Number(x) = NaN
parseInt(x, 10) = NaN
parseFloat(x) = NaN
+x = NaN
~~x = 0
123.45
Number(x) = 123.45
parseInt(x, 10) = 123
parseFloat(x) = 123.45
+x = 123.45
~~x = 123
1234 error
Number(x) = NaN
parseInt(x, 10) = 1234
parseFloat(x) = 1234
+x = NaN
~~x = 0
2147483648
Number(x) = 2147483648
parseInt(x, 10) = 2147483648
parseFloat(x) = 2147483648
+x = 2147483648
~~x = -2147483648
4999999999
Number(x) = 4999999999
parseInt(x, 10) = 4999999999
parseFloat(x) = 4999999999
+x = 4999999999
~~x = 705032703
Te ~~xwyniki wersja numeru w „więcej” przypadkach, gdy inni często skutkują undefined, ale to nie z powodu nieprawidłowych wejścia (np powróci 0, 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 parseInti parseFloatfunkcje 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 / 37
Wszystko zależy od konfiguracji testów perf, ponieważ niektóre z nich pokazują, że parseInt / parseFloat jest znacznie wolniejsze.
Moja teoria brzmi:
- Kłamstwa
- Cholerne linie
- Statystyka
- Wyniki JSPerf :)