Mana yang lebih baik, angka (x) atau parseFloat (x)?


147

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?


2
Nomor floating point presisi tunggal menempati 4 byte dalam sistem 32bit dan juga bilangan bulat. Saya tidak tahu bagaimana menangani javascript mengapung tapi saya kira itu hampir sama.
Christian

5
@Christian: Semua angka dalam Javascript adalah float presisi ganda.
Guffa

1
Saya akan memilih untuk pertanyaan ini jika bukan karena segmen EDIT
LaPuyaLoca

Jawaban:


309

Perbedaan antara parseFloat dan Number

parseFloat/ parseIntadalah 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, parseFloatpotong nomor keluar dari string, sambil Numbermemberi NaN(bukan angka):

parseFloat('1x'); // => 1
Number('1x'); // => NaN

Selain itu, Numberpahami input heksadesimal sementara parseFloattidak:

parseFloat('0x10'); // => 0
Number('0x10'); // => 16

Tetapi Numberbertingkah 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 Numberlebih masuk akal, jadi saya hampir selalu menggunakan Numbersecara 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 parseFloatini membantu karena gaya datang dalam bentuk seperti '3px', dalam hal ini saya ingin menjatuhkan 'px'bagian dan hanya mendapatkan 3, jadi saya menemukan parseFloatbermanfaat 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 Numbersebagai 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.


2
Saya tidak akan menganggap whitespace => 0 perilaku 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 :)
jave.web

4
@NathanWall: Mungkin ingin menyebutkan itu Number('Infinity') === InfinitysedangkanparseInt('Infinity') === NaN
sstur

3
Saya tidak akan menggunakan +(plus unary) untuk ini, karena jika Anda lupa titik koma di baris sebelumnya, ekspresi tambahan mungkin dievaluasi sebagai gantinya.
Jackson

1
Untuk kasus mereka berperilaku sama saya telah menemukan bahwa parseFloat adalah dari 1% menjadi 15% lebih lambat, menjadi lebih lambat ketika jumlah angka desimal dalam sebuah string meningkat. Dengan menjalankan 1M di sistem saya parseFloat ('1,501') adalah 5% lebih lambat dari Number ('1,501'), dan parseFloat ('1,50137585467') 15% lebih lambat dari Number ('1,50137585467'). Jadi, saya memilih Number ().
bytepan

1
@ ChrisBrownie55 Wow, tangkapan yang bagus. Saya tidak tahu parseFloat bisa melakukan itu. Saya kira Infinity bukan bilangan bulat!
sstur

9

Perbedaannya adalah apa yang terjadi ketika input bukan "angka yang tepat". Numberkembali NaNsementara parseFloatmem-parsing "sebanyak mungkin". Jika dipanggil, string kosong akan Numberkembali 0sementara parseFloat kembali NaN.

Sebagai contoh:

Number("") === 0               // also holds for false
isNaN(parseFloat("")) === true // and null

isNaN(Number("32f")) === true
parseFloat("32f") === 32

4
Perhatikan bahwa NaN != NaNmeskipun
Wex

@ Wo Oh, Anda yang NaN != NaNmenilai BENAR - terima kasih atas tipnya!
jave.web

4
gunakan isNaN () untuk menguji nilai NaN, isNaN(NaN)returntrue
jave.web

5

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


2

Untuk string kosong, mereka berbeda.

+""dan Number("")mengembalikan 0, sementara parseFloat("")mengembalikan NaN.


2
Saya akan melangkah lebih jauh dengan mengatakan bahwa parseFloat()memiliki hasil yang tepat sebagai string kosong BUKAN nomor 0(baca: NaN) sementara string dengan karakter "0"di dalamnya IS 0;
Christopher

+xmengembalikan 0tidak hanya untuk string kosong tetapi juga untuk string whitespace-only. Contoh: +" ", +"\t\t\t", +"\n\n"- semua dari mereka memberikan 0sebagai hasilnya
Lukasz Wiktor

2

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 0sambil parseFloat("")kembali NaNjadi Sekali lagi saya akan pergi dengan parseFloat, karena string kosong TIDAK berarti angka 0, hanya string dengan karakter "0"di dalamnya berarti 0;


Inilah tes memancing yang lebih lengkap untuk cara konversi yang lebih cepat ... parseFloat()masih menjadi pemenang.
mindplay.dk
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.