Bir dizeyi JavaScript'te boole'ye nasıl dönüştürebilirim?


2552

Boole değerini temsil eden bir dizeyi (örn., 'True', 'false') JavaScript'te gerçek bir türe dönüştürebilir miyim?

Bir liste içindeki kullanıcının seçimine göre güncellenen HTML gizli bir form var. Bu form, boole değerlerini temsil eden ve dinamik olarak gerçek bir boole değeriyle doldurulmuş bazı alanlar içerir. Ancak, bu değer gizli giriş alanına yerleştirildikten sonra bir dize olur.

Bir dizeye dönüştürüldüğünde, alanın boolean değerini belirlemenin tek yolu, dize temsilinin gerçek değerine bağlı olmaktı.

var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';

Bunu başarmanın daha iyi bir yolu var mı?


50
"Bunu başarmanın daha iyi bir yolu var mı?" - kesinlikle daha kötü bir yol var: Dstring=(string==String(string?true:false))?(string?true:false):(!string?true:fa‌​lse);
Mark K Cowan

3
Dizeleri ve function parseBool(val) { return val === true || val === "true" }
bools'ları

1
@Markfunction checkBool(x) { if(x) {return true;} else {return false;} }
Sebi

2
@Sebi: Belgelemeyi unuttun:if (checkBool(x) != false) { ... } else { ... }
Mark K Cowan

3
!!(parseInt(value) || value === "true")
Andrew Luca

Yanıtlar:


3478

Yapmak:

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

===Karşılaştırılan değişkenler eşitlik operatörü ( ==) yerine farklı türlere sahip olduğunda örtük tür dönüşümü yapmayan kimlik operatörünü ( ) kullanarak bunu daha katı hale getirebilirsiniz .

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

Yapma:

Muhtemelen özel ihtiyaçlarınız için bu iki yöntemi kullanma konusunda dikkatli olmalısınız :

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

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

Boş dize olmayan herhangi bir dize truebunları kullanarak değerlendirilir . Boole dönüşümüyle ilgili aklınıza gelebilecek en temiz yöntemler olmasına rağmen, aradığınız şey olmadığını düşünüyorum.


196
myValue === 'true';tam olarak eşittir myValue == 'true';. Kullanmanın hiçbir yararı yoktur ===üzerinde ==burada.
Tim Down

551
Crockford'un tavsiyelerini ve kullanımını takip ediyorum ===ve !==ne zaman mantıklıysa, neredeyse her zaman.
guinaps

55
Örneğin tüm büyük harflerde "DOĞRU" ne olacak?
BMiner

102
@guinaps Genellikle Crockford'un tavsiyelerine uyuyorum, ancak ==vs. ===senaryosu benim yapmadığım birkaç kişiden biri. Ben tamamen bu "hemen her zaman" kullanımına mantıklı olduğunu katılmıyorum ===. Gevşek yazılan diller var çünkü yazımla ilgilenmek istemiyoruz; eğer böyle bir şeyi kontrol if (price >= 50)edersek, dize olarak başlayıp başlamadığını umursamıyoruz. Diyorum ki, çoğu zaman türlerin hokkabazlanmasını istiyoruz . Tip hokkabazlık istemediğimiz nadir durumlarda (örneğin if (price === null)), kullanırız ===. Yıllardır yaptığım şey bu ve hiç sorun yaşamadım .
JMTyler

169
@ JMTyler, gelecek olan bakım programlayıcısını gözden kaçırıyor olabilir. Daima uygun karşılaştırma operatörünü kullanın! Her iki taraftaki türleri 'kesin' biliyorsanız, ancak === kullanmıyorsanız, daha sonra kodunuza bakarken bu bilgiye sahip olmayacağım. Kodunuz yeniden kullanılırsa, bu bir kabus haline gelebilir. GERÇEKTEN türlerinizin dediğiniz gibi 'hokkabazlı' olmasını istiyorsanız, '==' kullanın, ancak çok fazla JS devs, kodunuzu sıkmak için daha kolay, bu kadar kolay açacaktır. Ne kadar 'false' dizesinin boole 'true' olduğunu belirtmesini isterim?
aikeru

