JavaScript'te bir string'i boolean'a nasıl dönüştürebilirim?
JavaScript'te bir boolean değeri temsil eden bir dizeyi (örneğin, 'true', 'false') temel bir tipe dönüştürebilir miyim?
HTML'de, bir kullanıcının bir liste içindeki seçimine göre güncellenen gizli bir formum var. Bu form, bazı alanları boolean değerleri temsil eden ve doğal bir boolean değeriyle dinamik olarak doldurulan alanlar içerir. Ancak, bu değer gizli giriş alanına yerleştirildiğinde string haline gelir.
Alan bir dizeye dönüştürüldükten sonra, alanın boole değerini belirlemenin bulabildiğim tek yolu, dizge temsilinin literal değerine dayanmak oldu.
var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
Bunu başarmanın daha iyi bir yolu var mı?
Cevap #1
Yap :
var isTrueSet = (myValue === 'true');
Farklı türdeki değişkenler karşılaştırıldığında herhangi bir örtük tür dönüşümü yapmayan katı eşitlik operatörü (===) kullanın.
Bu, eğer dize "true" ise isTrueSet'i boolean true olarak ve eğer dize "false" ise veya hiç ayarlanmamışsa boolean false olarak ayarlayacaktır.
Büyük/küçük harf duyarsız yapmak için, deneyin:
var isTrueSet = /^true$/i.test(myValue);
// or
var isTrueSet = (myValue?.toLowerCase?.() === 'true');
// or
var isTrueSet = (String(myValue).toLowerCase() === 'true');
Yapma:
Özel ihtiyaçlarınız için bu iki yöntemi kullanırken dikkatli olmalısınız.
var myBool = Boolean("false"); // evaluates to true
var myBool = !!"false"; // evaluates to true
Boş olmayan herhangi bir dize, onları kullanarak true olarak değerlendirilecektir. Boolean dönüşümüyle ilgili olarak aklıma gelen en temiz yöntemler olsalar da, sanırım aradığınız şey bunlar değil.
Cevap #2
Uyarı
Bu oldukça oy almış eski cevap teknik olarak doğru, ancak yalnızca string değeriniz TAM OLARAK "true" veya "false" olduğunda çok özel bir senaryoyu kapsar.
Aşağıdaki bu fonksiyonlara geçersiz bir JSON dizgesi iletildiğinde istisna fırlatılacaktır.
Orijinal cevap:
Ne dersin?
JSON.parse("True".toLowerCase());
veya jQuery ile
$.parseJSON("TRUE".toLowerCase());
Cevap #3
const stringToBoolean = (stringValue) => {
switch(stringValue?.toLowerCase()?.trim()){
case "true":
case "yes":
case "1":
return true;
case "false":
case "no":
case "0":
case null:
case undefined:
return false;
default:
return JSON.parse(stringValue);
}
}
Cevap #4
Bence bu çok daha evrensel:
if (String(a).toLowerCase() == "true") ...
Şöyle gider:
String(true) == "true" //returns true
String(false) == "true" //returns false
String("true") == "true" //returns true
String("false") == "true" //returns false
Cevap #5
Büyük/küçük harfe dikkat etmeyi unutma:
var isTrueSet = (myValue.toLowerCase() === 'true');
Ayrıca, eğer bir form öğesi olan onay kutusuysa, onay kutusunun işaretli olup olmadığını da tespit edebilirsiniz:
var isTrueSet = document.myForm.IS_TRUE.checked;
Kontrol edilirse, bunun true (doğru) olarak "ayarlanmış" olduğunu varsayarsak. Bu doğru/yanlış olarak değerlendirilir.
Cevap #6
Bu, yakın zamanda karşılaştığım boolean dönüşümü yapmanın en kolay yolu. Eklemeyi düşündüm.
JSON.parse('true');
let trueResponse = JSON.parse('true');
let falseResponse = JSON.parse('false');
console.log(trueResponse);
console.log(falseResponse);Cevap #7
Düzenli 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' regardless
// of capitalization and regardless of surrounding white-space.
//
regex=/^\s*(true|1|on)\s*$/i
return regex.test(s);
}
Eğer String sınıfını genişletmeyi seviyorsanız, şunu yapabilirsiniz:
String.prototype.bool = function() {
return strToBool(this);
};
alert("true".bool());
Bunu almak için String nesnesini genişletmek isteyen (yorumlara bakın) ama sıralanabilirlik konusunda endişelenen ve String nesnesini genişleten diğer kodlarla çakışma konusunda endişelenenler için:
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 Firefox yanlış gösterirken Opera, Chrome, Safari ve IE doğru gösterir. Hata 720760)
Cevap #8
Wood-eye dikkatli ol. 500'den fazla oy almış en iyi cevabı uyguladıktan sonra sonuçları gördükten sonra, aslında faydalı bir şey paylaşma zorunluluğu hissediyorum:
En kısa ama çok katı olan yöntemle başlayalım:
var str = "true";
var mybool = JSON.parse(str);
Ve uygun, daha hoşgörülü bir şekilde sonlandırın:
var parseBool = function(str, strict)
{
// console.log(typeof str);
// strict: JSON.parse(str)
if (str == null)
{
if (strict)
throw new Error("Parameter 'str' is null or undefined.");
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 etme :
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]));}
Cevap #9
@Steven'in cevabının en iyisi olduğunu düşündüm ve gelen değer sadece bir string olsaydı olduğundan çok daha fazla durumu ele aldı. Bunu biraz genişletmek ve şunları önermek 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;
}
}
Tüm false durumlarını kapsamak gerekli değildir; eğer zaten hesaba katmanız gereken tüm true durumlarını biliyorsanız. Bu metoda, true bir değer olarak geçebilecek herhangi bir şeyi geçirebilirsiniz (veya başka değerler ekleyebilirsiniz, oldukça basittir), ve geri kalan her şey false olarak kabul edilir.
Cevap #10
JSON parse 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 ayrıca bir fiddle da oluşturdum http://jsfiddle.net/remunda/2GRhG/
Cevap #11
Çözümün iyi.
Bu durumda === kullanmak sadece saçma olurdu, çünkü alanın value değeri her zaman bir String olacaktır.
Cevap #12
Boolean nesnesinin bir 'parse' yöntemi yoktur. Boolean('false') true döner, bu yüzden bu işe yaramaz. !!'false' de true döner, bu yüzden bu da işe yaramaz.
Eğer 'true' stringinin boolean true değerini ve 'false' stringinin boolean false değerini döndürmesini istiyorsanız, en basit çözüm eval() kullanmaktır. eval('true') true döndürür ve eval('false') false döndürür.
eval() kullanırken performans ve güvenlik etkilerini akılda bulundurun.
Cevap #13
var falsy = /^(?:f(?:alse)?|no?|0+)$/i;
Boolean.parse = function(val) {
return !falsy.test(val) && !!val;
};
Bu, 'false', 'f', 'no', 'n' ve '0' (büyük/küçük harf duyarsız) dışında, her yanlış değer için false ve her doğru değer için true döndürür.
// 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());
Cevap #14
Cevap çok ve birini seçmek zor. Benim durumumda, seçim yaparken önceliğim performans, bu yüzden burada biraz ışık tutabileceğini umduğum bu jsPerf'i oluşturdum.
Sonuç özeti (ne kadar yüksek olursa o kadar iyi):
- Koşullu ifade: 2.826.922
- Bool nesnesinde switch case: 2.825.469
- JSON'a Dönüştürme: 1.867.774
- !! dönüşümler: 805.322
- String Prototipi: 713,637
Her birine dair daha fazla bilgiyi (artıları ve eksileri) bulabileceğiniz ilgili yanıta bağlıdırlar; özellikle yorumlarda.
Cevap #15
Bu kabul edilmiş cevaptan alınmıştır, ama gerçekten çok zayıf bir noktası var ve aldığı oy sayısına çok şaşırdım, sorunu şu ki, bunun duruma duyarlı olması nedeniyle string'in durumunu dikkate almanız gerekiyor
var isTrueSet = (myValue.toLowerCase() === 'true');
Cevap #16
Aşağıdakileri kullanırım:
function parseBool(b) {
return !(/^(false|0)$/i).test(b) && !!b;
}
Bu fonksiyon, "false" (büyük/küçük harf duyarsız) ve "0" stringleri dışında olağan Boolean dönüşümünü gerçekleştirir.
Cevap #17
En basit çözüm 🙌🏽
ES6+ ile
mantıksal NOT'u iki kez [ !! ] kullanarak string'e dönüştürmeyi sağlayın
Sadece bu ifadeyi yapıştır...
const stringToBoolean = (string) => string === 'false' ? false : !!string
Ve onu kendi dizgenle geç!
stringToBoolean('') // false
stringToBoolean('false') // false
stringToBoolean('true') // true
stringToBoolean('hello my friend!') // true
const betterStringToBoolean = (string) =>
string === 'false' || string === 'undefined' || string === 'null' || string === '0' ?
false : !!string
Bu ifadeyi kolayca genişletmek için istediğiniz diğer dizeleri dahil edebilirsiniz...:
betterStringToBoolean('undefined') // false
betterStringToBoolean('null') // false
betterStringToBoolean('0') // false
betterStringToBoolean('false') // false
betterStringToBoolean('') // false
betterStringToBoolean('true') // true
betterStringToBoolean('anything else') // true
Cevap #18
Aradığınız ifade basitçe şudur
/^true$/i.test(myValue)
olarak
var isTrueSet = /^true$/i.test(myValue);
Bu, myValue'yi büyük/küçük harfe duyarsız bir şekilde bir düzenli 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
Cevap #19
JSON.parse öğesini aşağıdaki gibi kullanabilirsiniz:
var trueOrFalse='True';
result =JSON.parse(trueOrFalse.toLowerCase());
if(result==true)
alert('this is true');
else
alert('this is false');bu durumda .toLowerCase önemlidir
Cevap #20
includes'in önerilmemiş olmasına şaşırdım
let bool = "false"
bool = !["false", "0", 0].includes(bool)
Gerçekten için kontrolü değiştirebilir veya daha fazla koşul ekleyebilirsiniz (ör. null, '').
Cevap #21
Zaten çok fazla cevap mevcut. Ancak aşağıdakiler bazı durumlarda 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;
});
}
Bu, birinin boolean olmayan değerlerle örnekler verdiği durumlarda faydalı olabilir.
getBoolean('aa'); // false
getBoolean(false); //false
getBoolean('false'); //false
getBoolean('true'); // true
getBoolean(true); // true
getBoolean(1); // true
Cevap #22
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.");
}
};
Cevap #23
Hem string ("true", "false") hem de boolean'ı boolean'a dönüştürmek için
('' + flag) === "true"
flag nerede olabilir
var flag = true
var flag = "true"
var flag = false
var flag = "false"
Cevap #24
Bu fonksiyon, string ile Boolean true/false değerini de işleyebilir.
function stringToBoolean(val){
var a = {
'true':true,
'false':false
};
return a[val];
}
Aşağıdaki gösterim:
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)));Cevap #25
Tek Satır
Sadece “false” dizesini dikkate almamız gerekiyor çünkü diğer tüm dizeler ("true" dahil) zaten true.
function b(v){ return v==="false" ? false : !!v; }
Test
b(true) //true
b('true') //true
b(false) //false
b('false') //false
Daha kapsamlı bir versiyon
function bool(v){ return v==="false" || v==="null" || v==="NaN" || v==="undefined" || v==="0" ? false : !!v; }
Test
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
Cevap #26
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"
Cevap #27
Neden bunun gibi bir şey denemiyorsun
Boolean(JSON.parse((yourString.toString()).toLowerCase()));
Gerçek veya yanlış dışında başka bir metin verildiğinde, büyük küçük harf fark etmeksizin bir hata döndürecek ve sayıları da yakalayacaktır
// 0-> false
// any other number -> true
