我可以在JavaScript中将表示布尔值的字符串(例如“true”、“false”)转换为内部类型吗?
我有一个隐藏的HTML表单,它根据用户在列表中的选择进行更新。此表单包含一些表示布尔值的字段,并用内部布尔值动态填充。但是,一旦将该值放入隐藏的输入字段,它就会变成字符串。
一旦字段转换为字符串,我唯一能找到的确定它的布尔值的方法就是依赖于它的字符串表示的文字值。
var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
有没有更好的方法来实现这一点?
我需要一个将任何变量类型转换为布尔值的代码。下面是我想到的:
常量toBoolean=(x)=>{if(类型x===“对象”){for(x中的var i)返回truereturn false}返回(x!==null)&&(x!=undefined)&&!['false',“”,“0”,“no”,“off”].includes(x.toString().toLowerCase())}
让我们测试一下!
常量toBoolean=(x)=>{if(类型x===“对象”){for(x中的var i)返回truereturn false}返回(x!==null)&&(x!=undefined)&&!['false',“”,“0”,“no”,“off”].includes(x.toString().toLowerCase())}//让我们测试一下!let falseValues=[false,'false',0,'','off','no',[],{},null,undefined]let trueValues=[true,'true','true',1,-1,'Anything',['填充数组'],{'具有任意键的对象':null}]falseValues.forEach((value,index)=>console.log(`类型为${typeof value}的False值${index}:${value}->${toBoolean(value)}`))trueValues.forEach((value,index)=>console.log(`类型为${typeof value}的True value${index}:${value}->${toBoolean(value)}`))
如果单词“off”和“no”与您的大小写不符,您可以从数组中删除它们。
许多现有的答案都是相似的,但大多数人忽略了一个事实,即给定的论点也可能是一个对象。
这是我刚刚想到的:
Utils.parseBoolean = function(val){
if (typeof val === 'string' || val instanceof String){
return /true/i.test(val);
} else if (typeof val === 'boolean' || val instanceof Boolean){
return new Boolean(val).valueOf();
} else if (typeof val === 'number' || val instanceof Number){
return new Number(val).valueOf() !== 0;
}
return false;
};
…和它的单元测试
Utils.Tests = function(){
window.console.log('running unit tests');
var booleanTests = [
['true', true],
['false', false],
['True', true],
['False', false],
[, false],
[true, true],
[false, false],
['gibberish', false],
[0, false],
[1, true]
];
for (var i = 0; i < booleanTests.length; i++){
var lhs = Utils.parseBoolean(booleanTests[i][0]);
var rhs = booleanTests[i][1];
var result = lhs === rhs;
if (result){
console.log('Utils.parseBoolean('+booleanTests[i][0]+') === '+booleanTests[i][1]+'\t : \tpass');
} else {
console.log('Utils.parseBoolean('+booleanTests[i][0]+') === '+booleanTests[i][1]+'\t : \tfail');
}
}
};
我对这个问题的看法是,它旨在满足三个目标:
对于truthy和falsy值,返回true/false,但对于多个字符串值,如果它们是布尔值而不是字符串,则返回truthy或falsy。第二,提供一个弹性接口,使指定值以外的值不会失败,而是返回默认值第三,用尽可能少的代码完成所有这些。
使用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开发中更有用。其他的答案都表明了这一点!