var myValue=文档.myForm。 IS_TRUE.值; var isTrueSet=myValue=='true';
-
110 “有更好的方法来实现这一点吗?”——当然还有更糟糕的方法:D string=(string==string(string?true:false))? (字符串?true:false):(!字符串?true:fa lse); – 马克·科恩 评论 2015年4月16日10:25 -
14 轻松处理字符串和布尔值: 函数parseBool(val){return val===true||val===“true”} – 威基尼利姆斯 评论 2015年9月10日14:24 -
三 @标记 函数checkBool(x){if(x){return true;}else{return false;}} – 塞比 评论 2016年11月29日15:10 -
4 @塞比:你忘了记录: if(选中Bool(x)!= false){…}其他{…{ – 马克·科恩 评论 2016年11月29日18:21 -
9 !! (parseInt(value)|| value===“true”) – 安德烈·卢卡 评论 2017年2月22日3:58
108个答案
执行:
var isTrueSet=(myValue===“true”);
var isTrueSet=/^true$/i.test(myValue); //或 var isTrueSet=(myValue?.toLowerCase?.()===“true”); //或 var isTrueSet=(字符串(myValue).toLowerCase()===“true”);
不要:
var myBool=布尔值(“false”);//= 真的 var myBool=!! “假”;//== 真的
-
252 -
750 -
@guinaps大多数javascript的严格约定都适用于所有javascript用法,这只会导致代码错综复杂,并且缺乏对javascript原理、理论或用法的理解。 – 六月 评论 2021年12月7日18:35 -
5 -
2
警告
JSON.parse(“True”.toLowerCase());
$.parseJSON(“TRUE”.toLowerCase());
-
81 这方面的问题是,许多潜在值会生成一个解析错误,从而停止JS的执行。 因此,运行JSON.parse(“FALSE”)会轰炸Javascript。 我认为,问题的关键不在于简单地解决这些确切的案例,而在于应对其他案例。 – 比绍普Z 评论 2013年1月26日22:52 -
56 -
4 -
如果我们只看问题的标题,那么所有JSON的事情都不会讨论。 问题是关于一个字符串,而不是关于它的转换会产生什么结果。 当然,使用JSON格式查看“存储”在字符串中的对象时,人们可以问在这种情况下会发生什么。或者,我们也可以使用另一种方法来处理以数字(而不是对象)转换的字符串 设x=0+“-0”//“0-0” 与 设x=0-“-0”//0 但是,我们还是离开了主题:) – 伊芙 评论 2022年4月30日13:03 -
1 @RaviMCA你就不能想出比这个链接更基于事实的东西吗? 你可能是对的(尽管就在昨天我读到了关于 评估 和 JSON.parse格式 以及如何使用后者来避免前者的注入问题),但该页面只不过是描述得很差的传闻。 – 奥斯佩克斯 评论 2022年10月28日15:21
const stringToBoolean=(字符串值)=>{ 开关(stringValue?.到LowerCase()?。 修剪(){ 案例“true”: 案例“是”: 案例“1”: 返回true; 案例“false”: 案例“否”: 案例“0”: 大小写为null: 大小写未定义: 返回false; 违约: return JSON.parse(stringValue); } }
-
56 实际上它可以简化。 1) 无需测试 “正确” , “是” 和 "1" . 2) 小写 不返回 无效的 . 3) 布尔值(字符串) 与相同 字符串== "" 此处。=> switch(string.toLowerCase()){case“false”:case“no”:case0“:case”:return false;default:return true;} – 罗伯特 评论 2013年6月25日5:27 -
8 -
如果输入数字,JSON.parse(stringValue)的结果将是返回类型“number”,而不是“boolean”。 否则可以。 函数的名称是stringToBoolean,而不是stringToNumberOrBooleanOrError。 此外,如果您传递undefined,您会得到一个JSON.parse错误,这(可能)很好,但会让程序员弄不清楚错误在哪里(如果没有stacktrace…)。 – 斯特凡·斯泰格 评论 2022年9月15日9:48 -
我认为问题是关于只转换字符串“true”->true(本机类型)和“false”->false(本机型号)。 但是,如果你想在这里进行真/假转换,你可以添加 !! 到前面: const convertedVar=!!' myString“//为true – 安得烈 评论 2022年10月27日19:28
JSON.parse('true');
让trueResponse=JSON.parse('true'); let falseResponse=JSON.parse('false'); 控制台.log(trueResponse); console.log(falseResponse);
/* *将字符串转换为布尔。 * *此转换将: * *-将“true”、“on”或“1”匹配为true。 *-忽略所有空白填充 *-忽略大小写(case)。 * *“tRue”、“ON”和“1”的计算结果均为tRue。 * */ 函数strToBool { //将只匹配字符串“true”、“1”或“on”中的一个 //不考虑周围的空白。 // regex=/^\s*(true|1| on)\s*$/i 返回regex.test; }
String.prototype.bool=函数(){ return strToBool(this); }; 警报(“true”.bool());
Object.defineProperty(String.prototype,“com_example_bool”{ 获取:函数(){ return(/^(true|1)$/i).test(this); } }); 警报(“true”.com_example_bool);
-
10 如果你担心函数会干扰其他代码,你可以给它加前缀。 如果某些代码仍然损坏,则该代码太脆弱,应该进行修复。 如果添加的函数使对象太重,从而导致其他代码出现性能问题,那么显然您不想这样做。 但是,我并不认为扩展内置对象通常是一个坏主意。 如果是这样的话,它们也不会公开扩展。 – 阴影2531 评论 2011年7月16日19:06 -
42 @DTrejo@Szymon我不同意。 这正是重载原型的目的。 如果你担心它会破坏依赖于…的(糟糕的)代码。。 在中,有一些方法可以在枚举中隐藏属性。 请参见 对象定义属性 . – 设备1 评论 2011年9月12日14:29 -
1 我喜欢regex方法的简单性,它可以检查典型的“true”值。 修改建议:false的逻辑是 0 true是非零的。 因此,我认为最好检查false的反面,即。 返回! (/^(false|0|off|no)$/i).test(this); --还请注意,我包括了“否”。 – 哈戈宾德 评论 2022年2月21日0:03 -
大多数答案实际上并不是很有表现力。 如果你 可以 对您的输入进行任何假设,例如输入永远不会“打开”或“tRUe”,这样就可以避免过度设计您的实现。 延伸 字符串.原型 从来都不好。 – 怀比牌手表 评论 2022年7月5日8:27
var str=“true”; var mybool=JSON.parse(str);
var parseBool=函数(str,strict) { //console.log(str类型); //strict:JSON.parse(str) if(str==null) { if(严格) throw new Error(“参数'str'为null或未定义。”); 返回false; } if(str类型===“boolean”) { 返回(str===true); } if(str==='string'的类型) { 如果(str==“”) 返回false; str=str.replace(/^\s+|\s+$/g,''); if(str.toLowerCase()=='true'||str.toLowerCase)=='是') 返回true; str=str.replace(/,/g,'.'); str=str.replace(/^\s*\-\s*/g,'-'); } //var isNum=字符串匹配(/^[0-9]+$/)!= 无效的; //var isNum=/^\d+$/.test(str); if(!isNaN(str)) return(parseFloat(str)!= 0); 返回false; }
var array_1=新数组(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; var array_2=新数组(null,“”,false,“false”,“false”,“false”,0,“00”,“1/0”,0.0,“0.0”,“0,0”,“100a”,“100”,“0”,0; 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(vari=0;i<array_1.length;++i){console.log(parseBool(array_1[i]));} for(vari=0;i<array_2.length;++i){console.log(parseBool(array_2[i]));}
-
1 -
@earizon:不,它不会“返回随机错误”-它会返回false-但该行为可能会导致应用程序中出现随机错误。 如果值为null/undefined,可以随意抛出错误。 顺便说一句,现在通过重载strict=true来解决。 传递strict=true,您现在将得到一个解析错误。 – 斯特凡·斯泰格 评论 2022年9月15日9:32 -
这取决于被调用函数是否被视为“true的源”,调用函数必须适应其实现,或者被调用函数是一个实用程序/服务,必须符合“某些约定”中调用函数的期望。 通常,基于空值的条件逻辑编码通过调用被调用函数的内部实现来强制知识。 投掷更安全、更简单。 google.com/search? 渠道=fs&q=十亿+美元+错误 (100%同意使用严格模式) – 厄里桑 评论 2022年9月16日11:27
函数isTrue(值){ if(typeof(value)===“字符串”){ value=value.trim().toLowerCase(); } 开关(值){ 案例正确: 案例“true”: 案例1: 案例“1”: 案例“on”: 案例“是”: 返回true; 违约: 返回false; } }
函数getBool(val){ 返回!! JSON.parse(String(val).toLowerCase()); } getBool(“1”)// 真的 getBool(“0”)// 假 getBool(“true”)// 真的 getBool(“false”)// 假 getBool(“真”)// 真的 getBool(“FALSE”)// 假
函数getBool(val){ var数值=+val; 返回! NaN(数字)!! 数字:!! 字符串(val).toLowerCase().replace(!!0,''); }
-
1 “无JSON”版本有一些缺陷:val=“0”; console.log(!!(+val||String(val).toLowerCase().replace(!!0,''))); 生成true – 艾蒂安 评论 2014年7月22日7:42 -
4 getBool(未定义) 将在使用原始JSON版本时崩溃,并将在第二个版本中返回true。 下面是返回false的第三个版本:函数getBool(val){var num;return val!=null&&(!isNaN(num=+val)?!!num:!!String(val).toLowerCase().replace(!!0,''));} – 罗恩·马丁内斯 评论 2014年8月21日13:25
-
21 为什么你认为使用它是愚蠢的 === ? 就性能而言,如果这两种类型都是字符串,则会完全相同。 无论如何,我宁愿使用 === 因为我总是避免使用 == 和 != .理由: stackoverflow.com/questions/359494/… – 玛丽亚诺·德桑兹 评论 2010年8月17日19:01 -
4 自 价值 将始终是 一串 也不 == 也不是 === 都很傻。 两者都是适合这项工作的工具。 只有在类型为 不 相等。 在这种情况下 === 简单地返回 假 虽然 == 在比较之前执行复杂的类型强制算法。 – 罗伯特 评论 2013年6月25日5:49 -
在大多数代码样式中,使用 == 是不好的做法。 当你阅读代码并看到 == ,它会让你停下来,想知道这是一个错误还是一些特殊的技巧。 因此,最好是代码一致。 而且 == 为未来的潜在错误留下了空间。 因为类型可以改变。 – ixpl0接口 评论 2023年2月6日13:04 -
我不能完全肯定我会说==让你认为有错误或诡计。。。 我们所有的C/++编码人员仍然在想,为什么在你可以直接转换的时候会有两个等式操作符(万岁,弱类型语言!down w typescript!!).=) 评论 1月5日20:46
-
1 要了解eval的“错误”(或正确),请查看以下文章 javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval 或在stackoverflow上搜索“Javascript eval恶意软件” – 格拉汉姆麦克 评论 2012年11月22日8:52 -
三 -
-
1 -
4 引用莫西拉文档: 警告:从字符串执行JavaScript存在巨大的安全风险。 当您使用eval()时,糟糕的参与者很容易运行任意代码。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… ! 评论 2021年1月18日15:20
var falsy=/^(?:f(?:alse)| 没有| 0+)$/i; Boolean.parse=函数(val){ 返回! falsy.test(val)&&!! val; };
//False(错误) 布尔.parse(false); 布尔.parse('false'); 布尔.parse('False'); 布尔.parse('FALSE'); 布尔.parse('f'); 布尔.parse('F'); 布尔.parse('no'); Boolean.parse(“否”); 布尔.parse('NO'); 布尔.parse('n'); 布尔.parse('N'); 布尔.parse('0'); 布尔.parse(“”); 布尔.parse(0); 布尔.parse(null); 布尔.parse(未定义); 布尔语法解析(NaN); 布尔.parse(); //真的 布尔.parse(true); 布尔.parse('true'); 布尔值.解析('True'); 布尔值.parse('t'); 布尔.parse('yes'); 布尔.parse('YES'); 布尔.parse('y'); 布尔.parse('1'); 布尔.parse('foo'); 布尔解析({}); 布尔解析(1); 布尔解析(-1); Boolean.parse(new Date());
函数parseBool(b){ 返回! (/^(false |0)$/i)测试(b)&&!! b; }
最简单的解决方案 🙌🏽
带ES6+
const stringToBoolean=(string)=>string===“false”? 假:!! 一串
字符串到布尔值(“”)//假 字符串到布尔值(“false”)//false 字符串到布尔值(“true”)//true stringToBoolean(“你好,我的朋友!”)//true
const betterStringToBoolean=(字符串)=> string=='false'| | string=='undefined'| |字符串==='null'| |串=='0'? 假:!! 一串
betterStringToBoolean(“未定义”)//false betterStringToBoolean('null')//假 betterStringToBoolean(“0”)//假 betterStringToBoolean('false')//错误 betterStringToBoolean(“”)//假 betterStringToBoolean('true')//true betterStringToBoolean(“其他所有内容”)//真
-
-
-
-
1
/^真$/i.test(myValue)
var isTrueSet=/^true$/i.test(myValue);
/^真$/i.test(“真”);// 真的 /^真$/i.test(“真”);// 真的 /^true$/i.test(“true”);// 真的 /^真$/i.test(“true”);// false(注意开头的空格) /^true$/i.test(“不真实”);// false(此处的一些其他解决方案将错误地返回true /^真$/i.test(“假”);// 返回false /^真$/i.test(“xyz”);// 返回false
//你可以指定你认为正确的所有值 var TRUTHY_VALUES=[真,'真',1]; 函数getBoolean(a){ return TRUTHY_VALUES.some(函数(t){ 返回t===a; }); }
getBoolean('aa');// 假 getBoolean(false)// 假 getBoolean('false')// 假 getBoolean('true');// 真的 getBoolean(true);// 真的 获取布尔值(1);// 真的
(“”+标志)===“true”
var标志=true var标志=“true” var标志=假 var标志=“false”
函数字符串到布尔值(val){ 变量a={ “true”:true, “false”:false }; 返回[val]; }
函数字符串到布尔值(val){ 变量a={ “true”:true, “false”:false }; 返回[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(“====~========2===:===>===+===]===_====1===>”); //如果值未定义怎么办? console.log(“undefined result:”+stringToBoolean(undefine)); log(“未定义结果的类型:”+typeof(stringToBoolean(undefined))); console.log(“====~========2===:===>===+===]===_====1===>”); //如果值是不相关的字符串怎么办? console.log(“不相关的字符串结果:”+stringToBoolean(“hello-world”)); log(“不相关字符串结果的类型:”+typeof(stringToBoolean(undefined));
一个衬垫
函数b(v){return v===“false”?false:!!v;}
b(真)//真 b(“真”)//真 b(假)//假 b(“假”)//假
更具说服力的版本
函数bool(v){return v===“false”||v==“null”||v===”NaN“|v==”undefined“||v==”0“?false:!v;}
bool(true)//真 bool(“true”)//真 bool(1)//真 bool(“1”)//真 bool(“你好”)//真 bool(false)//假 bool(“false”)//假 布尔(0)//假 布尔(“0”)//假 bool(null)//错误 bool(“null”)//假 布尔(NaN)//假 bool(“NaN”)//假 bool(未定义)//假 bool(“未定义”)//假 布尔(“”)//假 bool([])//真 bool({})//真 bool(alert)//真 bool(窗口)//true
String.prototype.maybeTool=函数(){ if([“是”,“真”,“1”,“on”].indexOf(this.toLowerCase())!==- 1)返回true; if([“no”,“false”,“0”,“off”].indexOf(this.toLowerCase())!==- 1)返回false; 返回此; } “打开”。可能是Bool()// 返回true; “关闭”。可能是Bool()// 返回false; “我喜欢js”.maybeBool()// 返回“我喜欢js”
-
-
这看起来很优雅。 干得好! 然而,我注意到,在大型JS应用程序中重载基本原型(也需要进行单元测试)可能会导致一些意外行为(即,当您想在重载原型的数组中使用“for”进行迭代时,会得到一些您通常不会想到的属性)。 您已收到警告。;) – 肉桂 评论 2015年3月11日10:30 -
您的一个变量接受布尔函数StringOrElse2Bool(sob){if(typeofsob===“string”){return[“no”,“false”,“0”,“off”].indexOf(sob.toLowerCase())!=-1?false:true;}else{return!!sob} – 波尔图耐克 评论 2015年12月2日11:48
布尔值(JSON.parse((yourString.toString()).toLowerCase()));
//0->假 //任何其他数字->true
var toBoolean=函数(值){ var strValue=字符串(值).toLowerCase(); strValue=((!isNaN(strValue)&&strValue!==' 0') && strValue!==“”&& strValue!==' null(空)'&& strValue!==' 未定义“)?” 1':strValue; return strValue===“true”| | strValue==“1”? 真:假 };
>toBoolean(真) 真的 >toBoolean(假) 假 >toBoolean(未定义) 假 >toBoolean(空) 假 >toBoolean(“真”) 真的 >toBoolean(“真”) 真的 >toBoolean(“False”) 假 >toBoolean(“假”) 假 >toBoolean(“0”) 假 >到布尔值('1') 真的 >到布尔值('100') 真的 >
var z=“真”; var y='false'; var b=(z==='true');// 将评估为true var c=(y===‘真’);// 将评估为false
-
4 -
2 比较javascript中的字符串时,在不使用转换时使用==或===运算符没有区别。 这里您将与字符串进行比较,因此没有类型转换。 请参见 stackoverflow.com/questions/359494/… – 砷265 评论 2012年12月28日15:40