Bagaimana saya bisa mengubah string menjadi boolean di JavaScript?

2553

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?

Kevin
sumber
50
"Apakah ada cara yang lebih baik untuk mencapai ini?" - pasti ada cara yang lebih buruk: Dstring=(string==String(string?true:false))?(string?true:false):(!string?true:fa‌​lse);
Mark K Cowan
3
Mudah menangani string dan bools:function parseBool(val) { return val === true || val === "true" }
WickyNilliams
1
@ function checkBool(x) { if(x) {return true;} else {return false;} }
Mark
2
@ Sebi: Anda lupa mendokumentasikannya:if (checkBool(x) != false) { ... } else { ... }
Mark K Cowan
3
!!(parseInt(value) || value === "true")
Andrew Luca

Jawaban:

3482

Melakukan:

var isTrueSet = (myValue == 'true');

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 ( ==).

var isTrueSet = (myValue === 'true');

Jangan:

Anda mungkin harus berhati-hati dalam menggunakan kedua metode ini untuk kebutuhan spesifik Anda:

var myBool = Boolean("false");  // == true

var myBool = !!"false";  // == true

Setiap string yang bukan string kosong akan dievaluasi truedengan menggunakannya. Meskipun mereka adalah metode terbersih yang dapat saya pikirkan terkait konversi boolean, saya pikir mereka bukan yang Anda cari.

guinaps
sumber
196
myValue === 'true';persis setara dengan myValue == 'true';. Tidak ada manfaat menggunakan ===di ==sini.
Tim Down
551
Saya mengikuti saran dan penggunaan Crockford=== dan !==kapan pun itu masuk akal, yang hampir selalu.
Guinaps
55
Bagaimana dengan "BENAR" di semua huruf besar, misalnya?
BMiner
102
@guinaps Saya biasanya mengikuti saran Crockford, tetapi skenario ==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 seperti if (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.
JMTyler
169
@ JMTyler mungkin mengabaikan pemrogram pemeliharaan yang datang. Selalu gunakan operator perbandingan yang tepat! Jika Anda tahu 'pasti' jenis di kedua sisi, tetapi jangan gunakan ===, saya tidak akan memiliki pengetahuan itu ketika melihat kode Anda nanti. Jika kode Anda digunakan kembali ini bisa menjadi mimpi buruk. Jika Anda BENAR-BENAR ingin jenis Anda 'juggled' seperti yang Anda katakan, maka gunakan '==', tetapi terlalu banyak JS devs akan tersandung ini terlalu mudah, lebih baik untuk memperketat kode Anda. Seberapa sering saya ingin string 'false' menandakan boolean 'benar'?
aikeru
687

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?

JSON.parse("True".toLowerCase());

atau dengan jQuery

$.parseJSON("TRUE".toLowerCase());
Luke
sumber
62
Masalah dengan ini adalah bahwa banyak nilai potensial menghasilkan kesalahan parse yang menghentikan eksekusi JS. Jadi menjalankan JSON.parse ("FALSE") mengebom Javascript. Inti dari pertanyaan, saya pikir, bukan hanya untuk menyelesaikan kasus-kasus yang tepat ini, tetapi juga tangguh terhadap kasus-kasus lain.
BishopZ
3
@ Lukas solusi ini sebenarnya persis apa yang saya butuhkan; baik, membungkusnya dalam mencoba ... menangkap sekalipun. Saya ingin mengonversi ke bool hanya jika itu adalah nilai boolean dalam string; jika tidak, cukup gunakan string yang disediakan. Ini bekerja! Terima kasih.
jedmao
47
Cukup sederhana untuk mengatakannya JSON.parse("TRUE".toLowerCase())sehingga bisa diurai dengan benar.
Yuck
27
mengapa ada begitu banyak upvotes? Ini tidak efisien dan mengerikan. Apa selanjutnya? 'true'.length === 4?
Maksim Vi.
21
@MaksimVi. 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 memastikan
Vitim.us
223
stringToBoolean: function(string){
    switch(string.toLowerCase().trim()){
        case "true": case "yes": case "1": return true;
        case "false": case "no": case "0": case null: return false;
        default: return Boolean(string);
    }
}
Steven
sumber
43
Sebenarnya itu bisa disederhanakan. 1) Tidak perlu diuji "true", "yes"dan "1". 2) toLowerCasetidak kembali null. 3) Boolean(string)sama dengan di string!==""sini. =>switch(string.toLowerCase()) {case "false": case "no": case "0": case "": return false; default: return true;}
Robert
15
@ Robert, bagus, tapi saya lebih suka defaultnya falsesaja.
drigoangelo
@drigoangelo Memiliki default: return true;tentu saja mungkin. Tetapi itu akan mengubah perilaku fungsi.
Robert
2
Saya pikir ini adalah jawaban terbaik, dan ingin menguraikannya di sini: stackoverflow.com/questions/263965/…
BrDaHa
9
jika Anda menormalkan data dengan memanggil .toLowerCase (), maka Anda mungkin ingin melempar trim () untuk menghapus spasi putih
jCuga
174

