3541

我可以在JavaScript中将表示布尔值的字符串(例如“true”、“false”)转换为内部类型吗?

我在HTML中有一个隐藏表单,它根据用户在列表中的选择进行更新。此表单包含一些表示布尔值的字段,并使用内部布尔值动态填充。然而,一旦将该值放入隐藏的输入字段中,它就会变成一个字符串。

一旦字段被转换为字符串,我能找到的确定该字段布尔值的唯一方法就是依赖其字符串表示的文字值。

var myValue=文档.myForm。IS_TRUE.值;var isTrueSet=myValue=='true';

有没有更好的方法来实现这一点?

18
  • 110
    “有更好的方法来实现这一点吗?”——当然还有更糟糕的方法:Dstring=(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个答案108

重置为默认值
4991

执行:

var isTrueSet=(myValue===“true”);

使用标识运算符(===),当比较的变量具有不同类型时,不会进行任何隐式类型转换。

这将设置isTrueSet(真实设置)转换为布尔值真的如果字符串是“true”和布尔值如果它是字符串“false”或根本没有设置。

要使其区分大小写,请尝试:

var isTrueSet=/^true$/i.test(myValue);//或var isTrueSet=(myValue?.toLowerCase?.()===“true”);//或var isTrueSet=(字符串(myValue).toLowerCase()===“true”);

不要:

你可能应该使用这两种方法时要小心满足您的特定需求:

var myBool=布尔值(“false”);//=真的var myBool=!!“假”;//==真的

任何非空字符串的字符串将计算为真的通过使用它们。尽管它们是我能想到的关于布尔转换的最干净的方法,但我认为它们不是你想要的。

9
  • 252
    myValue===“true”;正好等于myValue==“true”;.使用没有好处===结束==在这里。 评论 2010年8月26日11:01
  • 750
    我明白了克罗克福德的建议和使用===!==只要有意义,几乎总是如此。
    – 引导
    评论 2011年2月10日15:37
  • @guinaps大多数javascript的严格约定都适用于所有javascript用法,这只会导致代码错综复杂,并且缺乏对javascript原理、理论或用法的理解。
    – 六月
    评论 2021年12月7日18:35
  • 5
    ===应该使用,因为它还检查正确的类型。此外,它比==. 评论 2021年12月18日11:20
  • 2
    谢谢。当值来自环境变量(字符串JavaScript)并需要将其转换为布尔值时,它会派上用场。 评论 2022年4月12日3:29
862

警告

这一备受推崇的传统答案在技术上是正确的,但仅适用于非常特定的情况,即字符串值是精确的“正确”“假”.

传递给下面这些函数的无效json字符串将引发异常.


原始答案:

怎么样?

JSON.parse(“True”.toLowerCase());

或使用jQuery

$.parseJSON(“TRUE”.toLowerCase());
6
  • 81
    这方面的问题是,许多潜在值会生成一个解析错误,从而停止JS的执行。因此,运行JSON.parse(“FALSE”)会轰炸Javascript。我认为,问题的关键不在于简单地解决这些确切的案例,而在于应对其他案例。 评论 2013年1月26日22:52
  • 56
    说起来很简单JSON.parse(“TRUE”.toLowerCase())以便它能够正确解析。
    – 讨厌
    评论 2013年8月8日15:00
  • 4
    @BishopZ:按照最佳模式编码风格,停止JS执行可能是一个理想的功能:en.wikipedia.org/wiki/Fail-fast
    – 厄里桑
    评论 2021年10月13日10:04
  • 如果我们只看问题的标题,那么所有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
298
const stringToBoolean=(字符串值)=>{开关(stringValue?.到LowerCase()?。修剪(){案例“true”:案例“是”:案例“1”:返回true;案例“false”:案例“否”:案例“0”:大小写为null:大小写未定义:返回false;违约:return JSON.parse(stringValue);}}
4
  • 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
    注意,这将默认为真的-例如:字符串到布尔值('banana')//true
    – 戴维
    评论 2021年7月7日13:25
  • 如果输入数字,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
272

我认为这更普遍:

if(字符串(a).toLowerCase()==“true”)...

上面写着:

String(true)==“true”//返回true字符串(false)==“true”//返回falseString(“true”)==“true“//返回trueString(“false”)==“true”//返回false
1
  • 27
    当您可以接收大写或布尔形式的字符串时,那么字符串(a).toLowerCase()===“true”
    – 保罗亚
    评论 2012年2月29日12:49
171

记住匹配大小写:

var isTrueSet=(myValue.toLowerCase()===“true”);

此外,如果是表单元素复选框,还可以检测该复选框是否选中:

var isTrueSet=文档.myForm。IS_TRUE.已检查;

假设选中,则“设置”为true。它的计算结果为true/false。

1
  • 如果myValue为null或未定义,或为字符串以外的任何类型,则此操作将失败。 评论 2021年11月8日8:55
165

这是我最近遇到的最简单的布尔转换方法。考虑添加它。

JSON.parse('true');

让trueResponse=JSON.parse('true');let falseResponse=JSON.parse('false');控制台.log(trueResponse);console.log(falseResponse);

7
  • 20
    这是可行的,但你必须小心不要给它传递空字符串,否则它会弹出。 评论 2021年8月17日9:39
  • 13
    性感的解决方案,我喜欢! 评论 2021年11月2日17:49
  • 7
    拿走我所有的钱!💵 评论 2022年3月9日17:55
  • 2
    这是一个快速而肮脏的解决方案,用于在内部存储true/false.env(英语)
    – 标记-36
    评论 2022年4月20日15:41
  • 6
    在许多情况下应在try/catch中进行包装 评论 2022年4月25日12:58
140

可以使用正则表达式:

/**将字符串转换为布尔。**此转换将:**-将“true”、“on”或“1”匹配为true。*-忽略所有空白填充*-忽略大小写(case)。**“tRue”、“ON”和“1”的计算结果均为tRue。**/函数strToBool{//将只匹配字符串“true”、“1”或“on”中的一个//不考虑周围的空白。//regex=/^\s*(true|1| on)\s*$/i返回regex.test;}

如果您想扩展String类,可以执行以下操作:

String.prototype.bool=函数(){return strToBool(this);};警报(“true”.bool());

对于那些希望扩展String对象以实现此目的但担心可枚举性并担心与扩展String的其他代码冲突的人(请参阅注释):

Object.defineProperty(String.prototype,“com_example_bool”{获取:函数(){return(/^(true|1)$/i).test(this);}});警报(“true”.com_example_bool);

(当然,在较旧的浏览器中无法工作,Firefox显示为false,而Opera、Chrome、Safari和IE显示为true。错误720760)

4
  • 10
    如果你担心函数会干扰其他代码,你可以给它加前缀。如果某些代码仍然损坏,则该代码太脆弱,应该进行修复。如果添加的函数使对象太重,从而导致其他代码出现性能问题,那么显然您不想这样做。但是,我并不认为扩展内置对象通常是一个坏主意。如果是这样的话,它们也不会公开扩展。 评论 2011年7月16日19:06
  • 42
    @DTrejo@Szymon我不同意。这正是重载原型的目的。如果你担心它会破坏依赖于…的(糟糕的)代码。。在中,有一些方法可以在枚举中隐藏属性。请参见对象定义属性.
    – 设备1
    评论 2011年9月12日14:29
  • 1
    我喜欢regex方法的简单性,它可以检查典型的“true”值。修改建议:false的逻辑是0true是非零的。因此,我认为最好检查false的反面,即。返回!(/^(false|0|off|no)$/i).test(this);--还请注意,我包括了“否”。 评论 2022年2月21日0:03
  • 大多数答案实际上并不是很有表现力。如果你可以对您的输入进行任何假设,例如输入永远不会“打开”或“tRUe”,这样就可以避免过度设计您的实现。延伸字符串.原型从来都不好。 评论 2022年7月5日8:27
85

木眼要小心。在看到以500多张赞成票获得最佳答案后的结果后,我觉得有义务发布一些实际有用的内容:

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

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
    如果(str==null)返回false;每次输入被错误初始化为null时,都会返回随机错误。在大多数情况下,宽容并不是一个可取的特征:
    – 厄里桑
    评论 2021年10月13日10:15
  • @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
56

我认为@Steven的答案是最好的,并且处理了比传入值只是字符串的情况多得多的情况。我想对其进行一些扩展,并提供以下内容:

函数isTrue(值){if(typeof(value)===“字符串”){value=value.trim().toLowerCase();}开关(值){案例正确:案例“true”:案例1:案例“1”:案例“on”:案例“是”:返回true;违约:返回false;}}

没有必要覆盖所有如果你已经知道所有真的你必须说明的案件。您可以将任何可能传递给真的值(或添加其他值,这很简单),其他的一切都会被考虑

0
47

带有JSON解析的通用解决方案:

函数getBool(val){返回!!JSON.parse(String(val).toLowerCase());}getBool(“1”)//真的getBool(“0”)//getBool(“true”)//真的getBool(“false”)//getBool(“真”)//真的getBool(“FALSE”)//

UPDATE(不含JSON):

函数getBool(val){var数值=+val;返回!NaN(数字)!!数字:!!字符串(val).toLowerCase().replace(!!0,'');}

我还创建了小提琴来测试它http://jsfiddle.net/remunda/2GRhG/

2
  • 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
36

你的解决方案很好。

使用===在这种情况下是愚蠢的,因为价值将始终是字符串.

4
  • 21
    为什么你认为使用它是愚蠢的===? 就性能而言,如果这两种类型都是字符串,则会完全相同。无论如何,我宁愿使用===因为我总是避免使用==!=.理由:stackoverflow.com/questions/359494/… 评论 2010年8月17日19:01
  • 4
    价值将始终是一串也不==也不是===都很傻。两者都是适合这项工作的工具。只有在类型为相等。在这种情况下===简单地返回虽然==在比较之前执行复杂的类型强制算法。
    – 罗伯特
    评论 2013年6月25日5:49
  • 在大多数代码样式中,使用==是不好的做法。当你阅读代码并看到==,它会让你停下来,想知道这是一个错误还是一些特殊的技巧。因此,最好是代码一致。而且==为未来的潜在错误留下了空间。因为类型可以改变。 评论 2023年2月6日13:04
  • 我不能完全肯定我会说==让你认为有错误或诡计。。。我们所有的C/++编码人员仍然在想,为什么在你可以直接转换的时候会有两个等式操作符(万岁,弱类型语言!down w typescript!!).=) 评论 1月5日20:46
34

布尔对象没有“parse”方法。布尔值(“false”)返回true,因此这不起作用。!!'假'也返回真的,所以这也行不通。

如果你想要字符串“true”返回布尔值真的和字符串“false”返回布尔值,那么最简单的解决方案是使用评估().eval(“真实”)返回true并且eval(“假”)返回false。

使用时请记住性能和安全影响评估()虽然.

6
  • 1
    要了解eval的“错误”(或正确),请查看以下文章javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval或在stackoverflow上搜索“Javascript eval恶意软件” 评论 2012年11月22日8:52
  • 我同意var isTrueSet=(myValue===“true”);是最好的答案。
    – 塞多安
    评论 2013年1月28日7:35
  • 我喜欢它的简洁。但就基本情况而言,它却大失所望eval(“真实”); 再次证明评估()是邪恶的。
    – 雪人
    评论 2015年8月6日9:41
  • 1
    @10basetom:非常正确。你应该包括.to下壳体()答案是我的观点。我没有强迫任何事情。大写真的是一个足够常见的值,可以由许多UI小部件返回。
    – 雪人
    评论 2015年8月7日6:30
  • 4
    引用莫西拉文档:警告:从字符串执行JavaScript存在巨大的安全风险。当您使用eval()时,糟糕的参与者很容易运行任意代码。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…! 评论 2021年1月18日15:20
33
var falsy=/^(?:f(?:alse)|没有|0+)$/i;Boolean.parse=函数(val){返回!falsy.test(val)&&!!val;};

这将返回对于每个错误的值和真的除了“false”,“f”,“否”,“n”、和'0'(区分大小写)。

//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());
1
  • 2
    我为那些不滚动而只选择第一个答案的人感到难过。这个答案是健壮的、可重用的和简洁的。我把它缩短成一行:布尔.parse?=(val)=>{return!/^(?:f(?:alse)?|no?|0+)$/i.test(val,测试)&&!!val}; 评论 2023年4月7日0:29
24

答案很多,很难选一个。在我的案例中,我在选择时优先考虑性能,因此我创建这个jsPerf我希望能给大家带来一些启示。

结果简述(越高越好):

  1. 有条件语句: 2,826,922
  2. Bool对象上的切换大小写: 2,825,469
  3. 转换为JSON: 1,867,774
  4. !! 转换: 805,322
  5. 字符串原型: 713,637

它们与相关答案相关联,您可以在其中找到关于每个答案的更多信息(优点和缺点);特别是在评论中。

1
  • 尝试查看jsPerf测试时“出现问题”
    – 斑点马
    评论 2018年2月2日17:16
21

这是从已被接受的答案中提取的,但实际上它有一个非常薄弱的点,我很震惊它是如何计算赞成票的,它的问题是你必须考虑字符串的大小写,因为这是区分大小写的

var isTrueSet=(myValue.toLowerCase()===“true”);
1
  • 更不用说了.至下壳体如果我的价值等于无效的未定义 评论 2020年6月14日9:46
19

我使用以下内容:

函数parseBool(b){返回!(/^(false |0)$/i)测试(b)&&!!b;}

此函数执行常规的布尔强制,但字符串“false”(不区分大小写)和“0”除外。

0
19

最简单的解决方案🙌🏽

带ES6+

使用逻辑NOT两次[ !! ]以转换字符串

只需粘贴此表达式。。。

const stringToBoolean=(string)=>string===“false”?假:!!一串

把你的绳子传给它!

字符串到布尔值(“”)//假字符串到布尔值(“false”)//false字符串到布尔值(“true”)//truestringToBoolean(“你好,我的朋友!”)//true
🤙🏽 奖金!🤙🏽
const betterStringToBoolean=(字符串)=>string=='false'| | string=='undefined'| |字符串==='null'| |串=='0'?假:!!一串

您可以随意包含其他字符串,以轻松扩展此表达式的用法…:

betterStringToBoolean(“未定义”)//falsebetterStringToBoolean('null')//假betterStringToBoolean(“0”)//假betterStringToBoolean('false')//错误betterStringToBoolean(“”)//假betterStringToBoolean('true')//truebetterStringToBoolean(“其他所有内容”)//真
4
  • 怎么样'1'? 是否应转换为真的? 我认为应该是真的没有?但使用您的答案,它会返回 评论 2021年6月2日20:11
  • 我猜你做错了,兄弟。。。我刚刚测试了代码,如果你输入' 1 '回报总是真的.不知道你是怎么做到的但我想你一定是把事情搞砸了 评论 2021年6月2日22:15
  • 啊,对不起!糟糕的是,我在测试第一个函数。感谢您澄清这一点。 评论 2021年6月3日15:38
  • 1
    你的例子都是字符串。例如“null”不是实际的无效的,它是一个包含字符的字符串无效的在其中。 评论 2023年2月16日7:20
18

你要找的表达式很简单

/^真$/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
1
  • 这很整洁。 评论 2023年2月16日7:18
17

你可以使用JSON.parse格式如下:

var trueOrFalse=“真”;结果=JSON.parse(trueOrFalse.toLowerCase());if(结果==真)alert(“这是真的”);其他警报(“这是错误的”);

在这种情况下.至下壳体很重要

1
  • 但不保证返回布尔值。 评论 2020年7月3日16:26
14

已经有这么多可用的答案。但在某些情况下,以下内容可能很有用。

//你可以指定你认为正确的所有值var TRUTHY_VALUES=[真,'真',1];函数getBoolean(a){return TRUTHY_VALUES.some(函数(t){返回t===a;});}

这在使用非布尔值的示例时非常有用。

getBoolean('aa');//getBoolean(false)//getBoolean('false')//getBoolean('true');//真的getBoolean(true);//真的获取布尔值(1);//真的
0
14

我很惊讶包括未建议

让bool=“false”bool=![“false”,“0”,0].includes(bool)

您可以修改检查是否正确或包括更多条件(例如。无效的,'').

2
  • 1
    嗯,这太完美了 评论 2021年12月28日8:13
  • 我将此方法用于分析URL参数并将不带值的参数作为空字符串包含的框架,如:example.com?使用特殊功能最终成为{useSpecialFeature:“”} 评论 2022年1月22日0:47
14
Boolean.parse=函数(str){开关(str.toLowerCase()){案例“true”:返回true;案例“false”:返回false;违约:throw new Error(“Boolean.parse:无法将字符串转换为Boolean.”);}};
2
  • 2
    您可以使用true.toString()而不是“true”来更清晰:-)
    – 蒂尔达
    评论 2011年2月22日11:03
  • 不要更改全局变量,尝试将更改隔离,可能会创建一个新的函数parseBoolean相反 评论 2018年8月27日17:29
13

将字符串(“true”、“false”)和布尔值转换为布尔值

(“”+标志)===“true”

在哪里?旗帜可以是

var标志=truevar标志=“true”var标志=假var标志=“false”
12

此函数可以处理字符串以及布尔值true/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));

