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?
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?
Jawaban:
parseFloat
/ parseInt
adalah untuk parsing string, sedangkan Number
/ +
adalah untuk memaksa nilai ke angka. Mereka berperilaku berbeda. Tapi pertama-tama mari kita lihat di mana mereka berperilaku sama:
parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000
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, sambil Number
memberi NaN
(bukan angka):
parseFloat('1x'); // => 1
Number('1x'); // => NaN
Selain itu, Number
pahami input heksadesimal sementara parseFloat
tidak:
parseFloat('0x10'); // => 0
Number('0x10'); // => 16
Tetapi Number
bertingkah aneh dengan string kosong atau string yang hanya berisi ruang putih:
parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0
Secara keseluruhan, saya merasa Number
lebih masuk akal, jadi saya hampir selalu menggunakan Number
secara pribadi (dan Anda akan menemukan bahwa banyak fungsi JavaScript internal juga digunakan Number
). 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 hal parseFloat
ini membantu karena gaya datang dalam bentuk seperti '3px'
, dalam hal ini saya ingin menjatuhkan 'px'
bagian dan hanya mendapatkan 3
, jadi saya menemukan parseFloat
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 menggunakan Number
sebagai fungsi:
Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40
Jadi saya biasanya hanya menggunakan +
singkat. Selama Anda tahu apa fungsinya, saya merasa mudah dibaca.
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
kembali NaN
sementara parseFloat
mem-parsing "sebanyak mungkin". Jika dipanggil, string kosong akan Number
kembali 0
sementara parseFloat kembali NaN
.
Sebagai contoh:
Number("") === 0 // also holds for false
isNaN(parseFloat("")) === true // and null
isNaN(Number("32f")) === true
parseFloat("32f") === 32
NaN != NaN
meskipun
NaN != NaN
menilai BENAR - terima kasih atas tipnya!
isNaN(NaN)
returntrue
Dalam contoh-contoh ini Anda dapat melihat perbedaannya:
Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;
parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;
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
Untuk string kosong, mereka berbeda.
+""
dan Number("")
mengembalikan 0, sementara parseFloat("")
mengembalikan NaN.
parseFloat()
memiliki hasil yang tepat sebagai string kosong BUKAN nomor 0
(baca: NaN) sementara string dengan karakter "0"
di dalamnya IS 0
;
+x
mengembalikan 0
tidak hanya untuk string kosong tetapi juga untuk string whitespace-only. Contoh: +" "
, +"\t\t\t"
, +"\n\n"
- semua dari mereka memberikan 0
sebagai hasilnya
Sejauh 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, +""
dan Number("")
kembali 0
sambil parseFloat("")
kembali NaN
jadi Sekali lagi saya akan pergi dengan parseFloat, karena string kosong TIDAK berarti angka 0, hanya string dengan karakter "0"
di dalamnya berarti 0;
parseFloat()
masih menjadi pemenang.