Soru JavaScript'te bir dizeyi boolean'a nasıl dönüştürebilirim?


JavaScript'te intrinsik bir türe bir boolean değerini (ör. 'True', 'false') temsil eden bir diziyi dönüştürebilir miyim?

HTML'de gizli bir form var, bir kullanıcının listesindeki seçimine göre güncellenir. Bu form, boole değerlerini temsil eden ve içsel bir boole değeriyle dinamik olarak doldurulmuş bazı alanlar içerir. Ancak, bu değer gizli giriş alanına yerleştirildikten sonra bir dizge haline gelir.

Alanın boole değerini belirlemek için bulabildiğim tek yol, bir dizgeye dönüştürüldükten sonra, dize temsilinin değişmez değerine bağlıydı.

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

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


1840
2017-11-05 00:13


Menşei


Sadece üçlü-eşitlik karşılaştırmasından kaçınmanın tuhaf bir örneğini vurgulamak için: Bir fonksiyonum var currentSortDirection() dönüyor 1 artan bir sıralama için 0 azalan bir sıralama için -1 ayarlanmadı. kullanma while (currentSortDirection() != desiredSortDirection) { sortColumn() } harika çalışıyor -1 != true  ve  -1 != false... ama bunu değiştirmek için while (Boolean(currentSortDirection) !== ...) {...} güçler -1 içine truejshint'i mutlu etmek için ek bir çift satır hazırlamayı gerektiriyor. - Droogans
"Bunu başarmanın daha iyi bir yolu var mı?" - kesinlikle daha kötü bir yol var: D string=(string==String(string?true:false))?(string?true:false):(!string?true:fa‌​lse); - Mark K Cowan
Dizeleri ve destekleri kolayca ele alın: function parseBool(val) { return val === true || val === "true" } - WickyNilliams
@İşaret function checkBool(x) { if(x) {return true;} else {return false;} } - Sebi
@Sebi: Bunu belgelemeyi unuttun: if (checkBool(x) != false) { ... } else { ... } - Mark K Cowan


Cevaplar:


Yap:

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

Kimlik operatörünü kullanarak daha sıkı hale getirebilirsiniz (===Eşitlik operatörü yerine, karşılaştırılan değişkenler farklı türlerde olduğunda örtülü tür dönüşümleri yapmaz.==).

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

Yapma:

Muhtemelen sen Bu iki yöntemi kullanmak konusunda dikkatli olun özel ihtiyaçlarınız için:

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

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

Boş dize olmayan herhangi bir dize değerlendirecek true onları kullanarak. Ben boole dönüşümüyle ilgili düşünebildiğim en temiz yöntemler olsalar da, onların aradığınız şey olmadığını düşünüyorum.


2473



myValue === 'true'; kesin olarak eşdeğerdir myValue == 'true';. Kullanımında hiçbir faydası yoktur === üzerinde == İşte. - Tim Down
Takip ederim Crockford'un tavsiyesi ve kullan === ve !== ne zaman mantıklı olursa, neredeyse her zaman. - guinaps
Örneğin, tüm büyük harflerde "DOĞRU" nedir? - BMiner
@guinaps Genellikle Crockford'un tavsiyesini takip ediyorum ama == vs. === Senaryoya sahip olmayan senaryolardan biridir. ben tamamen "hemen hemen her zaman" kullanımının mantıklı olduğunu kabul etmiyorum ===. Kısmen yazılan diller var olmak çünkü türü önemsemek istemiyoruz; eğer bir şeyi kontrol edersek if (price >= 50) Bir dize olarak başladığı umurumda değil. Diyorum, çoğu zamanın istemek hokkabazlık türleri. Tür hokkabazlık istemediğimiz nadir durumlarda (ör. if (price === null)), sonra kullanırız ===. Yıllardır yaptığım bu ve ben asla bir sorun vardı. - JMTyler
@JMTyler, sonra gelen bakım programcısına bakan olabilir. Her zaman uygun karşılaştırma operatörünü kullanın! Her iki tarafta da 'emin' olduğunu biliyorsanız, ancak === kullanmıyorsanız, daha sonra kodunuza bakarken bu bilgiye sahip olmayacağım. Kodunuz yeniden kullanılıyorsa, bu bir kabusa dönüşebilir. Eğer türlerinizin dediğiniz gibi "hokkabaz" olmasını istiyorsanız, '==' kullanın, ancak çok fazla JS devresi bu kadar kolay bir şekilde seyahat edecek, kodunuzu sıkılaştırmak için daha iyi olacaktır. Boole 'gerçek' değerini belirtmek için hangi sıklıkla 'false' dizesi isterim? - aikeru