Saya pikir ini sangat universal:

if (String(a) == "true") ...

Begini:

String(true) == "true"     //returns true
String(false) == "true"    //returns false
String("true") == "true"   //returns true
String("false") == "true"  //returns false
ander
sumber
20
Ketika Anda dapat menerima string dalam huruf besar atau boolean, makaString(a).toLowerCase() === 'true'
pauloya
String("what about input like this that isn't a bool?") == "true"
Thomas Eding
6
@ThomasEding false ... Anda ingin mengembalikan apa?
Snowburnt
2
bahkan bisa dipersingkat dengan tidak menggunakan String()konstruktor:true+'' === 'true' // true
Todd
1
BTW, untuk 1 atau 0 itu juga harus dilemparkan untuk palsu atau benar
Miguel
128

Ingat untuk mencocokkan case:

var isTrueSet = (myValue.toLowerCase() === 'true');

Selain itu, jika kotak centang elemen elemen, Anda juga dapat mendeteksi jika kotak centang dicentang:

var isTrueSet = document.myForm.IS_TRUE.checked;

Dengan asumsi bahwa jika dicentang, itu "diset" sama dengan true. Ini dievaluasi sebagai benar / salah.

Jared Farrish
sumber
3
Ini akan mengeluarkan pengecualian jika myValuekebetulan null, trueatau jenis lainnya ...
mik01aj
116

Anda dapat menggunakan ekspresi reguler:

/*
 * Converts a string to a bool.
 *
 * This conversion will:
 *
 *  - match 'true', 'on', or '1' as true.
 *  - ignore all white-space padding
 *  - ignore capitalization (case).
 *
 * '  tRue  ','ON', and '1   ' will all evaluate as true.
 *
 */
function strToBool(s)
{
    // will match one and only one of the string 'true','1', or 'on' rerardless
    // of capitalization and regardless off surrounding white-space.
    //
    regex=/^\s*(true|1|on)\s*$/i

    return regex.test(s);
}

Jika Anda suka memperluas kelas String yang dapat Anda lakukan:

String.prototype.bool = function() {
    return strToBool(this);
};

alert("true".bool());

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:

Object.defineProperty(String.prototype, "com_example_bool", {
    get : function() {
        return (/^(true|1)$/i).test(this);
    }
});
alert("true".com_example_bool);

(Tidak akan bekerja di browser yang lebih lama tentu saja dan Firefox menunjukkan false sementara Opera, Chrome, Safari dan IE menunjukkan true. Bug 720760 )

