Mana yang lebih baik?
Saya meminta ini hanya demi mencukur beberapa byte, karena saya dapat menggunakan + x sebagai ganti angka (x). Apakah parsefloat melakukan sesuatu yang lebih baik?
javascript
optimization
Namanyay Goel
sumber
sumber
Jawaban:
Perbedaan antara parseFloat dan Number
parseFloat
/parseInt
adalah untuk parsing string, sedangkanNumber
/+
adalah untuk memaksa nilai ke angka. Mereka berperilaku berbeda. Tapi pertama-tama mari kita lihat di mana mereka berperilaku sama:Jadi selama Anda memiliki input numerik standar, tidak ada perbedaan. Namun, jika input Anda dimulai dengan angka dan kemudian berisi karakter lain,
parseFloat
potong nomor keluar dari string, sambilNumber
memberiNaN
(bukan angka):Selain itu,
Number
pahami input heksadesimal sementaraparseFloat
tidak:Tetapi
Number
bertingkah aneh dengan string kosong atau string yang hanya berisi ruang putih:Secara keseluruhan, saya merasa
Number
lebih masuk akal, jadi saya hampir selalu menggunakanNumber
secara pribadi (dan Anda akan menemukan bahwa banyak fungsi JavaScript internal juga digunakanNumber
). Jika seseorang mengetik'1x'
saya lebih suka menampilkan kesalahan daripada memperlakukannya seolah-olah mereka telah mengetik'1'
. Satu-satunya waktu saya benar-benar membuat pengecualian adalah ketika saya mengubah gaya ke angka, dalam halparseFloat
ini membantu karena gaya datang dalam bentuk seperti'3px'
, dalam hal ini saya ingin menjatuhkan'px'
bagian dan hanya mendapatkan3
, jadi saya menemukanparseFloat
bermanfaat sini. Tetapi yang benar-benar yang Anda pilih terserah Anda dan bentuk input mana yang ingin Anda terima.Perhatikan bahwa menggunakan
+
operator unary persis sama dengan menggunakanNumber
sebagai fungsi:Jadi saya biasanya hanya menggunakan
+
singkat. Selama Anda tahu apa fungsinya, saya merasa mudah dibaca.sumber
Number()
sebagai "aneh" Saya bahkan akan menganggapnya sebagai lebih diharapkan, whitespace adalah nilai kosong tetapi tidak null / tidak terdefinisi => 0 adalah hasil yang bagus. Besar (+) untuk Anda untuk showcase :)Number('Infinity') === Infinity
sedangkanparseInt('Infinity') === NaN
+
(plus unary) untuk ini, karena jika Anda lupa titik koma di baris sebelumnya, ekspresi tambahan mungkin dievaluasi sebagai gantinya.Perbedaannya adalah apa yang terjadi ketika input bukan "angka yang tepat".
Number
kembaliNaN
sementaraparseFloat
mem-parsing "sebanyak mungkin". Jika dipanggil, string kosong akanNumber
kembali0
sementara parseFloat kembaliNaN
.Sebagai contoh:
sumber
NaN != NaN
meskipunNaN != NaN
menilai BENAR - terima kasih atas tipnya!isNaN(NaN)
returntrue
Dalam contoh-contoh ini Anda dapat melihat perbedaannya:
parseFloat sedikit lebih lambat karena mencari penampilan pertama dari suatu angka dalam sebuah string, sedangkan konstuktor Number menciptakan instance angka baru dari string yang berisi nilai numerik dengan spasi putih atau yang berisi nilai-nilai palsu.
PS Jika Anda tertarik pada beberapa solusi konversi tipe universal, Anda dapat membaca posting tentang konversi tipe di blog saya: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html
sumber
Untuk string kosong, mereka berbeda.
+""
danNumber("")
mengembalikan 0, sementaraparseFloat("")
mengembalikan NaN.sumber
parseFloat()
memiliki hasil yang tepat sebagai string kosong BUKAN nomor0
(baca: NaN) sementara string dengan karakter"0"
di dalamnya IS0
;+x
mengembalikan0
tidak hanya untuk string kosong tetapi juga untuk string whitespace-only. Contoh:+" "
,+"\t\t\t"
,+"\n\n"
- semua dari mereka memberikan0
sebagai hasilnyaSejauh yang saya tahu, dan ini hanya terdengar dari rekan-rekan jadi mungkin benar-benar kurang informasi, bahwa parseFloat sedikit lebih cepat.
Meskipun pada penelitian lebih lanjut, tampaknya perbedaan kinerja ini tergantung pada browser.
http://jsperf.com/parseint-vs-parsefloat/6
Lihatlah hasil jsPerf ini, dan teleponlah Anda. (ini termasuk tes + x juga)
Seperti dicatat dalam jawaban @xdazz,
+""
danNumber("")
kembali0
sambilparseFloat("")
kembaliNaN
jadi Sekali lagi saya akan pergi dengan parseFloat, karena string kosong TIDAK berarti angka 0, hanya string dengan karakter"0"
di dalamnya berarti 0;sumber
parseFloat()
masih menjadi pemenang.