Uyarı

Bu son derece yüksek değerdeki eski cevap, teknik olarak doğrudur, ancak dize değeriniz TAMAMEN olduğunda yalnızca çok özel bir senaryoyu kapsar. "true" veya "false" (Ayrıca küçük harf OLMALIDIR).

Aşağıdaki bu işlevlere geçersiz bir json dizesi geçti Bir istisna atar.


Orijinal cevap:

Ne dersin?

JSON.parse("true");

veya jQuery ile

$.parseJSON("true");

518



Buradaki sorun, birçok potansiyel değerin JS yürütmeyi durduran bir ayrıştırma hatası oluşturmasıdır. JSON.parse ("FALSE") koşmak Javascript'i bombalar. Sorunun amacı, bence bu kesin vakaları basitçe çözmek değil, aynı zamanda diğer davalara karşı da dirençli olmaktır. - BishopZ
Sadece söylemek için oldukça basit JSON.parse("TRUE".toLowerCase()) böylece doğru ayrıştırılabilir. - Yuck
@Ebenezar neden ie7'yi önemsiyoruz? Dünya çapında% 1 pazar payına sahiptir. - Todd
@Ebenezar Buna saygı gösterebilirim, fakat zamanım diğer>% 99 için optimize ediliyor. 15'de ie7 kullanan arkadaşlar, internet ile ilgili olarak pek de iyi bir şey değildir. şerefe. - Todd
Neden bu kadar çok upvot var? Bu verimsiz ve korkunç. Sırada ne var? 'true'.length === 4? - Maksim Vi.


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

186



Aslında basitleştirilebilir. 1) Test edilmeye gerek yoktur "true", "yes" ve "1". 2) toLowerCase dönmez null. 3) Boolean(string) aynıdır string!=="" İşte. => switch(string.toLowerCase()) {case "false": case "no": case "0": case "": return false; default: return true;} - Robert
@Robert, hoş biri, ama varsayılan olarak falseyerine. - drigoangelo
@drigoangelo Sahipleniyor default: return true; kesinlikle mümkündür. Ama bu işlevin davranışını değiştirir. - Robert
Bunun en iyi cevap olduğunu düşündüm ve burada ayrıntılı olarak detaylandırmak istedim: stackoverflow.com/questions/263965/... - BrDaHa
.toLowerCase () öğesini çağırarak verileri normalize ediyorsanız, boşlukları da kırpmak için trim () öğesini atmak isteyebilirsiniz. - jCuga


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

120



Büyük harf veya boole bir dize alabildiğinizde String(a).toLowerCase() === 'true' - pauloya
@PauloManuelSantos bu gerçekten burada en iyi one-liner :) harika! - Adam Lukaszczyk
String("what about input like this that isn't a bool?") == "true" - Thomas Eding
@ThomasEding false ... ne geri dönmek istiyorsun? - Snowburnt
kullanarak bile kısaltabilir String() yapıcı: true+'' === 'true' // true - Todd


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 sayılabilirlik konusunda endişelenenler ve String nesnesini genişleten diğer kodlarla çakışmaktan endişe duyanlar 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);