shrewmouse
sumber
10
Anda selalu dapat awalan fungsi jika Anda khawatir itu akan mengganggu beberapa kode lainnya. Jika beberapa kode masih rusak, kode itu terlalu rapuh dan harus diperbaiki. Jika fungsi tambahan Anda membuat objek terlalu berat di mana ia menyebabkan masalah kinerja untuk kode lain, maka, jelas Anda tidak ingin melakukan itu. Tapi, saya tidak berpikir itu umumnya ide yang buruk untuk memperluas objek bawaan. Mereka juga tidak akan diperpanjang secara publik jika itu yang terjadi.
Shadow2531
41
@DTrejo @Szymon Saya tidak setuju. Ini adalah jenis kelebihan dari prototipe. Jika Anda takut melanggar (miskin) kode yang bergantung pada..in, ada cara untuk menyembunyikan properti dari enumerasi. Lihat Object.defineProperty.
devios1
Untuk mengikuti konvensi saya akan menyebutnyaparseBool
guzart
8
Penguraian Boolean tidak termasuk dalam kelas String .. Anda akan mendapatkan jumlah parser sampah & konversi apa pun di sana. -1 untuk mengubah prototipe secara umum. -1 untuk solusi yang tidak berfungsi lintas browser. -1 untuk desain yang buruk.
Thomas W
1
Berikut perbandingan kinerja semua jawaban. stackoverflow.com/a/28588344/2824333
sospedra
50

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:

var str = "true";
var mybool = JSON.parse(str);

Dan akhiri dengan cara yang tepat dan lebih toleran:

var parseBool = function(str) 
{
    // console.log(typeof str);
    // strict: JSON.parse(str)

    if(str == null)
        return false;

    if (typeof str === 'boolean')
    {
        return (str === true);
    } 

    if(typeof str === 'string')
    {
        if(str == "")
            return false;

        str = str.replace(/^\s+|\s+$/g, '');
        if(str.toLowerCase() == 'true' || str.toLowerCase() == 'yes')
            return true;

        str = str.replace(/,/g, '.');
        str = str.replace(/^\s*\-\s*/g, '-');
    }

    // var isNum = string.match(/^[0-9]+$/) != null;
    // var isNum = /^\d+$/.test(str);
    if(!isNaN(str))
        return (parseFloat(str) != 0);

    return false;
}

Pengujian:

var array_1 = new Array(true, 1, "1",-1, "-1", " - 1", "true", "TrUe", "  true  ", "  TrUe", 1/0, "1.5", "1,5", 1.5, 5, -3, -0.1, 0.1, " - 0.1", Infinity, "Infinity", -Infinity, "-Infinity"," - Infinity", " yEs");

var array_2 = new Array(null, "", false, "false", "   false   ", " f alse", "FaLsE", 0, "00", "1/0", 0.0, "0.0", "0,0", "100a", "1 00", " 0 ", 0.0, "0.0", -0.0, "-0.0", " -1a ", "abc");


for(var i =0; i < array_1.length;++i){ console.log("array_1["+i+"] ("+array_1[i]+"): " + parseBool(array_1[i]));}

for(var i =0; i < array_2.length;++i){ console.log("array_2["+i+"] ("+array_2[i]+"): " + parseBool(array_2[i]));}

for(var i =0; i < array_1.length;++i){ console.log(parseBool(array_1[i]));}
for(var i =0; i < array_2.length;++i){ console.log(parseBool(array_2[i]));}
Stefan Steiger
sumber
Ingatlah bahwa browser lama mungkin memerlukan polyfill JSON jika Anda menggunakan metode pertama.
DRaehal
1
Seberapa cepat melemparkan string "false" ke falsenilai boolean JSON.parse? Dalam hal CPU, kinerja memori
Hijau
Bukankah lebih mudah memulai dengan jika (str) {...} untuk menghilangkan semua yang salah? Dan di dalam kondisi ini, hanya perlu khawatir tentang mengembalikan yang benar, karena Anda sudah berakhir dengan pengembalian yang salah!
Larphoid
Ingatlah bahwa Anda dapat mempersingkat banyak pengujian string dengan (["true", "yes", "1"]. IndexOf (str.toLowerCase (). Trim ())! = -1) dan gunakan fallback dari Boolean (str) untuk membahas hal-hal seperti 'null'
Scott
38

Saya 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:

