我怎样才能在JavaScript中将string转换为布尔值?

我可以将代表布尔值的string(例如'true','false')转换为JavaScript中的内部types吗?

我在HTML中有一个隐藏的表单,根据用户在列表中的select进行更新。 这个表单包含一些表示布尔值的字段,并用一个固有的布尔值dynamic填充。 但是,一旦将这个值放入隐藏的input字段中,它将变成一个string。

一旦将字段转换为string,我可以find确定字段布尔值的唯一方法是依赖于string表示forms的字面值。

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

有没有更好的方法来完成这个?

做:

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

不必要:

您可以使用身份运算符( === )使其更严格,当比较variables具有不同types时,不会进行任何隐式types转换,而不是等号运算符( == ),该运算符会:

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

别:

您应该谨慎使用这两种方法来满足您的特定需求:

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

任何不是空string的string将通过使用它们评估为true 。 虽然他们是我能想到的关于布尔转换的最干净的方法,但我认为他们不是你想要的。

警告

这个高度支持的遗留答案在技术上是正确的,但只包含一个非常具体的情况,当你的string值是完全"true""false" (必须是小写)。

传入下面这些函数的无效jsonstring将会抛出exception


原始答案:

怎么样?

 JSON.parse("true"); 

或与jQuery

 $.parseJSON("true"); 
 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); } } 

记得要匹配的情况下:

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

另外,如果它是一个表单元素checkbox,你也可以检测checkbox是否被选中:

 var isTrueSet = document.myForm.IS_TRUE.checked; 

假设如果它被检查,它被“设置”等于true。 这评估为真/假。

 String.prototype.bool = function() { return (/^true$/i).test(this); }; alert("true".bool()); 

对于那些想要扩展String对象来获得这个(但是担心可枚举性并且担心与扩展String对象的其他代码冲突的人)

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

(当然在旧版本的浏览器中不能正常工作,而在Opera,Chrome,Safari和IE浏览器中,Firefox显示为false。 错误720760 )

我认为这是非常普遍的:

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

它是:

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

木眼要小心。 在看到500+ upvotes的顶级答案之后的后果后,我觉得有义务发布一些实际有用的东西:

让我们以最短但非常严格的方式开始:

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

并以一个适当的,更宽容的方式结束:

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

testing:

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

你的解决scheme很好。

在这种情况下,使用===会很愚蠢,因为字段的value总是一个String

JSONparsing的通用解决scheme:

 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 

更新(不含JSON):

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

我也创build了小提琴来testing它http://jsfiddle.net/remunda/2GRhG/

我认为@Steven的答案是最好的,并且处理了更多的情况,如果传入的值只是一个string。 我想扩展一下,并提供以下内容:

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

如果您已经知道所有必须考虑的true案例,则无需涵盖所有的false案件。 你可以传递任何东西到这个方法中,这个方法可以传递一个true值(或者添加其他的东西,这很简单),其他的东西都会被认为是false

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

除了'false''f''no''n''0' (不区分大小写)以外,每个真值都会返回false

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

布尔对象没有“parsing”方法。 Boolean('false')返回true,所以这将无法正常工作。 !!'false'也返回true ,这样也不起作用。

如果你想要string'true'返回布尔true和string'false'返回布尔false ,那么最简单的解决scheme是使用eval()eval('true')返回true, eval('false')返回false。 请记住使用eval()时的性能影响。

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

我使用以下内容:

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

除了string“false”(不区分大小写)和“0”之外,该函数执行通常的布尔强制转换。

你正在寻找的expression是简单的

 /^true$/i.test(myValue) 

如在

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

myValue根据正则expression式testingmyValue ,不区分大小写,并且不会修改原型。

例子:

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

已经有很多答案可用了。 但在以下情况下可能会有用。

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

这在非布尔值的例子中很有用。

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

有很多的答案,很难select一个。 在我的情况下,我select时优先考虑性能,所以我创build了这个jsPerf ,我希望能在这里抛出一些光。

结果简述(越高越好):

  1. 条件声明 :2,826,922
  2. 在Bool对象上切换大小写 :2,825,469
  3. 投向JSON :1,867,774
  4. 转换 :805,322
  5. string原型 :713,637

他们被链接到相关的答案,你可以find更多的信息(利弊)关于每一个; 特别是在评论。

