我怎样才能在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 ,我希望能在这里抛出一些光。
结果简述(越高越好):
- 条件声明 :2,826,922
- 在Bool对象上切换大小写 :2,825,469
- 投向JSON :1,867,774
- ! 转换 :805,322
- 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>
只是似乎是一个更容易的道路,到目前为止它已经非常一致/容易…也许有人可以确定一种方法来打破这一点?