function isTrue(value){
    if (typeof(value) === 'string'){
        value = value.trim().toLowerCase();
    }
    switch(value){
        case true:
        case "true":
        case 1:
        case "1":
        case "on":
        case "yes":
            return true;
        default: 
            return false;
    }
}

Tidak perlu menutup semua falsekasus jika Anda sudah tahu semua truekasus yang harus Anda pertanggungjawabkan. Anda dapat meneruskan apa pun ke dalam metode ini yang dapat memberikan truenilai (atau menambahkan yang lain, itu cukup mudah), dan segala hal lainnya akan dipertimbangkanfalse

BrDaHa
sumber
Saya menggunakan ini karena mencakup hal-hal yang Anda dapatkan dari atribut XML / HTML ElementNodes sepertiautocomplete="on"
philk
2
Saya akan menambahkan .trim () sebelum toLowerCase ()
Luis Lobo Borobia
34

Solusi universal dengan parse JSON:

function getBool(val) {
    return !!JSON.parse(String(val).toLowerCase());
}

getBool("1"); //true
getBool("0"); //false
getBool("true"); //true
getBool("false"); //false
getBool("TRUE"); //true
getBool("FALSE"); //false

PEMBARUAN (tanpa JSON):

function getBool(val){ 
    var num = +val;
    return !isNaN(num) ? !!num : !!String(val).toLowerCase().replace(!!0,'');
}

Saya juga membuat biola untuk mengujinya http://jsfiddle.net/remunda/2GRhG/

Jan Remunda
sumber
1
Versi 'tanpa JSON' memiliki beberapa kekurangan: val = "0"; console.log (!! (+ val || String (val) .toLowerCase (). ganti (!! 0, '')))); menghasilkan benar
Etienne
3
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, '')); }
Ron Martinez
31

Solusi Anda baik-baik saja.

Menggunakan ===hanya akan konyol dalam hal ini, karena bidang itu valueakan selalu menjadi String.

Jonny Buchanan
sumber
17
Mengapa Anda pikir itu konyol untuk digunakan ===? 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/…
Mariano Desanze
3
Karena valueakan selalu menjadi stringtidak ==juga ===tidak konyol. Keduanya adalah alat yang tepat untuk pekerjaan ini. Mereka hanya berbeda ketika tipenya tidak sama. Dalam hal itu ===hanya kembali falsesambil ==mengeksekusi algoritma koersi tipe rumit sebelum perbandingan.
Robert
23
var falsy = /^(?:f(?:alse)?|no?|0+)$/i;
Boolean.parse = function(val) { 
    return !falsy.test(val) && !!val;
};

Ini kembali falseuntuk setiap nilai falsy dan trueuntuk setiap nilai truthy kecuali untuk 'false', 'f', 'no', 'n', dan '0'(case-sensitive).

// False
Boolean.parse(false);
Boolean.parse('false');
Boolean.parse('False');
Boolean.parse('FALSE');
Boolean.parse('f');
Boolean.parse('F');
Boolean.parse('no');
Boolean.parse('No');
Boolean.parse('NO');
Boolean.parse('n');
Boolean.parse('N');
Boolean.parse('0');
Boolean.parse('');
Boolean.parse(0);
Boolean.parse(null);
Boolean.parse(undefined);
Boolean.parse(NaN);
Boolean.parse();

//True
Boolean.parse(true);
Boolean.parse('true');
Boolean.parse('True');
Boolean.parse('t');
Boolean.parse('yes');
Boolean.parse('YES');
Boolean.parse('y');
Boolean.parse('1');
Boolean.parse('foo');
Boolean.parse({});
Boolean.parse(1);
Boolean.parse(-1);
Boolean.parse(new Date());
Prestaul
sumber
20

Objek Boolean tidak memiliki metode 'parse'. Boolean('false')mengembalikan true, sehingga itu tidak akan berfungsi. !!'false'juga kembali true, sehingga itu tidak akan berfungsi juga.