0
11

一个衬垫

我们只需要说明“false”字符串,因为任何其他字符串(包括“true”)已经真的.

函数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
1
  • 使用的任何具体原因!!v(v)而不是使用真的直接? 评论 2021年2月24日8:16
10

我在用这个

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”
  • 这很好,但只适用于String类型。假设这需要由一个可能“正确”真的。如果是第二个,这将不起作用。有可能使文档.原型随时随地使用它? 评论 2015年2月9日18:40
  • 这看起来很优雅。干得好!然而,我注意到,在大型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
10

你为什么不试试这个

布尔值(JSON.parse((yourString.toString()).toLowerCase()));

无论大小写,当给出其他文本而不是true或false时,它都会返回错误,并且它还将捕获数字作为

//0->假//任何其他数字->true
9

你需要(在你的思维中)把你的选择的价值和这个价值的表现分开。

在JavaScript逻辑中选择一个需要从字符串哨兵转换为本机类型的点,并在那里进行比较,最好是对每个需要转换的值只进行一次比较。记住,如果字符串sentinel不是脚本知道的字符串,那么需要解决什么问题(例如,您是默认为true还是false?)

换句话说,是的,您需要依赖字符串的值。:-)

9

另一种解决方案。jsFiddle公司

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')真的>
8

最简单的方法是(假设字符串为“true”或“false”):

var z=“真”;var y='false';var b=(z==='true');//将评估为truevar c=(y===‘真’);//将评估为false

总是对于这些类型的转换,请使用===运算符而不是==运算符!

2
  • 4
    你说的是什么转换 评论 2012年5月18日0:41
  • 2
    比较javascript中的字符串时,在不使用转换时使用==或===运算符没有区别。这里您将与字符串进行比较,因此没有类型转换。请参见stackoverflow.com/questions/359494/…
    – 砷265
    评论 2012年12月28日15:40

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.