我可以将表示布尔值的字符串(例如,'true','false')转换为JavaScript中的内部类型吗?
我有一个隐藏的HTML格式,根据用户在列表中的选择进行更新 . 此表单包含一些表示布尔值的字段,并使用内部布尔值进行动态填充 . 但是,一旦将此值放入隐藏的输入字段,它就会变成一个字符串 .
我可以找到确定字段的布尔值的唯一方法,一旦将其转换为字符串,就要依赖于字符串表示的字面值 .
var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
有没有更好的方法来实现这一目标?
30 回答
您需要(在您的思考中)分离您的选择的值和该值的表示 .
在JavaScript逻辑中选择一个点,它们需要从字符串标记转换为本机类型并在那里进行比较,最好只需要为每个需要转换的值完成一次 . 如果字符串sentinel不是脚本知道的那个(即你默认为true还是false?),请记住要解决需要发生的事情 .
换句话说,是的,您需要依赖字符串的值 . :-)
我认为这很普遍:
if (String(a) == "true")
......它会:
Boolean对象没有'解析'方法 .
Boolean('false')
返回true,因此无效 .!!'false'
也返回true
,因此也不起作用 .如果你想让字符串
'true'
返回布尔true
和字符串'false'
来返回布尔false
,那么最简单的解决方案就是使用eval()
.eval('true')
返回true,eval('false')
返回false . 请记住使用eval()
时的性能影响 .另一种方案 . jsFiddle
测试用例在节点中运行
你为什么不尝试这样的事情
当给出一些其他文本而不是真或假时它将返回错误,无论情况如何,它也将捕获数字
我对这个问题的看法是,它旨在满足三个目标:
对于truthy和falsey值返回true / false,但对于多个字符串值,如果它们是布尔值而不是字符串,则返回true / false .
其次,提供弹性接口,以使指定值以外的值不会失败,而是返回默认值
第三,用尽可能少的代码完成所有这些 .
使用JSON的问题在于它因导致Javascript错误而失败 . 此解决方案不具有弹性(尽管它满足1和3):
这个解决方案不够简洁:
我正致力于为Typecast.js解决这个确切的问题 . 这三个目标的最佳解决方案是:
它适用于许多情况,在传递{}之类的值时不会失败,并且非常简洁 . 它还返回false作为默认值而不是undefined或抛出Error,这在松散类型的Javascript开发中更有用 . Bravo到其他建议的答案!
木眼要小心 . 在使用500个upvotes应用最佳答案后看到后果后,我觉得有义务发布实际有用的内容:
让我们从最短但非常严格的方式开始:
并以适当,更宽容的方式结束:
测试:
我使用以下内容:
此函数执行通常的布尔强制,但字符串“false”(不区分大小写)和“0”除外 .
做:
您可以通过使用标识运算符(
===
)使其更严格,当比较变量具有不同类型而不是相等运算符(==
)时,它不会进行任何隐式类型转换 .不要:
您应该 be cautious about using these two methods 满足您的特定需求:
任何不是空字符串的字符串都将使用它们计算为
true
. 虽然他们不是你想要的 .你正在寻找的表达方式就是
如在
这针对正则表达式测试
myValue
,不区分大小写,并且不修改原型 .例子:
就像@ Shadow2531所说,你不能直接转换它 . 我还建议你考虑除了“真”和“假”之外的字符串输入,如果你的代码将被其他人重用/使用,那么它们是“真实的”和“假的” . 这是我用的:
已经有很多答案可供选择 . 但在某些情况下,以下内容可能很有用 .
当一个示例具有非布尔值时,这可能很有用 .
你的解决方案很好 .
在这种情况下使用
===
只是愚蠢,因为字段的value
将始终是String
.对于每个虚假值,它返回
false
,对于每个真值,返回true
除外'false'
,'f'
,'no'
,'n'
和'0'
(不区分大小写) .我有点晚了,但我有一个小片段来做这件事,它基本上维护了所有的JScripts truthey / falsey / filthy-ness但是包含
"false"
作为false的可接受值 .我更喜欢这种方法,因为它不依赖于第三方来解析代码(即:eval / JSON.parse),这在我看来是过度的,它足够短,不需要实用功能并维护其他truthey / falsey惯例 .
您可以使用正则表达式:
如果你想扩展String类,你可以这样做:
对于那些想要扩展String对象以获得它的人(请参阅注释)但是担心可枚举性并担心与扩展String对象的其他代码发生冲突:
(当然,在旧浏览器中不起作用,而Firefox显示错误,而Opera,Chrome,Safari和IE显示为真.Bug 720760)
我认为@Steven的答案是最好的,并且比传入的值只是一个字符串更能处理更多的情况 . 我想延长一点,并提供以下内容:
如果您已经知道所有必须考虑的所有情况,则没有必要涵盖所有
false
案例 . 您可以将任何内容传递给此方法,该方法可以传递true
值(或添加其他值,它非常简单),其他所有内容都将被视为false
我写了一个函数来匹配PHP的filter_var,这很好地完成了这一点 . 有一个要点:https://gist.github.com/CMCDragonkai/7389368
这是从已接受的答案中取得的,但实际上它有一个非常弱点,我很震惊它是如何得到那些赞成票,它的问题是你必须考虑字符串的情况因为这是区分大小写的
记得要匹配案例:
此外,如果它是表单元素复选框,您还可以检测是否选中了复选框:
假设如果选中它,则“set”等于true . 这评估为真/假 .
将字符串(“true”,“false”)和布尔值都转换为布尔值
哪里
flag
可以有很多答案,很难选择一个 . 在我的情况下,我在选择时优先考虑性能,所以我创建this jsPerf,我希望可以在这里提出一些建议 .
结果简述(越高越好):
Conditional statement:2,826,922
Switch case on Bool object:2,825,469
Casting to JSON:1,867,774
!! conversions:805,322
Prototype of String:713,637
它们与相关答案相关联,您可以在其中找到有关每个答案的更多信息(利弊);特别是在评论中 .
使用JSON解析的通用解决方案:
更新(没有JSON):
我也创造了小提琴来测试它http://jsfiddle.net/remunda/2GRhG/
我正在使用这个
以最简单的方式(假设你的字符串将是'true'或'false')是:
Always 使用===运算符而不是==运算符进行这些类型的转换!
此函数可以处理字符串以及布尔值true / false .
演示如下:
警告
这个高度支持的遗留答案在技术上是正确的,但只涵盖一个非常具体的场景,当你的字符串值完全
"true"
或"false"
(也必须是小写) .传递给 WILL throw an exception 下面的这些函数的无效json字符串 .
Original answer:
怎么样?
或者使用jQuery