Jika Anda ingin string 'true'mengembalikan boolean truedan string 'false'untuk mengembalikan boolean false, maka solusi paling sederhana adalah menggunakan eval(). eval('true')mengembalikan benar dan eval('false')mengembalikan salah. Ingatlah implikasi kinerja saat menggunakan eval()meskipun.

10asetom
sumber
Untuk memahami apa yang "salah" (atau kanan) dengan eval - lihat artikel seperti javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval atau cari di stackoverflow untuk 'Javascript eval malware'
GrahamMc
2
Saya setuju itu var isTrueSet = (myValue === 'true');adalah jawaban terbaik.
thdoan
Saya suka itu singkat. Tetapi gagal secara spektakuler untuk kasus dasar eval('TRUE'); membuktikan sekali lagi, itu eval()jahat.
Snowman
@Area 51 Detektif Fiksi, dengan cara yang sama, 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;
thdoan
1
@ 10basetom: Cukup benar. Anda harus memasukkan .toLowerCase()dalam jawabannya adalah poin saya. Saya tidak mencoba memaksakan apapun. Huruf besar TRUEadalah nilai yang cukup umum untuk dikembalikan oleh banyak widget UI.
Snowman
18

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

var isTrueSet = (myValue.toLowerCase() === 'true');
Hakam Fostok
sumber
16

Saya menggunakan yang berikut ini:

function parseBool(b) {
    return !(/^(false|0)$/i).test(b) && !!b;
}

Fungsi ini melakukan pemaksaan Boolean seperti biasa dengan pengecualian string "false" (case-sensitive) dan "0".

Zobier
sumber
16

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):

  1. Pernyataan bersyarat : 2.826.922
  2. Beralih kasus pada objek Bool : 2.825.469
  3. Casting ke JSON : 1,867.774
  4. !! konversi : 805.322
  5. Prototipe String : 713.637

Mereka terkait dengan jawaban terkait di mana Anda dapat menemukan lebih banyak informasi (pro dan kontra) tentang masing-masing; khususnya di komentar.

sospedra
sumber
"Ada yang salah" ketika mencoba melihat uji
jsPerf
13
Boolean.parse = function (str) {
  switch (str.toLowerCase ()) {
    case "true":
      return true;
    case "false":
      return false;
    default:
      throw new Error ("Boolean.parse: Cannot convert string to boolean.");
  }
};
Thomas Eding
sumber
2
Anda dapat menggunakan true.toString () alih-alih "true" menjadi lebih bersih :-)
tillda
Jangan mengubah global, cobalah untuk membuat perubahan Anda terisolasi, mungkin buat yang baru function parseBooleansebagai gantinya
Steel Brain
13

Ekspresi yang Anda cari adalah sederhana

/^true$/i.test(myValue)

seperti dalam

var isTrueSet = /^true$/i.test(myValue);

Ini menguji myValueekspresi reguler, tidak peka huruf besar-kecil, dan tidak memodifikasi prototipe.

Contoh:

/^true$/i.test("true"); // true
/^true$/i.test("TRUE"); // true
/^true$/i.test("tRuE"); // true
/^true$/i.test(" tRuE"); // false (notice the space at the beginning)
/^true$/i.test("untrue"); // false (some other solutions here will incorrectly return true
/^true$/i.test("false");// returns false
/^true$/i.test("xyz");  // returns false
AndreasPizsa
sumber
12

Untuk mengkonversi kedua string ("true", "false") dan boolean ke boolean

('' + flag) === "true"

Di mana flagbisa

 var flag = true
 var flag = "true"
 var flag = false
 var flag = "false"
Fizer Khan
sumber
12

Sudah ada begitu banyak jawaban yang tersedia. Tetapi mengikuti dapat bermanfaat dalam beberapa skenario.

// One can specify all values against which you consider truthy
var TRUTHY_VALUES = [true, 'true', 1];

function getBoolean(a) {
    return TRUTHY_VALUES.some(function(t) {
        return t === a;
    });
}

Ini bisa bermanfaat di mana satu contoh dengan nilai-nilai non-boolean.

getBoolean('aa'); // false
getBoolean(false); //false
getBoolean('false'); //false

