Jak parseInt()
i Number()
zachowują się inaczej przy konwersji ciągów na liczby?
źródło
Jak parseInt()
i Number()
zachowują się inaczej przy konwersji ciągów na liczby?
Dobrze, że są semantycznie różni The Number
konstruktor nazywa się funkcją wykonuje rodzaj konwersji i parseInt
wykonuje parsowania , na przykład:
// parsing:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseInt("2e1"); // 2
// type conversion
Number("20px"); // NaN
Number("2e1"); // 20, exponential notation
Należy pamiętać, że jeśli parseInt
wykryje wiodące zero w ciągu, parsuje liczbę w bazie ósemkowej, zmieniło się to w ECMAScript 5, nowej wersji standardu, ale zajmie to dużo czasu, aby wejść w implementacje przeglądarki (jest to niezgodność z ECMAScript 3), również parseInt
zignoruje końcowe znaki, które nie odpowiadają żadnej cyfrze aktualnie używanej bazy.
Number
Konstruktor nie wykrywa octals:
Number("010"); // 10
parseInt("010"); // 8, implicit octal
parseInt("010", 10); // 10, decimal radix used
Ale może obsługiwać liczby w notacji szesnastkowej, podobnie jak parseInt
:
Number("0xF"); // 15
parseInt("0xF"); //15
Ponadto powszechnie stosowanym konstruktem do przeprowadzania konwersji typu numerycznego jest Unary +
Operator (s. 72) , co jest równoważne z użyciem Number
konstruktora jako funkcji:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
Number()
zajmuje się ósemkami podobnymi do heksadecymalnych i dwójkowych:Number('0o10') == 8
pierwsze dwa zapewniają lepszą wydajność, ponieważ zwraca element prymitywny zamiast obiektu.
źródło
new Number()
jest inny niżNumber()
.typeof Number("123") => number
new Number("1") != new Number("1")
. NIGDY NIE UŻYWAJnew Number
. Nigdy, nigdy, nigdy.Number("1")
z drugiej strony jest całkowicie rozsądny.let x = new Number("2"); let y = new Number("2");
a następnie sprawdzam równość z jakiegokolwiek powodu,if (x == y) { doSomething(); }
logiczniedoSomething
należy ją wywołać. Ale nie będzie. Również jeśli było analizować tylko jeden numerlet x = new Number("2");
wtedyx === 2
byłoby fałszywe. To jest wyraźny powód, dla którego nie powinieneś używaćnew Number
Jeśli szukasz wydajności, to prawdopodobnie najlepsze wyniki uzyskasz z przesunięciem bitowym w prawo
"10">>0
. Również pomnóż ("10" * 1
) lub nie (~~"10"
). Wszystkie z nich są znacznie szybszeNumber
iparseInt
. Mają nawet „funkcję” zwracającą 0 dla argumentu braku liczby. Oto testy wydajności .źródło
Number
iparseInt
wciąż wolniejsze o 99% niż reszta. Dodatkowo są dla mnie mniej atrakcyjne wizualnie :-)parseInt
lubNumber
są bardziej preferowane. Jeśli programujesz emulator N64 z milionami konwersji na sekundę, możesz rozważyć te sztuczki.(2**31).toString() >> 0
przepełni się do-2147483648
. Możesz użyć>>>
zamiast tego,>>
aby JavaScript traktował operand jako 32-bitową liczbę całkowitą bez znaku , ale wtedy dowolne liczby większe niż2**32 - 1
również się przepełniły.Znalazłem dwa linki z wyników porównać spośród kilku sposobów przekształcania
string
sięint
.http://jsben.ch/#/zGJHM
http://phrogz.net/js/string_to_number.html
źródło
Jedną z różnic jest to, co oni moll konwertować z
undefined
lubnull
,podczas
źródło
Podsumowanie:
parseInt()
:NaN
zostanie zwrócony.parseInt()
funkcja napotka wartość nienumeryczną, odetnie resztę ciągu wejściowego i parsuje tylko część, aż do wartości nienumerycznej.undefined
0, JS przyjmie następujące założenia:ES5
określa, że należy użyć 10. Nie jest to jednak obsługiwane przez wszystkie przeglądarki, dlatego zawsze określaj podstawę, jeśli liczby mogą zaczynać się od 0.Number()
:Number()
Konstruktor można zamienić dowolny wejście na szereg argumentów. JeśliNumber()
konstruktor nie może przekonwertować danych wejściowych na liczbę,NaN
zostaną zwrócone.Number()
Konstruktor może również obsługiwać liczbę szesnastkową, muszą zacząć0x
.Przykład:
źródło
Zawsze używam parseInt, ale uważaj na wiodące zera, które zmuszą go do przejścia w tryb ósemkowy .
źródło
parseInt(value, radix)
ten sposób, aby nie było przypadkowych konwersji w trybie ósemkowym itp.0
, nawet w trybie non-ścisłym. Ale zostało to naprawione, a teraz wiodące zera są po prostu ignorowane, więc takparseInt("070")
się stanie70
.parseInt()
.parseInt()
-> Analizuje liczbę na określony redix.Number()
-> Konwertuje podaną wartość na jej numeryczny odpowiednik lub NaN, jeśli tego nie zrobi.Dlatego do konwersji niektórych wartości nienumerycznych na liczby zawsze należy używać funkcji Number ().
na przykład.
Istnieją różne przypadki narożne
parseInt()
funkcji, ponieważ wykonuje konwersję remixu, dlatego powinniśmy unikać używania funkcji parseInt () do celów kooperacji.Teraz, aby sprawdzić pogodę, podana wartość jest liczbą lub nie, powinniśmy użyć
isNaN()
funkcji natywnejźródło
parseInt konwertuje na liczbę całkowitą, co oznacza, że usuwa liczby dziesiętne. Liczba nie jest konwertowana na liczbę całkowitą.
źródło
Warto trzymać się z dala od parsowania i używać Number i Math.round, chyba że potrzebujesz hex lub ósemki. Oba mogą używać ciągów. Po co trzymać się z daleka?
Całkowicie rzeźniczy naprawdę duże lub naprawdę małe liczby. Dziwne, że działa normalnie, jeśli te dane wejściowe są ciągiem.
Zamiast ryzykować, że nie uda mi się znaleźć błędów w tym i innych wymienionych problemach, po prostu uniknę parsowania, chyba że trzeba będzie parsować coś innego niż baza 10. Liczba, Math.round, Math.foor i .toFixed (0) mogą wszystko zrób te same rzeczy, z których można korzystać bez analizy tego typu błędów.
Jeśli naprawdę chcesz lub potrzebujesz użyć parsowania dla niektórych jego innych właściwości, nigdy nie używaj go do konwersji liczb zmiennoprzecinkowych na ints.
źródło