687

Uyarı

Bu son derece yükseltilmiş eski yanıt teknik olarak doğrudur, ancak dize değeriniz TAM "true"veya olduğunda çok özel bir senaryoyu kapsar "false".

Bu işlevlerin altına geçersiz bir json dizesi İSTENECEK bir istisna atar .


Orijinal cevap:

Nasıl?

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

veya jQuery ile

$.parseJSON("TRUE".toLowerCase());

62
Buradaki sorun, birçok potansiyel değerin JS yürütmesini durduran bir ayrıştırma hatası oluşturmasıdır. JSON.parse ("FALSE") çalıştırması Javascript'i bombalar. Sorunun amacı, bence, bu kesin vakaları basitçe çözmek değil, aynı zamanda diğer vakalara da dirençli olmaktır.
BishopZ

3
@ Bu çözüm aslında tam olarak ihtiyacım olan şey; iyi, onu bir denemede sararak ... yakala. Ben sadece dize boolean bir değer olsaydı boole dönüştürmek istedim; aksi takdirde, verilen dizeyi kullanın. Bu çalışıyor! Teşekkürler.
jedmao

47
JSON.parse("TRUE".toLowerCase())Doğru bir şekilde ayrıştırılabilmesi için söylemesi oldukça basittir .
Yuck

27
neden bu kadar çok oy var? Bu verimsiz ve korkunç. Sırada ne var? '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// sadece emin olmak için
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);
    }
}

43
Aslında basitleştirilebilir. 1) Orada için test edilmesine gerek olduğunu "true", "yes"ve "1". 2) toLowerCasegeri dönmez null. 3) Boolean(string)ile aynıdır string!==""burada. =>switch(string.toLowerCase()) {case "false": case "no": case "0": case "": return false; default: return true;}
Robert

15
@Robert, güzel bir tane, ama bunun yerine varsayılanı tercih ederim false.
drigoangelo

@drigoangelo Olmak default: return true;kesinlikle mümkün. Ancak, işlevin davranışını değiştirir.
Robert

2
Bunun en iyi cevap olduğunu düşündüm ve burada ayrıntıya girmek istedim: stackoverflow.com/questions/263965/…
BrDaHa

9
.toLowerCase () öğesini çağırarak verileri normalleştiriyorsanız, boşlukları da kesmek için trim () işlevini atmak isteyebilirsiniz
jCuga

174

Bunun çok evrensel olduğunu düşünüyorum:

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

Gider:

String(true) == "true"     //returns true
String(false) == "true"    //returns false
String("true") == "true"   //returns true
String("false") == "true"  //returns false

20
Büyük harfle veya bir String(a).toLowerCase() === 'true'
boole'de

String("what about input like this that isn't a bool?") == "true"
Thomas Eding

6
@ThomasEding false ... ne dönmesini istiyorsun?
Snowburnt

2
bile yapıcıyı kullanarak kısaltmak olabilir String():true+'' === 'true' // true
Todd

1
BTW, 1 veya 0 için de yanlış veya doğru olması gerekir
Miguel

128

Davayı eşleştirmeyi unutmayın:

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

Ayrıca, bir form öğesi onay kutusuysa, onay kutusunun işaretli olup olmadığını da belirleyebilirsiniz:

var isTrueSet = document.myForm.IS_TRUE.checked;

İşaretlenirse, "true" değerine ayarlandığını varsayarsak. Bu doğru / yanlış olarak değerlendirilir.


3
Bu ise bir istisna durumu myValueolur null, trueya da başka bir tip ...
mik01aj

116

Normal ifadeleri kullanabilirsiniz:

