JavaScript:parsing一个string布尔值?

JavaScript有parseInt()parseFloat() ,但在全球范围内没有parseBoolparseBoolean方法,据我所知。

我需要一个方法,接受像“真”或“假”值的string,并返回一个JavaScript Boolean

这是我的实现:

 function parseBool(value) { return (typeof value === "undefined") ? false : // trim using jQuery.trim()'s source value.replace(/^\s+|\s+$/g, "").toLowerCase() === "true"; } 

这是一个很好的function吗? 请给我你的反馈。

谢谢!

如果是的话,我会倾向于做一个三元组。

 var bool_value = value == "true" ? true : false 

编辑:更快将是简单地避免使用一个逻辑语句,而只是使用expression式本身:

 var bool_value = value == 'true'; 

这是有效的,因为value == 'true'是根据valuevariables是否是一个'true'string来计算'true' 。 如果是,则整个expression式变为true ,否则变为false ,然后在评估之后将该结果分配给bool_value

你可以使用JSON.parse:

 JSON.parse("true"); //returns boolean true 

这取决于你希望function如何工作。

如果你想要做的只是在string中testing“true”这个单词,并且定义任何没有为false的string(或非string),最简单的方法可能是这样的:

 function parseBoolean(str) { return /true/i.test(str); } 

如果你想保证整个string是真的话,你可以这样做:

 function parseBoolean(str) { return /^true$/i.test(str); } 

您可以尝试以下方法:

 function parseBool(val) { if ((typeof val === 'string' && (val.toLowerCase() === 'true' || val.toLowerCase() === 'yes')) || val === 1) return true; else if ((typeof val === 'string' && (val.toLowerCase() === 'false' || val.toLowerCase() === 'no')) || val === 0) return false; return null; } 

如果它是一个有效值,则返回等价的bool值,否则返回null。

我个人认为这不好,你的函数将“无效”值隐藏为false ,根据你的使用情况,它不会返回"1"

另一个问题可能是它禁止任何不是string的东西。

我会用这样的东西:

 function parseBool(value) { if (typeof value === "string") { value = value.replace(/^\s+|\s+$/g, "").toLowerCase(); if (value === "true" || value === "false") return value === "true"; } return; // returns undefined } 

并根据用例扩展它来区分"0""1"

(也许有一种方法只能与"true"比较一次,但我现在无法想到)。

为什么不保持简单?

 var parseBool = function(str) { if (typeof str === 'string' && str.toLowerCase() == 'true') return true; return (parseInt(str) > 0); } 

木眼要小心。 看完所有的代码后,我觉得有义务发布:

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

 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') { if(str === true) return true; return false; } 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]));} 

你可以添加这个代码:

 function parseBool(str) { if (str.length == null) { return str == 1 ? true : false; } else { return str == "true" ? true : false; } } 

像这样工作:

 parseBool(1) //true parseBool(0) //false parseBool("true") //true parseBool("false") //false 

你可以使用JSON.parse或jQuery.parseJSON,看看它是否使用这样的东西返回true:

 function test (input) { try { return !!$.parseJSON(input.toLowerCase()); } catch (e) { } } 

我喜欢RoToRa提供的解决scheme(尝试parsing给定的值,如果它有任何布尔的含义,否则 – 不)。 不过,我想提供小的修改,使其工作或多或less像在C#中的Boolean.TryParse ,它支持params。 在JavaScript中,可以通过以下方式实现:

 var BoolHelpers = { tryParse: function (value) { if (typeof value == 'boolean' || value instanceof Boolean) return value; if (typeof value == 'string' || value instanceof String) { value = value.trim().toLowerCase(); if (value === 'true' || value === 'false') return value === 'true'; } return { error: true, msg: 'Parsing error. Given value has no boolean meaning.' } } } 

用法:

 var result = BoolHelpers.tryParse("false"); if (result.error) alert(result.msg); 

stringjs有一个toBoolean()方法:

http://stringjs.com/#methods/toboolean-tobool

 S('true').toBoolean() //true S('false').toBoolean() //false S('hello').toBoolean() //false S(true).toBoolean() //true S('on').toBoolean() //true S('yes').toBoolean() //true S('TRUE').toBoolean() //true S('TrUe').toBoolean() //true S('YES').toBoolean() //true S('ON').toBoolean() //true S('').toBoolean() //false S(undefined).toBoolean() //false S('undefined').toBoolean() //false S(null).toBoolean() //false S(false).toBoolean() //false S({}).toBoolean() //false S(1).toBoolean() //true S(-1).toBoolean() //false S(0).toBoolean() //false 

我无耻地将Apache Common的toBoolean转换为JavaScript:

JSFiddle: https ://jsfiddle.net/m2efvxLm/1/

码:

 function toBoolean(str) { if (str == "true") { return true; } if (!str) { return false; } switch (str.length) { case 1: { var ch0 = str.charAt(0); if (ch0 == 'y' || ch0 == 'Y' || ch0 == 't' || ch0 == 'T' || ch0 == '1') { return true; } if (ch0 == 'n' || ch0 == 'N' || ch0 == 'f' || ch0 == 'F' || ch0 == '0') { return false; } break; } case 2: { var ch0 = str.charAt(0); var ch1 = str.charAt(1); if ((ch0 == 'o' || ch0 == 'O') && (ch1 == 'n' || ch1 == 'N') ) { return true; } if ((ch0 == 'n' || ch0 == 'N') && (ch1 == 'o' || ch1 == 'O') ) { return false; } break; } case 3: { var ch0 = str.charAt(0); var ch1 = str.charAt(1); var ch2 = str.charAt(2); if ((ch0 == 'y' || ch0 == 'Y') && (ch1 == 'e' || ch1 == 'E') && (ch2 == 's' || ch2 == 'S') ) { return true; } if ((ch0 == 'o' || ch0 == 'O') && (ch1 == 'f' || ch1 == 'F') && (ch2 == 'f' || ch2 == 'F') ) { return false; } break; } case 4: { var ch0 = str.charAt(0); var ch1 = str.charAt(1); var ch2 = str.charAt(2); var ch3 = str.charAt(3); if ((ch0 == 't' || ch0 == 'T') && (ch1 == 'r' || ch1 == 'R') && (ch2 == 'u' || ch2 == 'U') && (ch3 == 'e' || ch3 == 'E') ) { return true; } break; } case 5: { var ch0 = str.charAt(0); var ch1 = str.charAt(1); var ch2 = str.charAt(2); var ch3 = str.charAt(3); var ch4 = str.charAt(4); if ((ch0 == 'f' || ch0 == 'F') && (ch1 == 'a' || ch1 == 'A') && (ch2 == 'l' || ch2 == 'L') && (ch3 == 's' || ch3 == 'S') && (ch4 == 'e' || ch4 == 'E') ) { return false; } break; } default: break; } return false; } console.log(toBoolean("yEs")); // true console.log(toBoolean("yES")); // true console.log(toBoolean("no")); // false console.log(toBoolean("NO")); // false console.log(toBoolean("on")); // true console.log(toBoolean("oFf")); // false 
 Inspect this element, and view the console output. 

足够使用eval javascript函数将string转换为布尔值

 eval('true') eval('false')