getBoolean('true'); // true
getBoolean(true); // true
getBoolean(1); // true
Sandip Nirmal
sumber
10

kenapa kamu tidak mencoba yang seperti ini

Boolean(JSON.parse((yourString.toString()).toLowerCase()));

Ini akan mengembalikan kesalahan ketika beberapa teks lain diberikan daripada benar atau salah terlepas dari kasusnya dan itu akan menangkap angka juga

// 0-> false
// any other number -> true
Yohan
sumber
10

Fungsi ini dapat menangani string serta Boolean benar / salah.

function stringToBoolean(val){
    var a = {
        'true':true,
        'false':false
    };
    return a[val];
}

Demonstrasi di bawah ini:

function stringToBoolean(val) {
  var a = {
    'true': true,
    'false': false
  };
  return a[val];
}

console.log(stringToBoolean("true"));

console.log(typeof(stringToBoolean("true")));

console.log(stringToBoolean("false"));

console.log(typeof(stringToBoolean("false")));

console.log(stringToBoolean(true));

console.log(typeof(stringToBoolean(true)));

console.log(stringToBoolean(false));

console.log(typeof(stringToBoolean(false)));

console.log("=============================================");
// what if value was undefined? 
console.log("undefined result:  " + stringToBoolean(undefined));
console.log("type of undefined result:  " + typeof(stringToBoolean(undefined)));
console.log("=============================================");
// what if value was an unrelated string?
console.log("unrelated string result:  " + stringToBoolean("hello world"));
console.log("type of unrelated string result:  " + typeof(stringToBoolean(undefined)));

pengguna1063287
sumber
9

Saya menggunakan yang ini

String.prototype.maybeBool = function(){

    if ( ["yes", "true", "1", "on"].indexOf( this.toLowerCase() ) !== -1 ) return true;
    if ( ["no", "false", "0", "off"].indexOf( this.toLowerCase() ) !== -1 ) return false;

    return this;

}

"on".maybeBool(); //returns true;
"off".maybeBool(); //returns false;
"I like js".maybeBool(); //returns "I like js"
Adam Pietrasiak
sumber
Ini bagus, tetapi hanya bekerja dengan tipe String. Bayangkan bahwa ini perlu digunakan oleh variabel yang mungkin "true"atau true. Jika yang kedua, ini tidak akan berhasil. Apakah memungkinkan document.prototypeuntuk menggunakan ini di mana pun kita inginkan?
MarceloBarbosa
Ini terlihat elegan. Kerja bagus! Namun, saya perhatikan bahwa kelebihan prototipe dasar dalam aplikasi JS besar (yang juga perlu pengujian unit) dapat mengakibatkan beberapa perilaku yang tidak terduga (yaitu, ketika Anda ingin beralih dengan "for" melalui array yang memiliki prototipe kelebihan beban, Anda akan mendapatkan beberapa properti yang biasanya tidak Anda harapkan). Anda telah diperingatkan. ;)
cassi.lup
varian Anda yang menerima boolean juga berfungsi sebagai StringOrElse2Bool (sob) {if (typeof sob === "string") {return ["no", "false", "0", "off"]. indexOf (sob.toLowerCase ())! == -1? salah benar; } else {return !! sob}
bortunac
8

Cara termudah (dengan anggapan string Anda 'benar' atau 'salah') adalah:

var z = 'true';
var y = 'false';
var b = (z === 'true'); // will evaluate to true
var c = (y === 'true'); // will evaluate to false

Selalu gunakan operator === daripada operator == untuk jenis konversi ini!

risingfish
sumber
4
Konversi apa yang Anda bicarakan? :-)
YMMD
1
Saat membandingkan string dalam javascript, tidak ada perbedaan antara menggunakan operator == atau === saat tidak menggunakan konversi. Di sini Anda membandingkan dengan string, oleh karena itu tidak ada konversi tipe. Lihat stackoverflow.com/questions/359494/…
ars265
8

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:

