Apa perbedaan antara baris ini:
var a = parseInt("1", 10); // a === 1
dan baris ini
var a = +"1"; // a === 1
Tes jsperf ini menunjukkan bahwa operator unary jauh lebih cepat dalam versi chrome saat ini, dengan asumsi itu untuk node.js !?
Jika saya mencoba mengonversi string yang bukan angka, keduanya kembali NaN
:
var b = parseInt("test" 10); // b === NaN
var b = +"test"; // b === NaN
Jadi kapan saya lebih suka menggunakan parseInt
lebih dari unary plus (terutama di node.js) ???
edit : dan apa bedanya dengan operator double tilde ~~
?
javascript
node.js
di sini dan sekarang78
sumber
sumber
Jawaban:
Silakan lihat jawaban ini untuk satu set kasus yang lebih lengkap
Nah, inilah beberapa perbedaan yang saya ketahui:
String kosong
""
mengevaluasi ke0
, sedangkanparseInt
mengevaluasinya keNaN
. IMO, string kosong harus aNaN
.Unary
+
bertindak lebih sepertiparseFloat
karena ia juga menerima desimal.parseInt
di sisi lain berhenti parsing ketika melihat karakter non-numerik, seperti periode yang dimaksudkan sebagai titik desimal.
.parseInt
danparseFloat
mem - parsing dan membuat string dari kiri ke kanan . Jika mereka melihat karakter yang tidak valid, itu mengembalikan apa yang telah diuraikan (jika ada) sebagai angka, danNaN
jika tidak ada yang diuraikan sebagai angka.Unary
+
di sisi lain akan kembaliNaN
jika seluruh string tidak dapat dikonversi menjadi angka.Seperti yang terlihat di komentar @Alex K. ,
parseInt
danparseFloat
akan diuraikan berdasarkan karakter. Ini berarti notasi heks dan eksponen akan gagal karenax
dane
diperlakukan sebagai komponen non-numerik (setidaknya pada basis10).Unary
+
akan mengubahnya dengan benar.sumber
+"0xf" != parseInt("0xf", 10)
Math.floor()
, yang pada dasarnya memotong bagian desimal."2e3"
bukan representasi integer yang valid untuk2000
. Ini adalah angka floating point yang valid:parseFloat("2e3")
akan dengan benar menghasilkan2000
sebagai jawabannya. Dan"0xf"
membutuhkan setidaknya basis 16, itulah sebabnyaparseInt("0xf", 10)
pengembalian0
, sedangkanparseInt("0xf", 16)
mengembalikan nilai 15 yang Anda harapkan.Math.floor(-3.5) == -4
dan~~-3.5 == -3
.Tabel konversi berapapun jumlah pamungkas:
Tampilkan cuplikan kode
sumber
"NaN"
ke tabel ini.isNaN
kolom untuk tabel ini: misalnya,isNaN("")
adalah palsu (yaitu itu dianggap nomor), tapiparseFloat("")
adalahNaN
, yang bisa menjadi gotcha, jika Anda mencoba untuk menggunakanisNaN
untuk memvalidasi input sebelum diteruskan keparseFloat
'{valueOf: function(){return 42}, toString: function(){return "56"}}'
ke daftar. Hasil campuran menarik.+
itu hanya cara penulisan yang lebih pendekNumber
, dan yang lebih kasar hanyalah cara gila untuk melakukannya yang gagal pada kasus tepi?Tabel dalam jawaban thg435 yang saya yakini komprehensif, namun kita dapat merangkum dengan pola-pola berikut:
true
ke 1, tetapi"true"
keNaN
.parseInt
lebih liberal untuk string yang bukan digit murni.parseInt('123abc') === 123
, sedangkan+
laporanNaN
.Number
akan menerima angka desimal yang valid, sedangkanparseInt
hanya menjatuhkan semua yang melewati desimal. Dengan demikianparseInt
meniru perilaku C, tetapi mungkin tidak ideal untuk mengevaluasi input pengguna.parseInt
, sebagai pengurai yang dirancang dengan buruk , menerima input oktal dan heksadesimal. Unary plus hanya membutuhkan hexademical.Nilai-nilai palsu dikonversi untuk
Number
mengikuti apa yang masuk akal dalam C:null
danfalse
keduanya nol.""
pergi ke 0 tidak cukup mengikuti konvensi ini tetapi cukup masuk akal bagi saya.Karena itu saya pikir jika Anda memvalidasi input pengguna, unary plus memiliki perilaku yang benar untuk semuanya kecuali menerima desimal (tetapi dalam kasus kehidupan nyata saya, saya lebih tertarik untuk menangkap input email daripada userId, nilai dihilangkan seluruhnya, dll.), Sedangkan parseInt terlalu liberal.
sumber
Hati-hati, parseInt lebih cepat dari + operator unary di Node.JS, salah bahwa + atau | 0 lebih cepat, mereka lebih cepat hanya untuk elemen NaN.
Lihat ini:
sumber
Pertimbangkan kinerja juga. Saya terkejut bahwa
parseInt
mengalahkan unary plus di iOS :) Ini membantu untuk aplikasi web dengan konsumsi CPU saja. Sebagai aturan umum saya menyarankan JS opt-guys untuk mempertimbangkan operator JS lebih dari operator lain dari sudut pandang kinerja mobile saat ini.Jadi, go mobile-first ;)
sumber