最简单的方法(假设你的string是'真'或'假')是:

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

对于这些types的转换, 始终使用===运算符而不是==运算符!

就像@ Shadow2531说的那样,你不能直接转换它。 如果您的代码将被其他人重用/使用,我还build议您考虑除“true”和“false”之外的stringinput,它们是“真”和“假”。 这是我使用的:

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

将string(“true”,“false”)和布尔值转换为布尔值

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

flag可以在哪里

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

我正在使用这个

 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" 

我认为这个问题是为了实现三个目标:

  • 对于真值和伪值,返回真/假,但是如果多个string值是布尔值而不是string,则会返回真/假。
  • 其次,提供一个弹性接口,使得指定的值不会失败,而是返回一个默认值
  • 第三,尽可能用尽可能less的代码来完成这一切。

使用JSON的问题是,它通过导致Javascript错误失败。 这个解决scheme没有弹性(尽pipe满足1和3):

 JSON.parse("FALSE") // fails 

这个解决scheme不够简洁:

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

我正在为Typecast.js解决这个确切的问题。 这三个目标的最佳解决scheme是:

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

它适用于很多情况,当像{}这样的值传入时不会失败,而且非常简洁。 此外,它返回false作为默认值,而不是未定义或抛出一个错误,这在松散types的Javascript开发中更有用。 布拉沃到其他答案,build议它!

你需要分离(在你的思维中)你select的价值和价值的表示。

在JavaScript逻辑中select一个需要从string标记转换为本地types的点,然后在那里进行比较,最好是只对每个需要转换的值完成一次。 请记住,如果string标记不是脚本所知道的(即,默认为true还是false),那么需要处理什么?

换句话说,是的,你需要依赖string的值。 🙂

我有点晚了,但是我有一个小小的片段来做到这一点,它基本上保持了所有的JScripts truthey / falsey / dirtyness,但是包含"false"作为"false"一个可接受的值。

我更喜欢这种方法,因为它不依赖于第三方来parsing代码(即:eval / JSON.parse),这在我的脑海中是过度的,它足够短,不需要实用程序function,并维护其他truthey / falsey惯例。

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

另一种scheme 的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 }; 

testing用例在节点中运行

 > 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 > 
 function parseBool(value) { if (typeof value === "boolean") return value; if (typeof value === "number") { return value === 1 ? true : value === 0 ? false : undefined; } if (typeof value != "string") return undefined; return value.toLowerCase() === 'true' ? true : false; } 

我写了一个函数来匹配PHP的filter_var,这很好地做到了这一点。 主要内容: https : //gist.github.com/CMCDragonkai/7389368

 /** * Parses mixed type values into booleans. This is the same function as filter_var in PHP using boolean validation * @param {Mixed} value * @param {Boolean} nullOnFailure = false * @return {Boolean|Null} */ var parseBooleanStyle = function(value, nullOnFailure = false){ switch(value){ case true: case 'true': case 1: case '1': case 'on': case 'yes': value = true; break; case false: case 'false': case 0: case '0': case 'off': case 'no': value = false; break; default: if(nullOnFailure){ value = null; }else{ value = false; } break; } return value; }; 

这是从公认的答案中拿出来的,但实际上它有一个非常薄弱的​​地方,我很震惊它是如何得到赞成票的,有关它的问题你必须考虑弦的情况,因为这是大小写敏感的

 var isTrueSet = (myValue.toLowerCase() === 'true'); 
 String(true).toLowerCase() == 'true'; // true String("true").toLowerCase() == 'true'; // true String("True").toLowerCase() == 'true'; // true String("TRUE").toLowerCase() == 'true'; // true String(false).toLowerCase() == 'true'; // false 

如果你不确定input,上面的代码对于布尔值以及任何string都是适用的。

我发现对布尔值使用'1'和一个空值''比'true'或'false'string值更具有可预测性…特别是对于html表单,因为Dom元素中的未初始化/空值将始终如一地评估为假,而其中的任何值评估为真。

例如:

 <input type='button' onclick='this.value = tog(this.value);' /> <script type="text/javascript"> function tog(off) { if(off) { alert('true, toggle to false'); return ''; } else { alert('false, toggle to true'); return '1'; } } </script> 

只是似乎是一个更容易的道路,到目前为止它已经非常一致/容易…也许有人可以确定一种方法来打破这一点?