/*
 * 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);
}

String sınıfını genişletmeyi seviyorsanız şunları yapabilirsiniz:

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

alert("true".bool());

Bunu elde etmek için String nesnesini genişletmek isteyen ancak numaralandırılabilirlik konusunda endişelenen ve String nesnesini genişleten diğer kodlarla çakışma konusunda endişelenenler için (yorumlara bakın):

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

(Elbette eski tarayıcılarda çalışmaz ve Opera, Chrome, Safari ve IE doğru görünürken Firefox yanlış gösterir. Hata 720760 )


10
Başka bir koda müdahale etmekten korkuyorsanız, işleve her zaman önek ekleyebilirsiniz. Bazı kodlar hala kesilirse, bu kod çok kırılgandır ve düzeltilmelidir. Eklediğiniz işlev, nesneyi diğer kod için bir performans sorununa neden olduğu yerde çok ağır hale getirirse, bunu yapmak istemezsiniz. Ancak, yerleşik nesneleri genişletmenin genellikle kötü bir fikir olduğunu düşünmüyorum. Eğer durum böyleyse, kamuya açık hale getirilemezlerdi.
Shadow2531

41
@DTrejo @Szymon Ben katılmıyorum. Bu tam olarak prototipin aşırı yüklenmesi için bir şey. ..İn için kullanılan kodu (kötü) kırmaktan korkuyorsanız, özellikleri numaralandırmadan gizlemenin yolları vardır. Bkz Object.defineProperty.
devios1

Sözleşmeyi takip etmek için buna parseBool
derdim

8
Boolean ayrıştırma String sınıfına ait değildir .. orada çöp ayrıştırıcıları ve dönüşüm herhangi bir miktarda ile sona erecekti. Genellikle değişen prototiplere -1. Tarayıcılar arası çalışmayan çözümlere -1. Kötü tasarım için -1.
Thomas W

1
İşte tüm cevapların performans karşılaştırması. stackoverflow.com/a/28588344/2824333
sospedra

50

Ahşap göze dikkat et. 500+ upvotes ile en iyi cevabı uyguladıktan sonra sonuçları gördükten sonra, gerçekten yararlı bir şey yayınlamak zorunda hissediyorum:

En kısa ama çok katı bir şekilde başlayalım:

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

Ve uygun, daha hoşgörülü bir yolla bitirin:

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;
}

Test yapmak:

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]));}

İlk yöntemi kullanırsanız eski tarayıcıların bir JSON çoklu dolgusuna ihtiyaç duyabileceğini unutmayın.
DRaehal

1
"False" dizesini falseboole değerine dönüştürmek ne kadar hızlı JSON.parse? CPU açısından, bellek performansı
Yeşil

Yanlış olan herhangi bir şeyi ortadan kaldırmak için (str) {...} ile başlamak daha kolay olmaz mıydı? Ve eğer bu durumda, sadece doğru döndürme konusunda endişelenmeniz gerekir, çünkü zaten yanlış döndürme ile bitirirsiniz!
Larphoid

Dize testlerinin çoğunu (["true", "yes", "1"]. İndexOf (str.toLowerCase (). Trim ())! = -1) ile kısaltabileceğinizi ve 'Null' gibi şeyleri kapsayacak Boole (str)
Scott

38

@Steven'in cevabının en iyisi olduğunu düşündüm ve gelen değerin sadece bir dize olmasından çok daha fazla vakayı hallettim. Biraz uzatmak ve aşağıdakileri sunmak istedim:

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;
    }
}

Hesabınız olması gereken falsetüm truedavaları zaten biliyorsanız, tüm davaları kapsamak gerekli değildir . Bu yönteme, bir truedeğer için geçebilecek (veya başkalarını ekleyebileceğiniz, oldukça basit) herhangi bir şey iletebilirsiniz ve diğer her şey göz önünde bulundurulurfalse


Bu gibi XML / HTML ElementNodes özniteliklerinden aldığınız şeyleri kapsadığı için kullanıyorumautocomplete="on"
philk

2
ToLowerCase ()
Luis Lobo Borobia'dan

34

JSON ayrıştırmasıyla evrensel çözüm:

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

GÜNCELLEME (JSON olmadan):

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

Ayrıca test etmek için keman yarattım http://jsfiddle.net/remunda/2GRhG/


1
'JSON olmadan' sürümünde bazı kusurlar vardır: val = "0"; console.log (!! (+ val || Dize (val) .toLowerCase (). replace (!! 0, ''))); gerçek üretir
Etienne

3
getBool(undefined)Orijinal JSON sürümünü kullanırken çökecek ve 2. sürüm için true değerini döndürecektir. Burada false döndüren 3. bir sürüm var: function getBool (val) {var num; return val! = null && (! isNaN (num = + val)? !! num: !! String (val) .toLowerCase (). replace (!! 0, '')); }
Ron Martinez

31

Çözümünüz iyi.

===Alanın valueher zaman bir olacağı için kullanmak bu durumda aptalca olacaktır String.


17
Neden kullanmanın saçma olacağını düşünüyorsun ===? Performans açısından, her iki türün de Dizeler olması tam olarak aynı olacaktır. Neyse, ben daha çok kullanmak ===Hep kullanımını önlemek beri ==ve !=. Gerekçeler: stackoverflow.com/questions/359494/…
Mariano Desanze

3
Çünkü valueher zaman stringne olacak ne ==de ===saçma olacak. Her ikisi de bu iş için doğru araç. Sadece türler eşit olmadığında farklılık gösterirler . Bu durumda karşılaştırma yapmadan önce karmaşık tipte bir zorlama algoritması yürütürken ===döner . false==
Robert

23
var falsy = /^(?:f(?:alse)?|no?|0+)$/i;
Boolean.parse = function(val) { 
    return !falsy.test(val) && !!val;
};

Bu döner falseher falsy değeri ve truehariç her truthy değeri için 'false', 'f', 'no', 'n', ve '0'(küçük harf duyarsız).

// 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());

20

Boolean nesnesinin bir 'ayrıştırma' yöntemi yoktur. Boolean('false')true döndürür, böylece işe yaramaz. !!'false'Ayrıca geri döner true, böylece bu da çalışmaz.

Eğer dize istiyorsanız 'true'boolean dönmek trueve dize 'false'dönüş mantıksala falseardından basit çözüm kullanımı etmektir eval(). eval('true')true değerini ve eval('false')false değerini döndürür. eval()Gerçi kullanırken performans sonuçlarını unutmayın .


Eval ile neyin yanlış olduğunu (ya da doğru) anlamak için - javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval gibi makalelere göz atın veya 'Javascript eval malware' için stackoverflow üzerinde arama yapın
GrahamMc

2
Bunun var isTrueSet = (myValue === 'true');en iyi cevap olduğuna katılıyorum .
thdoan

Kısa ve öz olmasını seviyorum. Ancak, temel durum için muhteşem bir şekilde başarısız olur eval('TRUE'); bir kez daha kanıtlamak eval()kötüdür.
Kardan Adam

@Area 51 Dedektif Kurgu, aynı şekilde, JSON.parse('TRUE')aşağıdaki cevaptan da muhteşem bir şekilde başarısız oluyor. JavaScript'te (veya bu konuda herhangi bir dilde) bir hata koşulunu zorlamak oldukça kolaydır. Bunu hesaba katmak için, önce dizeyi normalleştirmelisiniz, örn.,var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;
thdoan

1
@ 10basetom: Oldukça doğru. Benim .toLowerCase()cevabım cevabı da eklemelisiniz . Hiçbir şeyi zorlamaya çalışmıyorum. Büyük harf TRUE, birçok kullanıcı arayüzü widget'ı tarafından döndürülecek kadar yaygın bir değerdir.
Kardan Adam

17

Bu kabul edilen cevaptan alınmıştır, ama gerçekten çok zayıf bir noktaya sahiptir ve bu kadar upvotes sayısını nasıl aldığına şok oldum, bununla ilgili dize durumunu dikkate almanız gereken sorun, bu büyük / küçük harfe duyarlıdır.

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

16

Aşağıdakileri kullanıyorum:

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

Bu işlev, "false" (büyük / küçük harf duyarsız) ve "0" dizeleri dışında, normal Boolean zorlamasını gerçekleştirir.


16

Bir sürü cevap var ve bir tane seçmek zor. Benim durumumda, ben seçim yaparken performans öncelik, bu yüzden bu jsPerf oluşturmak oluşturduğumu umuyorum.

Sonuçların özeti (ne kadar yüksekse o kadar iyidir):

  1. Şartlı ifade : 2,826,922
  2. Bool nesnesindeki anahtar kutusu : 2.825.469
  3. JSON için Casting : 1,867,774
  4. !! dönüşümler : 805.322
  5. Dizi Prototipi : 713.637

Her biri hakkında daha fazla bilgi (artı ve eksiler) bulabileceğiniz ilgili cevaba bağlanırlar; özellikle yorumlarda.


jsPerf testini görüntülemeye çalışırken "bir şeyler ters gitti"
spottedmahn

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.");
  }
};

2
Daha da temiz olmak için "true" yerine true.toString () yöntemini kullanabilirsiniz :-)
11'e kadar

Globalsi değiştirmeyin, belki yeni oluşturmak izole değişiklikleri tutmaya çalışır function parseBooleanyerine
Çelik Beyin

13

Aradığınız ifade basitçe

/^true$/i.test(myValue)

de olduğu gibi

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

Bu myValue, büyük / küçük harfe duyarlı olmayan normal bir ifadeye karşı test eder ve prototipi değiştirmez.

Örnekler:

/^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

12

Hem dizeyi ("true", "false") ve boole'yi boole'ye dönüştürmek için

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

Nerede flagolabilir

 var flag = true
 var flag = "true"
 var flag = false
 var flag = "false"

12

Zaten çok fazla cevap var. Ancak aşağıdaki senaryolarda takip etmek faydalı olabilir.

// 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;
    });
}

Boolean olmayan değerlere sahip bir örnek olduğunda bu yararlı olabilir.

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

getBoolean('true'); // true
getBoolean(true); // true
getBoolean(1); // true

10

neden böyle bir şey denemiyorsun

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

Durumdan bağımsız olarak doğru veya yanlış yerine başka bir metin verildiğinde bir hata döndürür ve sayıları da

// 0-> false
// any other number -> true

10

Bu işlev, string / Boolean true / false öğelerini işleyebilir.

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

Aşağıdaki gösteri:

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


9

Bunu kullanıyorum

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"

Bu iyidir, ancak yalnızca Dize türüyle çalışır. Bu ihtiyaç, belki bir değişken tarafından kullanılabilir olduğunu düşünün "true"ya true. İkincisi gelirse, bu işe yaramaz. document.prototypeBunu istediğimiz yerde kullanmak mümkün mü ?
MarceloBarbosa

Bu zarif görünüyor. İyi iş! Ancak, büyük JS uygulamalarında temel birim prototiplerinin aşırı yüklenmesinin (ayrıca birim testine de ihtiyaç duyduğunu) bazı beklenmedik davranışlarla sonuçlanabileceğini fark ettim (yani, prototip aşırı yüklenmiş bir dizi aracılığıyla "için" ile yinelemek istediğinizde, normalde beklemediğiniz bazı özellikler). Uyarıldın. ;)
cassi.lup

boole işlevini de kabul eden bir değişkeniniz StringOrElse2Bool (sob) {if (typeof sob === "string") {return ["no", "false", "0", "off"]. indexOf (sob.toLowerCase ())! == -1? yanlış doğru; } else {return !! sob}
bortunac

8

Eller aşağı en kolay şekilde (dize 'doğru' veya 'yanlış' olacağını varsayarak):

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

Bu tür dönüşümler için her zaman == operatörü yerine === operatörünü kullanın!


4
Hangi dönüşümden bahsediyordunuz? :-)
YMMD

1
Javascript dizesini karşılaştırırken, dönüşümleri kullanmadığınızda == veya === işleçlerini kullanma arasında bir fark yoktur. Burada dizeleri karşılaştırıyorsunuz, bu nedenle tür dönüşümü yok. Bkz. Stackoverflow.com/questions/359494/…
ars265

8

@ Shadow2531'in dediği gibi, onu doğrudan dönüştüremezsiniz. Ayrıca, kodunuz başkaları tarafından yeniden kullanılacak / kullanılacaksa, "doğru" ve "yanlış" olan "doğru" ve "yanlış" ın yanı sıra dize girişlerini de göz önünde bulundurmanızı öneririm. Ne kullanıyorum:

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;
  }
}

7

Seçimlerinizin değerini ve bu değerin temsilini ayırmanız gerekir.

JavaScript mantığında, dize sentinellerinden yerel türe geçmeleri gereken bir nokta seçin ve burada bir karşılaştırma yapın, tercihen dönüştürülmesi gereken her değer için sadece bir kez yapıldığı yer. Eğer sentinel dizginin betiğin bildiği bir şey değilse ne olması gerektiğini ele almayı unutmayın (örn. Varsayılanı doğru mu yoksa yanlış mı?)

Başka bir deyişle, evet, dizenin değerine bağlı olmanız gerekir. :-)


7

Bu soruyu benim üstlenmeme göre üç hedefi karşılamayı amaçlıyor:

  • Doğruluk ve falsey değerleri için true / false döndürür, ancak dize yerine Boolean olsaydı doğruluk veya falsey olabilecek birden fazla dize değeri için true / false döndürür.
  • İkinci olarak, belirtilenler dışındaki değerlerin başarısız olmaması yerine daha çok varsayılan bir değer döndürmesi için esnek bir arayüz sağlayın
  • Üçüncü olarak, tüm bunları olabildiğince az kodla yapın.

JSON kullanımıyla ilgili sorun, bir Javascript hatasına neden olarak başarısız olmasıdır. Bu çözüm esnek değildir (1 ve 3'ü karşılasa da):

JSON.parse("FALSE") // fails

Bu çözüm yeterince kısa değil:

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

Typecast.js için tam olarak bu sorunu çözmeye çalışıyorum . Üç hedefe de en iyi çözüm şudur:

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

Birçok durumda çalışır, {} gibi değerler iletildiğinde başarısız olmaz ve çok özlüdür. Ayrıca, gevşek yazılan Javascript geliştirmede daha yararlı olan, tanımsız veya Hata atmak yerine varsayılan değer olarak false değerini döndürür. Bravo bunu öneren diğer cevaplara!


Sadece hedeflerinize geri dönmek için, üçüncü ve en iyi çözümünüzle ilgili tek sorun, Hedef # 1'i karşılamamasıdır - yalnızca bir değeri için doğru olur 'true', ancak herhangi bir doğru girdi için geri dönmez. Hedef # 1'i karşılaması için Çözüm # 2'den biraz daha özlü ve çok daha az okunabilir.
JMTyler

return /^(true|yes|1|t|y)$/i.test(str);
Kevin Boucher

7

Biraz geç kaldım, ama bunu yapmak için küçük bir parçacığım var, aslında tüm JScripts truthey / falsey / filthy -ness'i korur, ancak "false"yanlış için kabul edilebilir bir değer içerir .

Bu yöntemi bahsedilenlere tercih ediyorum, çünkü kodumu ayrıştırmak için 3. bir tarafa güvenmiyor (yani: eval / JSON.parse), bence aşırıya kaçıyor, bir yardımcı program işlevi gerektirmeyecek kadar kısa ve diğer doğruluk / falsey sözleşmeleri.

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

7

başka bir çözüm. 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
};

düğümde çalışan test senaryoları

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

7

Kutsal tanrı bu cevapların bazıları sadece çılgınca. JS ve bir bool derisi için sonsuz sayıda yolu seviyorum.

Zaten görmemek için şok olduğum tercihim:

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

6

Bir Astar

Başka bir dize ("true" dahil) zaten olduğundan, yalnızca "false" dizesini hesaba katmamız gerekir true.

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

Ölçek

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

Daha exaustive bir versiyon

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

Ölçek

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.