(Eski tarayıcılarda çalışmayacaksınız ve Firefox, Opera, Chrome, Safari ve IE'nin gerçek olduğunu gösterirken yanlış görünüyor. Hata 720760)


105



Yerleşik nesnelerin prototipini değiştirmek için iyi bir fikir değil! - DTrejo
Başka bir kodla çakışacağından korkuyorsanız, her zaman işlevi önbelleğe alabilirsiniz. Bazı kodlar hala bozulursa, bu kod çok kırılgandır ve düzeltilmelidir. Eklenen işleviniz nesneyi diğer kod için bir performans sorununa neden olan çok ağır yaparsa, o zaman bunu yapmak istemezsiniz. Ancak, yerleşik nesneleri genişletmenin genellikle kötü bir fikir olduğunu düşünmüyorum. Bu durumda, ayrıca kamuya açıklanamazlardı. - Shadow2531
Prototipi değiştirmemelisin - Szymon Wygnański
@DTrejo @Szymon Katılmıyorum. Bu tam olarak prototipin aşırı yüklenmesiyle ilgili bir şey. Eğer buna bağlı olarak (kötü) kod kırmaktan korkuyorsanız, özellikleri numaralandırmadan gizlemenin yolları vardır. Görmek Object.defineProperty. - devios1
Boolean ayrıştırma, String sınıfına ait değil .. Eğer herhangi bir miktarda çöp parsers ve dönüşüm orada bitecek. -1 genel olarak prototipleri değiştirir. -1 tarayıcıya çalışmayan çözümlere. Kötü tasarım için -1. - Thomas W


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 algılayabilirsiniz:

var isTrueSet = document.myForm.IS_TRUE.checked;

Kontrol edilirse, true olarak "ayarlanmış" olduğunu varsayarsak. Bu doğru / yanlış olarak değerlendirir.


103



neden üçlü yaparsın zaten bir boole var - nickf
Çünkü yapabilirsin? "Orada zaten bir boole var" ile ne demek istiyorsun? - Jared Farrish
Jared, === zaten bir boole durumudur, üçlü gereksizdir. - FlySwat
Doğru. Ben zaten nergislerden nefret ediyorum. Şey, sanırım şu an için LowerCase'de, bu yüzden üçlüyü çıkarmak için düzenledim. - Jared Farrish
Bu bir istisna atarsa myValue olması null, true veya başka bir tür ... - mik01aj


Ahşap göz dikkat et. En yüksek cevabı 500'den fazla oylama ile uyguladıktan sonra sonuçları gördükten sonra, aslında yararlı olan bir şey göndermek zorunda olduğumu 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 şekilde sona eriyor:

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

39



İlk yöntemi kullandığınızda, eski tarayıcıların bir JSON polyfill'e ihtiyaç duyabileceğini unutmayın. - DRaehal
"False" dizesini ne kadar hızlı yayınlayacak? false boole değeriyle JSON.parse? CPU açısından bellek performansı - Green


Çözümün iyi.

kullanma === Bu durumda, bu alandaki gibi aptalca olur value her zaman olacak String.


29



Buradaki tek mantıklı cevap :) - Bobby Jack
Neden kullanmak aptalca olacağını düşünüyorsun? ===? Performans açısından, her iki tip de Strings ise aynı olacaktır. Her neyse, kullanmayı tercih ederim === her zaman kullanımından kaçınıyorum == ve !=. doğrulamalar: stackoverflow.com/questions/359494/... - Mariano Desanze
Dan beri value her zaman olacak string ne == ne de === aptalca. Her ikisi de bu iş için doğru araç. Sadece türler ne zaman değişir değil eşit. Bu durumda === basitçe döner false süre == Karşılaştırmadan önce karmaşık bir tip zorlama algoritması yürütür. - Robert


JSON ayrıştırma ile 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,'');
}

Bunu test etmek için keman yaptım http://jsfiddle.net/remunda/2GRhG/


24



JSON tüm tarayıcılarda desteklenmez: / - Aamir Afridi
Tamam, JSON olmadan oldukça iyi çalışan bir fonksiyon ekledim :) - Jan Remunda
'JSON' olmayan versiyonun bazı kusurları vardır: val = "0"; console.log (!! (+ val || String (val) .toLowerCase (). değiştirin (!! 0, ''))); doğru üretir - Etienne
Tamam teşekkürler. Onardım ve keman yarattım jsfiddle.net/remunda/2GRhG - Jan Remunda
getBool(undefined) çökecek Orijinal JSON sürümünü kullanırken ve ikinci sürüm için doğru dönecektir. İşte false döndüren bir 3. sürüm: function getBool (val) {var num; return val! = null && (! isNaN (num = + val)? !! num: !! String (val) .toLowerCase (). değiştirin (!! 0, '')); } - Ron Martinez