Saya memiliki variabel yang menyimpan false
atau true
, tetapi masing-masing saya butuh 0
atau 1
sebagai gantinya. Bagaimana saya bisa melakukan ini?
276
Saya memiliki variabel yang menyimpan false
atau true
, tetapi masing-masing saya butuh 0
atau 1
sebagai gantinya. Bagaimana saya bisa melakukan ini?
bool === true ? 1 : 0
, karena sejauh ini yang tercepat di V8.bool ? 1 : 0;
Jawaban:
Javascript memiliki operator ternary yang dapat Anda gunakan:
sumber
NaN
. Jadi, jika Anda menginginkan L33T dan menjamin input, pilihlah urary, jika tidak, lakukan tes terner + truthy yang terbaik.Gunakan operator unary
+
, yang mengubah operan menjadi angka.Perhatikan, tentu saja, bahwa Anda masih harus membersihkan data di sisi server, karena pengguna dapat mengirim data apa pun ke server Anda, tidak peduli apa kata kode sisi klien.
sumber
Number()
bahkan lebih lambat.bool === true ? 1 : 0
adalah yang tercepat, dengan sedetik dekat daribool | 0
.Imho solusi terbaik adalah:
Ini digunakan dalam asm.js untuk memaksa tipe integer.
sumber
1
integer kan jika fooBar tidak?Saya lebih suka menggunakan fungsi Angka . Dibutuhkan objek dan mengubahnya menjadi angka.
Contoh:
Anda dapat mengujinya di jsFiddle .
sumber
Saya membuat perbandingan JSperf dari semua jawaban yang disarankan.
TL; DR - opsi terbaik untuk semua browser saat ini adalah:
.
Memperbarui:
Sepertinya hari-hari ini mereka semua sangat identik, kecuali bahwa
Number()
fungsinya paling lambat, sedangkan yang terbaikval === true ? 1 : 0;
.sumber
Cara yang diketik untuk melakukan ini adalah:
sumber
Saya baru saja menemukan jalan pintas ini hari ini.
~~ (benar)
~~ (salah)
Orang yang jauh lebih pintar daripada yang bisa saya jelaskan:
http://james.padolsey.com/javascript/double-bitwise-not/
sumber
Ketika JavaScript mengharapkan nilai angka tetapi menerima boolean sebagai gantinya itu mengubah boolean itu menjadi angka: true dan false dikonversi menjadi masing-masing 1 dan 0. Jadi Anda bisa memanfaatkan ini;
Bacaan lebih lanjut Jenis Konversi Bab 3.8 dari Definitive Guide to Javascript.
sumber
+
Operator unary akan menangani hal ini:Anda tentu saja ingin memeriksa kewarasan di server sebelum menyimpannya, jadi itu mungkin tempat yang lebih masuk akal untuk melakukan ini.
sumber
===
, karenatrue == 1
benar bahkan tanpa Anda "konversi eksplisit :-)true === 1
sebaliknya itu salah.Saya hanya berurusan dengan masalah ini dalam beberapa kode yang saya tulis. Solusi saya adalah menggunakan bitwise dan.
Cara yang lebih cepat untuk menangani masalah yang konstan adalah dengan membuat fungsi. Ini lebih mudah dibaca oleh orang lain, lebih baik untuk memahami pada tahap pemeliharaan, dan menghilangkan potensi untuk menulis sesuatu yang salah.
Sunting - 10 September 2014
Tidak ada konversi yang menggunakan operator ternary yang identik dengan operator lebih cepat di Chrome karena alasan tertentu. Tidak masuk akal mengapa itu lebih cepat, tapi saya kira itu semacam optimasi tingkat rendah yang masuk akal di suatu tempat di sepanjang jalan.
Uji sendiri: http://jsperf.com/boolean-int-conversion/2
Di FireFox dan Internet Explorer, menggunakan versi yang saya posting umumnya lebih cepat.
Sunting - 14 Juli 2017
Oke, saya tidak akan memberi tahu Anda mana yang harus atau tidak harus Anda gunakan. Setiap browser yang aneh telah naik turun dalam seberapa cepat mereka dapat melakukan operasi dengan masing-masing metode. Chrome pada satu titik sebenarnya memiliki versi bitwise & melakukan lebih baik daripada yang lain, tapi kemudian tiba-tiba jauh lebih buruk. Saya tidak tahu apa yang mereka lakukan, jadi saya akan menyerahkannya pada siapa yang peduli. Jarang ada alasan untuk peduli tentang seberapa cepat operasi seperti ini dilakukan. Bahkan di ponsel, ini bukan operasi apa-apa.
Juga, inilah metode yang lebih baru untuk menambahkan prototipe 'toInt' yang tidak dapat ditimpa.
sumber
Anda juga dapat menambahkan 0, menggunakan operator shift atau xor:
Ini memiliki kecepatan yang sama dengan yang dari jawaban yang lain.
sumber
Dalam konteks saya, Bereaksi Asli di mana saya mendapatkan nilai opacity dari boolean, cara termudah: Gunakan operator unary +.
Ini mengubah boolean menjadi angka;
sumber
Anda bisa melakukan ini dengan hanya memperpanjang prototipe boolean
Tidak terlalu mudah untuk memahami apa yang terjadi di sana sehingga versi alternatifnya
setelah melakukan yang dapat Anda lakukan hal-hal seperti
Ketika saya menggunakan booleans untuk menyimpan kondisi, saya sering mengonversinya ke bitfields dalam hal ini saya akhirnya menggunakan versi lanjutan dari fungsi prototipe
yang dapat Anda lakukan
yang menghasilkan 4 sebagai outputnya.
sumber
sumber
mencoba
Tampilkan cuplikan kode
sumber
Saya telah menguji semua contoh ini, saya melakukan benchmark, dan akhirnya saya sarankan Anda memilih yang lebih pendek, itu tidak mempengaruhi kinerja.
Hasil
sumber
jika Anda ingin integer x perubahan nilai jika 1 ke 0 dan jika 0 ke 1 Anda dapat menggunakan (x + 1)% 2
sumber