我可以将表示布尔值的字符串(例如,'true','false')转换为JavaScript中的内部类型吗?
我有一个隐藏的HTML格式,根据用户在列表中的选择进行更新.此表单包含一些表示布尔值的字段,并使用内部布尔值进行动态填充.但是,一旦将此值放入隐藏的输入字段,它就会变成一个字符串.
我可以找到确定字段的布尔值的唯一方法,一旦将其转换为字符串,就要依赖于字符串表示的字面值.
var myValue = document.myForm.IS_TRUE.value; var isTrueSet = myValue == 'true';
有没有更好的方法来实现这一目标?
var isTrueSet = (myValue == 'true');
您可以通过使用identity运算符(===
)来更严格,当比较变量具有不同类型而不是相等运算符()时,它不会进行任何隐式类型转换==
.
var isTrueSet = (myValue === 'true');
您应该谨慎使用这两种方法来满足您的特定需求:
var myBool = Boolean("false"); // == true var myBool = !!"false"; // == true
任何不是空字符串的字符串都将true
使用它们进行评估.虽然它们是我能想到的关于布尔转换的最干净的方法,但我认为它们不是你想要的.
这个高度支持的遗留答案在技术上是正确的,但只涵盖一个非常具体的场景,当你的字符串值是完全"true"
或"false"
(必须也是小写).
传递给下面这些函数的无效json字符串将引发异常.
原始答案:
怎么样?
JSON.parse("True".toLowerCase());
或者使用jQuery
$.parseJSON("TRUE".toLowerCase());
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); } }
我认为这很普遍:
if (String(a) == "true")
...
它会:
String(true) == "true" //returns true String(false) == "true" //returns false String("true") == "true" //returns true String("false") == "true" //returns false
请记住匹配案例:
var isTrueSet = (myValue.toLowerCase() === 'true');
此外,如果它是表单元素复选框,您还可以检测是否选中了复选框:
var isTrueSet = document.myForm.IS_TRUE.checked;
假设如果选中它,则"set"等于true.这个评估为真/假.
您可以使用正则表达式:
/* * 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类,你可以这样做:
String.prototype.bool = function() { return strToBool(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);
(当然,在旧浏览器中不起作用,而Firefox显示错误,而Opera,Chrome,Safari和IE显示为真.错误720760)
木眼要小心.在使用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; }
测试:
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]));}
使用JSON解析的通用解决方案:
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,''); }
我还创建了小提琴来测试它http://jsfiddle.net/remunda/2GRhG/
我认为@Steven的答案是最好的,并且比传入的值只是一个字符串更能处理更多的情况.我想延长一点,并提供以下内容:
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; } }
false
如果您已经知道所有true
必须考虑的案例,则没有必要涵盖所有案例.您可以将任何内容传递给此方法,该方法可以传递true
值(或者添加其他值,它非常简单),其他所有内容都会被考虑false
你的解决方案很好.
===
在这种情况下使用只是愚蠢,因为该领域value
永远是一个String
.
var falsy = /^(?:f(?:alse)?|no?|0+)$/i; Boolean.parse = function(val) { return !falsy.test(val) && !!val; };
这将返回false
对每falsy值和true
对于不同的是每truthy值'false'
,'f'
,'no'
,'n'
,和'0'
(不区分大小写).
// 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());
Boolean对象没有'parse'方法.Boolean('false')
返回true,这样就行不通了.!!'false'
也返回true
,这样也行不通.
如果你想让string 'true'
返回布尔值true
而字符串'false'
返回布尔值false
,那么最简单的解决方案是使用eval()
.eval('true')
返回true并eval('false')
返回false.请记住使用时的性能影响eval()
.
我使用以下内容:
function parseBool(b) { return !(/^(false|0)$/i).test(b) && !!b; }
此函数执行通常的布尔强制,但字符串"false"(不区分大小写)和"0"除外.
有很多答案,很难选择一个.在我的情况下,我在选择时优先考虑性能,所以我创建了这个jsPerf,我希望可以在这里提出一些建议.
结果简述(越高越好):
条件声明:2,826,922
在Bool对象上切换案例:2,825,469
投射到JSON:1,867,774
!转换:805,322
字符串原型:713,637
它们与相关答案相关联,您可以在其中找到有关每个答案的更多信息(利弊); 特别是在评论中.
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."); } };
你正在寻找的表达方式就是
/^true$/i.test(myValue)
如在
var isTrueSet = /^true$/i.test(myValue);
这将myValue
针对正则表达式进行测试,不区分大小写,并且不会修改原型.
例子:
/^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
这是从已接受的答案中取得的,但实际上它有一个非常弱点,我很震惊它是如何得到那些upvotes,它的问题,你必须考虑字符串的情况,因为这是区分大小写
var isTrueSet = (myValue.toLowerCase() === 'true');
已经有很多答案可供选择.但在某些情况下,以下内容可能很有用.
// 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
将字符串("true","false")和布尔值都转换为布尔值
('' + flag) === "true"
哪里flag
可以
var flag = true var flag = "true" var flag = false var flag = "false"
你为什么不尝试这样的事情
Boolean(JSON.parse((yourString.toString()).toLowerCase()));
当给出一些其他文本而不是真或假时,它将返回错误,无论情况如何,它也将捕获数字
// 0-> false // any other number -> true
此函数可以处理字符串以及布尔值true/false.
function stringToBoolean(val){ var a = { 'true':true, 'false':false }; return a[val]; }
演示如下:
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)));
放下最简单的方法(假设你的字符串是'true'或'false')是:
var z = 'true'; var y = 'false'; var b = (z === 'true'); // will evaluate to true var c = (y === 'true'); // will evaluate to false
对于这些类型的转换,始终使用===运算符而不是==运算符!
就像@ Shadow2531所说,你不能直接转换它.我还建议你考虑字符串输入,除了"真实"和"假",如果你的代码将被其他人重用/使用,那么它们是"真实的"和"虚假的".这是我使用的:
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.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"
您需要(在您的思考中)分离您的选择的值和该值的表示.
在JavaScript逻辑中选择一个点,它们需要从字符串标记转换为本机类型并在那里进行比较,最好只需要为每个需要转换的值完成一次.如果字符串sentinel不是脚本知道的那个(即你默认为true还是false?),请记住要解决需要发生的事情.
换句话说,是的,您需要依赖字符串的值.:-)
我对这个问题的看法是,它旨在满足三个目标:
对于truthy和falsey值返回true/false,但对于多个字符串值,如果它们是布尔值而不是字符串,则返回true/false.
其次,提供弹性接口,使指定值以外的值不会失败,而是返回默认值
第三,用尽可能少的代码完成所有这些.
使用JSON的问题在于它因导致Javascript错误而失败.这个解决方案不具备弹性(尽管它满足1和3):
JSON.parse("FALSE") // fails
这个解决方案不够简洁:
if(value === "TRUE" || value === "yes" || ...) { return true; }
我正在努力为Typecast.js解决这个确切的问题.这三个目标的最佳解决方案是:
return /^true$/i.test(v);
它适用于许多情况,在传递{}之类的值时不会失败,并且非常简洁.它还返回false作为默认值而不是undefined或抛出Error,这在松散类型的Javascript开发中更有用.Bravo到其他建议的答案!
我有点晚了,但我有一个小片段来做到这一点,它本质上维护所有JScripts的truthey/falsey/肮脏 -ness但包括"false"
作为虚假的acceptible值.
我更喜欢这种方法,因为它不依赖于第三方来解析代码(即:eval/JSON.parse),这在我看来是过度的,它足够短,不需要实用功能并维护其他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..
另一种方案. 的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 };
测试用例在节点中运行
> 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; };
我们只需要考虑"false"字符串,因为任何其他字符串(包括"true")已经存在true
.
function b(v){ return v==="false" ? false : !!v; }
测试
b(true) //true b('true') //true b(false) //false b('false') //false
function bool(v){ return v==="false" || v==="null" || v==="NaN" || v==="undefined" || v==="0" ? false : !!v; }
测试
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
神圣的一些这些答案只是疯狂的.我喜欢JS及其无数种方法来涂抹bool.
我不喜欢看到的我的偏好是:
testVar = testVar.toString().match(/^(true|[1-9][0-9]*|[0-9]*[1-9]+|yes)$/i) ? true : false;