Bagaimana parseInt()
dan Number()
berperilaku berbeda ketika mengubah string menjadi angka?
sumber
Bagaimana parseInt()
dan Number()
berperilaku berbeda ketika mengubah string menjadi angka?
Yah, mereka secara semantik berbeda , Number
konstruktor yang disebut sebagai fungsi melakukan konversi jenis dan parseInt
melakukan penguraian , misalnya:
// parsing:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseInt("2e1"); // 2
// type conversion
Number("20px"); // NaN
Number("2e1"); // 20, exponential notation
Perlu diingat bahwa jika parseInt
mendeteksi nol terdepan pada string, itu akan menguraikan angka dalam basis oktal, ini telah berubah pada ECMAScript 5, versi baru standar, tetapi akan membutuhkan waktu lama untuk mendapatkan implementasi browser (itu ketidakcocokan dengan ECMAScript 3), juga parseInt
akan mengabaikan karakter tambahan yang tidak sesuai dengan angka apa pun dari basis yang saat ini digunakan.
The Number
konstruktor tidak mendeteksi octals:
Number("010"); // 10
parseInt("010"); // 8, implicit octal
parseInt("010", 10); // 10, decimal radix used
Tetapi dapat menangani angka dalam notasi heksadesimal, seperti parseInt
:
Number("0xF"); // 15
parseInt("0xF"); //15
Selain itu, konstruk yang banyak digunakan untuk melakukan konversi tipe Numeric, adalah Unary +
Operator (p. 72) , itu setara dengan menggunakan Number
konstruktor sebagai fungsi:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
Number()
tidak berurusan dengan oktal seperti hex dan binary:Number('0o10') == 8
Dua yang pertama akan memberi Anda kinerja yang lebih baik karena mengembalikan primitif daripada objek.
sumber
new Number()
berbeda denganNumber()
.typeof Number("123") => number
new Number("1") != new Number("1")
. TIDAK PERNAH MENGGUNAKANnew Number
. Tidak pernah tidak pernah tidak pernah.Number("1")
, di sisi lain, sangat masuk akal.let x = new Number("2"); let y = new Number("2");
dan kemudian melakukan pemeriksaan kesetaraan untuk alasan apa pun,if (x == y) { doSomething(); }
secara logisdoSomething
harus dipanggil. Tapi itu tidak akan terjadi. Juga jika Anda hanya mengurai satu angkalet x = new Number("2");
makax === 2
akan salah. Itulah alasan yang jelas mengapa Anda tidak boleh menggunakannew Number
Jika Anda mencari kinerja maka hasil terbaik mungkin Anda dapatkan dengan bitwise shift kanan
"10">>0
. Juga gandakan ("10" * 1
) atau tidak (~~"10"
). Semuanya jauh lebih cepatNumber
danparseInt
. Mereka bahkan memiliki "fitur" mengembalikan 0 untuk bukan nomor argumen. Berikut adalah tes Kinerja .sumber
Number
danparseInt
masih lebih lambat 99% dari yang lain. Plus bagi saya mereka juga kurang menarik secara visual :-)parseInt
atauNumber
lebih disukai. Jika Anda memprogram emulator N64 dengan jutaan konversi per detik, Anda dapat mempertimbangkan trik-trik itu.(2**31).toString() >> 0
akan meluap ke-2147483648
. Anda dapat menggunakan>>>
alih-alih>>
membuat JavaScript memperlakukan operan sebagai bilangan bulat 32-bit yang tidak ditandatangani , tetapi angka apa pun yang lebih besar dari jumlah2**32 - 1
tersebut juga akan meluap.Saya menemukan dua link kinerja membandingkan antara beberapa cara untuk mengkonversi
string
keint
.http://jsben.ch/#/zGJHM
http://phrogz.net/js/string_to_number.html
sumber
Satu perbedaan kecil adalah apa yang mereka konversi
undefined
ataunull
,sementara
sumber
Ringkasan:
parseInt()
:NaN
akan dikembalikan.parseInt()
fungsi menemukan nilai non numerik, itu akan memotong sisa string input dan hanya menguraikan bagian sampai nilai non numerik.undefined
atau 0, JS akan menganggap berikut:ES5
menetapkan bahwa 10 harus digunakan kemudian. Namun, ini tidak didukung oleh semua browser, oleh karena itu selalu tentukan radix jika angka Anda dapat dimulai dengan 0.Number()
:Number()
konstruktor dapat mengkonversi input argumen ke nomor. JikaNumber()
konstruktor tidak dapat mengubah input menjadi angka,NaN
akan dikembalikan.Number()
konstruktor juga dapat menangani sejumlah heksadesimal, mereka harus mulai dengan0x
.Contoh:
sumber
Saya selalu menggunakan parseInt, tetapi jangan nol terkemuka yang akan memaksa ke oktal modus.
sumber
parseInt(value, radix)
sehingga Anda tidak memiliki konversi mode oktal yang tidak disengaja , dll.0
, bahkan dalam mode non-ketat. Tapi ini sudah diperbaiki dan sekarang nol mengarah hanya diabaikan, jadiparseInt("070")
akan menjadi70
.parseInt()
.parseInt()
-> Parsing nomor ke redix yang ditentukan.Number()
-> Mengonversi nilai yang ditentukan ke angka yang setara atau NaN jika gagal melakukannya.Karenanya untuk mengonversi beberapa nilai non-numerik ke angka, kita harus selalu menggunakan fungsi Number ().
misalnya.
Ada berbagai kasus sudut
parseInt()
berfungsi seperti konversi redix, maka kita harus menghindari menggunakan fungsi parseInt () untuk tujuan koersi.Sekarang, untuk memeriksa cuaca, nilai yang diberikan adalah Numerik atau tidak, kita harus menggunakan
isNaN()
fungsi aslisumber
parseInt mengonversi ke angka integer, yaitu, mengupas desimal. Nomor tidak dikonversi ke bilangan bulat.
sumber
Ide yang bagus untuk menjauh dari parseInt dan gunakan Number dan Math.round kecuali Anda membutuhkan hex atau oktal. Keduanya bisa menggunakan string. Kenapa menjauh dari itu?
Ini benar-benar tukang daging jumlah yang sangat besar atau sangat kecil. Anehnya itu berfungsi normal jika input ini adalah string.
Alih-alih mengambil risiko sulit untuk menemukan bug dengan ini dan orang-orang lain yang disebutkan, saya hanya akan menghindari parseInt kecuali Anda perlu mengurai sesuatu selain base 10. Number, Math.round, Math.foor, dan .toFixed (0) dapat semuanya melakukan hal yang sama parseInt dapat digunakan tanpa bug jenis ini.
Jika Anda benar-benar ingin atau perlu menggunakan parseInt untuk beberapa kualitas lainnya, jangan pernah menggunakannya untuk mengonversi float ke ints.
sumber