Bisakah saya mengonversi string yang mewakili nilai boolean (misalnya, 'benar', 'salah') menjadi tipe intrinsik dalam JavaScript?
Saya memiliki formulir tersembunyi dalam HTML yang diperbarui berdasarkan pilihan pengguna dalam daftar. Formulir ini berisi beberapa bidang yang mewakili nilai boolean dan secara dinamis diisi dengan nilai boolean intrinsik. Namun, begitu nilai ini ditempatkan ke bidang input tersembunyi, ia menjadi string.
Satu-satunya cara saya dapat menemukan untuk menentukan nilai boolean bidang, setelah dikonversi menjadi string, adalah bergantung pada nilai literal dari representasi stringnya.
var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
Apakah ada cara yang lebih baik untuk mencapai ini?
javascript
Kevin
sumber
sumber
string=(string==String(string?true:false))?(string?true:false):(!string?true:false);
function parseBool(val) { return val === true || val === "true" }
function checkBool(x) { if(x) {return true;} else {return false;} }
if (checkBool(x) != false) { ... } else { ... }
!!(parseInt(value) || value === "true")
Jawaban:
Melakukan:
Anda bisa membuatnya lebih ketat dengan menggunakan operator identitas (
===
), yang tidak membuat konversi tipe implisit ketika variabel yang dibandingkan memiliki tipe yang berbeda, alih-alih operator persamaan (==
).Jangan:
Anda mungkin harus berhati-hati dalam menggunakan kedua metode ini untuk kebutuhan spesifik Anda:
Setiap string yang bukan string kosong akan dievaluasi
true
dengan menggunakannya. Meskipun mereka adalah metode terbersih yang dapat saya pikirkan terkait konversi boolean, saya pikir mereka bukan yang Anda cari.sumber
myValue === 'true';
persis setara denganmyValue == 'true';
. Tidak ada manfaat menggunakan===
di==
sini.===
dan!==
kapan pun itu masuk akal, yang hampir selalu.==
vs===
adalah salah satu dari sedikit di mana saya tidak melakukannya. Saya sepenuhnya tidak setuju bahwa "hampir selalu" masuk akal untuk digunakan===
. Bahasa yang diketik secara longgar ada karena kami tidak ingin peduli dengan jenisnya; jika kita memeriksa sesuatu sepertiif (price >= 50)
kita tidak peduli apakah itu dimulai sebagai string. Saya katakan, sebagian besar waktu, kami ingin jenis disulap. Dalam kasus yang jarang terjadi di mana kita tidak ingin mengetik juggling (mis.if (price === null)
), Maka kita gunakan===
. Inilah yang telah saya lakukan selama bertahun-tahun dan saya tidak pernah mengalami masalah.Peringatan
Jawaban warisan yang sangat mutakhir ini secara teknis benar tetapi hanya mencakup skenario yang sangat spesifik, ketika nilai string Anda TEPAT
"true"
atau"false"
.String json yang tidak valid diteruskan ke fungsi-fungsi di bawah ini AKAN melemparkan pengecualian .
Jawaban asli:
Bagaimana tentang?
atau dengan jQuery
sumber
JSON.parse("TRUE".toLowerCase())
sehingga bisa diurai dengan benar.'true'.length === 4
?typeof str==="string"
&&str.length===4
&&str.charAt(0)==="t" && str.charAt(1)==="r" && str.charAt(2)==="u" && str.charAt(3)==="e"
&&true===true && true!==false && false===false
// hanya untuk memastikansumber
"true"
,"yes"
dan"1"
. 2)toLowerCase
tidak kembalinull
. 3)Boolean(string)
sama dengan distring!==""
sini. =>switch(string.toLowerCase()) {case "false": case "no": case "0": case "": return false; default: return true;}
false
saja.default: return true;
tentu saja mungkin. Tetapi itu akan mengubah perilaku fungsi.Saya pikir ini sangat universal:
if (String(a) == "true")
...Begini:
sumber
String(a).toLowerCase() === 'true'
String("what about input like this that isn't a bool?") == "true"
String()
konstruktor:true+'' === 'true' // true
Ingat untuk mencocokkan case:
Selain itu, jika kotak centang elemen elemen, Anda juga dapat mendeteksi jika kotak centang dicentang:
Dengan asumsi bahwa jika dicentang, itu "diset" sama dengan true. Ini dievaluasi sebagai benar / salah.
sumber
myValue
kebetulannull
,true
atau jenis lainnya ...Anda dapat menggunakan ekspresi reguler:
Jika Anda suka memperluas kelas String yang dapat Anda lakukan:
Bagi mereka (lihat komentar) yang ingin memperluas objek String untuk mendapatkan ini tetapi khawatir tentang enumerability dan khawatir tentang bentrok dengan kode lain yang memperluas objek String:
(Tidak akan bekerja di browser yang lebih lama tentu saja dan Firefox menunjukkan false sementara Opera, Chrome, Safari dan IE menunjukkan true. Bug 720760 )
sumber
Object.defineProperty
.parseBool
Wood-eye berhati-hatilah. Setelah melihat konsekuensi setelah menerapkan jawaban teratas dengan 500+ upvotes, saya merasa berkewajiban untuk memposting sesuatu yang sebenarnya berguna:
Mari kita mulai dengan cara terpendek, tetapi sangat ketat:
Dan akhiri dengan cara yang tepat dan lebih toleran:
Pengujian:
sumber
false
nilai booleanJSON.parse
? Dalam hal CPU, kinerja memoriSaya pikir jawaban @Steven adalah yang terbaik, dan menangani lebih banyak kasus daripada jika nilai yang masuk hanya string. Saya ingin sedikit memperluas dan menawarkan yang berikut:
Tidak perlu menutup semua
false
kasus jika Anda sudah tahu semuatrue
kasus yang harus Anda pertanggungjawabkan. Anda dapat meneruskan apa pun ke dalam metode ini yang dapat memberikantrue
nilai (atau menambahkan yang lain, itu cukup mudah), dan segala hal lainnya akan dipertimbangkanfalse
sumber
autocomplete="on"
Solusi universal dengan parse JSON:
PEMBARUAN (tanpa JSON):
Saya juga membuat biola untuk mengujinya http://jsfiddle.net/remunda/2GRhG/
sumber
getBool(undefined)
akan macet Saat menggunakan versi JSON asli dan akan mengembalikan true untuk versi 2. Ini adalah versi ke-3 yang mengembalikan false: function getBool (val) {var num; return val! = null && (! isNaN (num = + val)? !! num: !! String (val) .toLowerCase (). ganti (!! 0, '')); }Solusi Anda baik-baik saja.
Menggunakan
===
hanya akan konyol dalam hal ini, karena bidang ituvalue
akan selalu menjadiString
.sumber
===
? Dalam hal kinerja akan sama persis jika kedua jenisnya adalah String. Lagi pula, saya lebih suka menggunakan===
karena saya selalu menghindari penggunaan==
dan!=
. Justifikasi: stackoverflow.com/questions/359494/…value
akan selalu menjadistring
tidak==
juga===
tidak konyol. Keduanya adalah alat yang tepat untuk pekerjaan ini. Mereka hanya berbeda ketika tipenya tidak sama. Dalam hal itu===
hanya kembalifalse
sambil==
mengeksekusi algoritma koersi tipe rumit sebelum perbandingan.Ini kembali
false
untuk setiap nilai falsy dantrue
untuk setiap nilai truthy kecuali untuk'false'
,'f'
,'no'
,'n'
, dan'0'
(case-sensitive).sumber
Objek Boolean tidak memiliki metode 'parse'.
Boolean('false')
mengembalikan true, sehingga itu tidak akan berfungsi.!!'false'
juga kembalitrue
, sehingga itu tidak akan berfungsi juga.Jika Anda ingin string
'true'
mengembalikan booleantrue
dan string'false'
untuk mengembalikan booleanfalse
, maka solusi paling sederhana adalah menggunakaneval()
.eval('true')
mengembalikan benar daneval('false')
mengembalikan salah. Ingatlah implikasi kinerja saat menggunakaneval()
meskipun.sumber
var isTrueSet = (myValue === 'true');
adalah jawaban terbaik.eval('TRUE')
; membuktikan sekali lagi, itueval()
jahat.JSON.parse('TRUE')
dari jawaban di bawah juga gagal secara spektakuler. Sangat mudah untuk memaksa kondisi kesalahan dalam JavaScript (atau bahasa apa pun, dalam hal ini). Untuk menjelaskan hal ini, Anda harus menormalkan string terlebih dahulu, misalnya,var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;
.toLowerCase()
dalam jawabannya adalah poin saya. Saya tidak mencoba memaksakan apapun. Huruf besarTRUE
adalah nilai yang cukup umum untuk dikembalikan oleh banyak widget UI.Ini telah diambil dari jawaban yang diterima, tetapi benar-benar memiliki titik yang sangat lemah, dan saya terkejut bagaimana hal itu mendapatkan jumlah upvote, masalah dengan itu bahwa Anda harus mempertimbangkan case dari string karena ini case-sensitive
sumber
Saya menggunakan yang berikut ini:
Fungsi ini melakukan pemaksaan Boolean seperti biasa dengan pengecualian string "false" (case-sensitive) dan "0".
sumber
Ada banyak jawaban dan sulit untuk memilihnya. Dalam kasus saya, saya memprioritaskan kinerja ketika memilih, jadi saya membuat jsPerf ini yang saya harap dapat memberikan sedikit cahaya di sini.
Ringkasan hasil (semakin tinggi semakin baik):
Mereka terkait dengan jawaban terkait di mana Anda dapat menemukan lebih banyak informasi (pro dan kontra) tentang masing-masing; khususnya di komentar.
sumber
sumber
function parseBoolean
sebagai gantinyaEkspresi yang Anda cari adalah sederhana
seperti dalam
Ini menguji
myValue
ekspresi reguler, tidak peka huruf besar-kecil, dan tidak memodifikasi prototipe.Contoh:
sumber
Untuk mengkonversi kedua string ("true", "false") dan boolean ke boolean
Di mana
flag
bisasumber
Sudah ada begitu banyak jawaban yang tersedia. Tetapi mengikuti dapat bermanfaat dalam beberapa skenario.
Ini bisa bermanfaat di mana satu contoh dengan nilai-nilai non-boolean.
sumber
kenapa kamu tidak mencoba yang seperti ini
Ini akan mengembalikan kesalahan ketika beberapa teks lain diberikan daripada benar atau salah terlepas dari kasusnya dan itu akan menangkap angka juga
sumber
Fungsi ini dapat menangani string serta Boolean benar / salah.
Demonstrasi di bawah ini:
sumber
Saya menggunakan yang ini
sumber
"true"
atautrue
. Jika yang kedua, ini tidak akan berhasil. Apakah memungkinkandocument.prototype
untuk menggunakan ini di mana pun kita inginkan?Cara termudah (dengan anggapan string Anda 'benar' atau 'salah') adalah:
Selalu gunakan operator === daripada operator == untuk jenis konversi ini!
sumber
Seperti yang dikatakan @ Shadow2531, Anda tidak bisa langsung mengubahnya. Saya juga menyarankan agar Anda mempertimbangkan input string selain "benar" dan "salah" yang 'benar' dan 'palsu' jika kode Anda akan digunakan kembali / digunakan oleh orang lain. Inilah yang saya gunakan:
sumber
Anda perlu memisahkan (dalam pemikiran Anda) nilai dari pilihan Anda dan representasi dari nilai itu.
Pilih satu titik dalam logika JavaScript di mana mereka perlu bertransisi dari sentinel string ke tipe asli dan melakukan perbandingan di sana, lebih disukai jika hanya dilakukan sekali untuk setiap nilai yang perlu dikonversi. Ingatlah untuk membahas apa yang perlu terjadi jika string sentinel tidak diketahui oleh skrip (yaitu apakah Anda default ke true atau false?)
Dengan kata lain, ya, Anda harus bergantung pada nilai string. :-)
sumber
Menurut saya, pertanyaan ini bertujuan untuk memenuhi tiga tujuan:
Masalah dengan menggunakan JSON adalah gagal dengan menyebabkan kesalahan Javascript. Solusi ini tidak tangguh (meskipun memenuhi 1 dan 3):
Solusi ini tidak cukup ringkas:
Saya sedang bekerja untuk memecahkan masalah ini untuk Typecast.js . Dan solusi terbaik untuk ketiga tujuan ini adalah yang satu ini:
Ini berfungsi untuk banyak kasus, tidak gagal ketika nilai seperti {} dilewatkan, dan sangat ringkas. Juga mengembalikan false sebagai nilai default daripada undefined atau melempar Error, yang lebih berguna dalam pengembangan Javascript yang diketik secara longgar. Bravo ke jawaban lain yang menyarankan itu!
sumber
'true'
, tetapi tidak untuk input yang benar. Untuk membuatnya memenuhi Objective # 1, itu hanya sedikit lebih ringkas daripada Solusi # 2, dan jauh lebih mudah dibaca.return /^(true|yes|1|t|y)$/i.test(str);
Saya sedikit terlambat, tapi saya punya sedikit cuplikan untuk melakukan ini, pada dasarnya mempertahankan semua JSrkrip truthey / falsey / kotor -ness tetapi termasuk
"false"
sebagai nilai yang dapat diterima untuk false.Saya lebih suka metode ini daripada yang disebutkan karena tidak bergantung pada pihak ke-3 untuk menguraikan kode (yaitu: eval / JSON.parse), yang berlebihan dalam pikiran saya, cukup pendek untuk tidak memerlukan fungsi utilitas dan memelihara konvensi truthey / falsey lainnya.
sumber
solusi lain. jsFiddle
test case dijalankan dalam node
sumber
Dewa suci beberapa jawaban ini benar-benar liar. Saya suka JS dan sejumlah cara tak terbatas untuk menguliti bool.
Preferensi saya, yang saya kaget karena belum melihatnya, adalah:
sumber
Satu Liner
Kita hanya perlu menjelaskan string "false" karena string lain (termasuk "true") sudah ada
true
.Uji
Versi yang lebih exaustive
Uji
sumber