function parseBoolean(string) {
  switch (String(string).toLowerCase()) {
    case "true":
    case "1":
    case "yes":
    case "y":
      return true;
    case "false":
    case "0":
    case "no":
    case "n":
      return false;
    default:
      //you could throw an error, but 'undefined' seems a more logical reply
      return undefined;
  }
}
tidak adil
sumber
7

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. :-)

ahli statika
sumber
7

Menurut saya, pertanyaan ini bertujuan untuk memenuhi tiga tujuan:

  • Mengembalikan nilai true / false untuk nilai-nilai true dan falsey, tetapi juga mengembalikan true / false untuk beberapa nilai string yang akan bernilai true atau falsey jika mereka adalah Boolean alih-alih string.
  • Kedua, menyediakan antarmuka tangguh sehingga nilai-nilai selain yang ditentukan tidak akan gagal, melainkan mengembalikan nilai default
  • Ketiga, lakukan semua ini dengan kode sesedikit mungkin.

Masalah dengan menggunakan JSON adalah gagal dengan menyebabkan kesalahan Javascript. Solusi ini tidak tangguh (meskipun memenuhi 1 dan 3):

JSON.parse("FALSE") // fails

Solusi ini tidak cukup ringkas:

if(value === "TRUE" || value === "yes" || ...) { return true; }

Saya sedang bekerja untuk memecahkan masalah ini untuk Typecast.js . Dan solusi terbaik untuk ketiga tujuan ini adalah yang satu ini:

return /^true$/i.test(v);

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!

BishopZ
sumber
Hanya untuk kembali ke tujuan Anda, satu-satunya masalah dengan solusi ketiga & terbaik Anda adalah tidak memenuhi Tujuan # 1 - itu hanya akan mengembalikan nilai true '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.
JMTyler
return /^(true|yes|1|t|y)$/i.test(str);
Kevin Boucher
7

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.

var value = "false";
var result = (value == "false") != Boolean(value);

// value = "true"  => result = true
// value = "false" => result = false
// value = true    => result = true
// value = false   => result = false
// value = null    => result = false
// value = []      => result = true
// etc..
Mati
sumber
7

solusi lain. jsFiddle

var toBoolean = function(value) {
    var strValue = String(value).toLowerCase();
    strValue = ((!isNaN(strValue) && strValue !== '0') &&
        strValue !== '' &&
        strValue !== 'null' &&
        strValue !== 'undefined') ? '1' : strValue;
    return strValue === 'true' || strValue === '1' ? true : false
};

test case dijalankan dalam node

> toBoolean(true)
true
> toBoolean(false)
false
> toBoolean(undefined)
false
> toBoolean(null)
false
> toBoolean('true')
true
> toBoolean('True')
true
> toBoolean('False')
false
> toBoolean('false')
false
> toBoolean('0')
false
> toBoolean('1')
true
> toBoolean('100')
true
> 
vbranden
sumber
7

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:

testVar = testVar.toString().match(/^(true|[1-9][0-9]*|[0-9]*[1-9]+|yes)$/i) ? true : false;
OhkaBaka
sumber
6

Satu Liner

Kita hanya perlu menjelaskan string "false" karena string lain (termasuk "true") sudah ada true.

function b(v){ return v==="false" ? false : !!v; }

Uji

b(true)    //true
b('true')  //true
b(false)   //false
b('false') //false

Versi yang lebih exaustive

function bool(v){ return v==="false" || v==="null" || v==="NaN" || v==="undefined" || v==="0" ? false : !!v; }

Uji

bool(true)        //true
bool("true")      //true
bool(1)           //true
bool("1")         //true
bool("hello")     //true

bool(false)       //false
bool("false")     //false
bool(0)           //false
bool("0")         //false
bool(null)        //false
bool("null")      //false
bool(NaN)         //false
bool("NaN")       //false
bool(undefined)   //false
bool("undefined") //false
bool("")          //false

bool([])          //true
bool({})          //true
bool(alert)       //true
bool(window)      //true
Vitim.us
sumber