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/ 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.
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') === InfinitysedangkanparseInt('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". 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
NaN != NaNmeskipun
NaN != NaNmenilai 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;
+xmengembalikan 0tidak hanya untuk string kosong tetapi juga untuk string whitespace-only. Contoh: +" ", +"\t\t\t", +"\n\n"- semua dari mereka memberikan 0sebagai 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 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;
parseFloat()masih menjadi pemenang.