我可以将表示布尔值的字符串(例如,'true','false')转换为JavaScript中的内部类型吗?
我有一个隐藏的HTML格式,根据用户在列表中的选择进行更新。此表单包含一些表示布尔值的字段,并使用内部布尔值进行动态填充。但是,一旦将此值放入隐藏的输入字段,它就会变成一个字符串。
我可以找到确定字段的布尔值的唯一方法,一旦将其转换为字符串,就要依赖于字符串表示的字面值。
var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
有没有更好的方法来实现这一目标?
做:
var isTrueSet = (myValue == 'true');
您可以通过使用身份运算符使其更严格(===
),当比较变量具有不同类型而不是相等运算符时,它不会进行任何隐式类型转换(==
)。
var isTrueSet = (myValue === 'true');
别:
你可能应该 使用这两种方法时要小心 满足您的特定需求:
var myBool = Boolean("false"); // == true
var myBool = !!"false"; // == true
任何不是空字符串的字符串都将计算为 true
通过使用它们。虽然它们是我能想到的关于布尔转换的最干净的方法,但我认为它们不是你想要的。
警告
这个高度支持的遗留答案在技术上是正确的,但只涵盖非常具体的情况,当您的字符串值完全正确时 "true"
要么 "false"
(必须小写)。
传递给下面这些函数的无效json字符串 将抛出异常。
原始答案:
怎么样?
JSON.parse("true");
或者使用jQuery
$.parseJSON("true");
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
您可以使用正则表达式:
/*
* 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)
记得要匹配案例:
var isTrueSet = (myValue.toLowerCase() === 'true');
此外,如果它是表单元素复选框,您还可以检测是否选中了复选框:
var isTrueSet = document.myForm.IS_TRUE.checked;
假设如果选中它,则“set”等于true。这评估为真/假。
木眼要小心。
在使用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]));}
你的解决方案很好。
运用 ===
在这种情况下,就像场地一样,这只会是愚蠢的 value
将永远是一个 String
。
使用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/