我可以将表示布尔值的字符串(例如'true','false')转换为JavaScript中的内在类型吗?
我在HTML中有一个隐藏的表单,根据用户在列表中的选择进行更新。此表单包含一些表示布尔值的字段,并使用内部布尔值进行动态填充。但是,一旦将此值放入隐藏的输入字段,它就会变成一个字符串。
我可以找到确定字段的布尔值的唯一方法,一旦将其转换为字符串,就要依赖于字符串表示的字面值。
var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';
有没有更好的方法来实现这一目标?
答案 0 :(得分:2898)
var isTrueSet = (myValue == 'true');
您可以使用标识运算符(===
)使其更严格,当比较变量具有不同类型而不是等于运算符(==
)时,它不会进行任何隐式类型转换
var isTrueSet = (myValue === 'true');
您应该谨慎使用这两种方法以满足您的特定需求:
var myBool = Boolean("false"); // == true
var myBool = !!"false"; // == true
任何不是空字符串的字符串都将使用它们计算为true
。虽然它们是我能想到的关于布尔转换的最干净的方法,但我认为它们不是你想要的。
答案 1 :(得分:603)
这个高度支持的遗留答案在技术上是正确的,但只涵盖了非常具体的情况,当您的字符串值完全"true"
或"false"
时(必须也是小写)。
传递到下面的这些函数的无效json字符串将引发异常。
原始回答:
怎么样?
JSON.parse("true");
或使用jQuery
$.parseJSON("true");
答案 2 :(得分:203)
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);
}
}
答案 3 :(得分:147)
我认为这很普遍:
if (String(a) == "true")
...
它是:
String(true) == "true" //returns true
String(false) == "true" //returns false
String("true") == "true" //returns true
String("false") == "true" //returns false
答案 4 :(得分:113)
请记住匹配案例:
var isTrueSet = (myValue.toLowerCase() === 'true');
此外,如果它是表单元素复选框,您还可以检测是否选中了复选框:
var isTrueSet = document.myForm.IS_TRUE.checked;
假设如果选中它,则“set”等于true。这评估为真/假。
答案 5 :(得分:109)
您可以使用正则表达式:
/*
* 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);
(当然,在旧的浏览器中不起作用,而且当Opera,Chrome,Safari和IE显示为真时,Firefox显示为假。Bug 720760)
答案 6 :(得分:44)
让我们从最短但非常严格的方式开始:
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]));}
答案 7 :(得分:32)
使用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/
答案 8 :(得分:29)
你的解决方案很好。
在这种情况下使用===
只会很愚蠢,因为字段的value
始终是String
。
答案 9 :(得分:28)
我认为@Steven的回答是最好的,并且比传入的值只是一个字符串的情况要多得多。我想延长一点,并提供以下内容:
function isTrue(value){
if (typeof(value) === 'string'){
value = value.trim().toLowerCase();
}
switch(value){
case true:
case "true":
case 1:
case "1":
case "on":
case "yes":
return true;
default:
return false;
}
}
如果您已经了解了必须考虑的所有false
个案例,则无需涵盖所有true
个案例。您可以将任何内容传递给此方法,该方法可以传递true
值(或添加其他值,这非常简单),其他所有内容都将被视为false
答案 10 :(得分:22)
var falsy = /^(?:f(?:alse)?|no?|0+)$/i;
Boolean.parse = function(val) {
return !falsy.test(val) && !!val;
};
除了false
,true
,'false'
,'f'
之外,每个真值都返回'no'
'n'
,'0'
,和// False
Boolean.parse(false);
Boolean.parse('false');
Boolean.parse('False');
Boolean.parse('FALSE');
Boolean.parse('f');
Boolean.parse('F');
Boolean.parse('no');
Boolean.parse('No');
Boolean.parse('NO');
Boolean.parse('n');
Boolean.parse('N');
Boolean.parse('0');
Boolean.parse('');
Boolean.parse(0);
Boolean.parse(null);
Boolean.parse(undefined);
Boolean.parse(NaN);
Boolean.parse();
//True
Boolean.parse(true);
Boolean.parse('true');
Boolean.parse('True');
Boolean.parse('t');
Boolean.parse('yes');
Boolean.parse('YES');
Boolean.parse('y');
Boolean.parse('1');
Boolean.parse('foo');
Boolean.parse({});
Boolean.parse(1);
Boolean.parse(-1);
Boolean.parse(new Date());
(不区分大小写)。
{{1}}
答案 11 :(得分:17)
Boolean对象没有'parse'方法。 Boolean('false')
返回true,因此无效。 !!'false'
也会返回true
,因此也无效。
如果希望字符串'true'
返回布尔值true
而字符串'false'
返回布尔值false
,那么最简单的解决方案是使用eval()
。 eval('true')
返回true,eval('false')
返回false。请记住使用eval()
时的性能影响。
答案 12 :(得分:15)
答案很多,选择一个很难。在我的情况下,我在选择时优先考虑性能,所以我创建了this jsPerf,我希望可以在这里提出一些建议。
结果简介(越高越好):
它们与相关答案相关联,您可以在其中找到有关每个答案的更多信息(利弊);特别是在评论中。
答案 13 :(得分:15)
我使用以下内容:
function parseBool(b) {
return !(/^(false|0)$/i).test(b) && !!b;
}
此函数执行通常的布尔强制,但字符串“false”(不区分大小写)和“0”除外。
答案 14 :(得分:13)
Boolean.parse = function (str) {
switch (str.toLowerCase ()) {
case "true":
return true;
case "false":
return false;
default:
throw new Error ("Boolean.parse: Cannot convert string to boolean.");
}
};
答案 15 :(得分:11)
已经有很多答案可供选择。但是在某些情况下,以下内容可能很有用。
// One can specify all values against which you consider truthy
var TRUTHY_VALUES = [true, 'true', 1];
function getBoolean(a) {
return TRUTHY_VALUES.some(function(t) {
return t === a;
});
}
如果一个示例带有非布尔值,这可能很有用。
getBoolean('aa'); // false
getBoolean(false); //false
getBoolean('false'); //false
getBoolean('true'); // true
getBoolean(true); // true
getBoolean(1); // true
答案 16 :(得分:11)
您正在寻找的表达式是
/^true$/i.test(myValue)
,如
var isTrueSet = /^true$/i.test(myValue);
这针对正则表达式测试myValue
,不区分大小写,并且不修改原型。
示例:
/^true$/i.test("true"); // true
/^true$/i.test("TRUE"); // true
/^true$/i.test("tRuE"); // true
/^true$/i.test(" tRuE"); // false (notice the space at the beginning)
/^true$/i.test("untrue"); // false (some other solutions here will incorrectly return true
/^true$/i.test("false");// returns false
/^true$/i.test("xyz"); // returns false
答案 17 :(得分:10)
这是从已接受的答案中取得的,但实际上它有一个非常弱点,我很震惊它是如何得到那些赞成票,它的问题是你必须考虑字符串的情况,因为这是区分大小写
var isTrueSet = (myValue.toLowerCase() === 'true');
答案 18 :(得分:9)
将字符串(“true”,“false”)和布尔值转换为布尔值
('' + flag) === "true"
flag
可以
var flag = true
var flag = "true"
var flag = false
var flag = "false"
答案 19 :(得分:9)
你为什么不尝试这样的事呢
Boolean(JSON.parse((yourString.toString()).toLowerCase()));
当给出一些其他文本而不是真或假时,它将返回错误,无论情况如何,它也会将数字捕获为
// 0-> false
// any other number -> true
答案 20 :(得分:8)
最简单的方法(假设你的字符串是'true'或'false')是:
var z = 'true';
var y = 'false';
var b = (z === 'true'); // will evaluate to true
var c = (y === 'true'); // will evaluate to false
始终 使用===运算符代替==运算符进行这些类型的转换!
答案 21 :(得分:8)
就像@ Shadow2531所说,你不能直接转换它。我还建议你考虑字符串输入除了&#34; true&#34;和&#34;假&#34;这是&#39; truthy&#39;并且&#39; falsey&#39;如果您的代码将被其他人重用/使用。这就是我使用的:
function parseBoolean(string) {
switch (String(string).toLowerCase()) {
case "true":
case "1":
case "yes":
case "y":
return true;
case "false":
case "0":
case "no":
case "n":
return false;
default:
//you could throw an error, but 'undefined' seems a more logical reply
return undefined;
}
}
答案 22 :(得分:8)
我正在使用这个
String.prototype.maybeBool = function(){
if ( ["yes", "true", "1", "on"].indexOf( this.toLowerCase() ) !== -1 ) return true;
if ( ["no", "false", "0", "off"].indexOf( this.toLowerCase() ) !== -1 ) return false;
return this;
}
"on".maybeBool(); //returns true;
"off".maybeBool(); //returns false;
"I like js".maybeBool(); //returns "I like js"
答案 23 :(得分:8)
此函数可以处理字符串以及布尔值true / false。
function stringToBoolean(val){
var a = {
'true':true,
'false':false
};
return a[val];
}
以下演示:
function stringToBoolean(val) {
var a = {
'true': true,
'false': false
};
return a[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("=============================================");
// what if value was undefined?
console.log("undefined result: " + stringToBoolean(undefined));
console.log("type of undefined result: " + typeof(stringToBoolean(undefined)));
console.log("=============================================");
// what if value was an unrelated string?
console.log("unrelated string result: " + stringToBoolean("hello world"));
console.log("type of unrelated string result: " + typeof(stringToBoolean(undefined)));
&#13;
答案 24 :(得分:7)
另一种解决方案。 jsFiddle
var toBoolean = function(value) {
var strValue = String(value).toLowerCase();
strValue = ((!isNaN(strValue) && strValue !== '0') &&
strValue !== '' &&
strValue !== 'null' &&
strValue !== 'undefined') ? '1' : strValue;
return strValue === 'true' || strValue === '1' ? true : false
};
测试用例在节点
中运行> toBoolean(true)
true
> toBoolean(false)
false
> toBoolean(undefined)
false
> toBoolean(null)
false
> toBoolean('true')
true
> toBoolean('True')
true
> toBoolean('False')
false
> toBoolean('false')
false
> toBoolean('0')
false
> toBoolean('1')
true
> toBoolean('100')
true
>
答案 25 :(得分:7)
使用逻辑非两次[ !! ] 得到字符串转换
只需粘贴此表达式...
const stringToBoolean = (string) => string === 'false' ? false : !!string
并将您的字符串传递给它!
stringToBoolean('') // false
stringToBoolean('false') // false
stringToBoolean('true') // true
stringToBoolean('hello my friend!') // true
?? 奖金! ??
const betterStringToBoolean = (string) =>
string === 'false' || string === 'undefined' || string === 'null' || string === '0' ?
false : !!string
您可以随意包含其他字符串以轻松扩展此表达式的用法...:
betterStringToBoolean('undefined') // false
betterStringToBoolean('null') // false
betterStringToBoolean('0') // false
betterStringToBoolean('false') // false
betterStringToBoolean('') // false
betterStringToBoolean('true') // true
betterStringToBoolean('anything else') // true
答案 26 :(得分:7)
我有点迟了,但是我有一个小片段可以做到这一点,它基本上维护了所有的JScripts truthey / falsey / 肮脏的 -ness但包含"false"
作为可加入的虚假的价值。
我更喜欢这种方法,因为它不依赖第三方来解析代码(即:eval / JSON.parse),这在我看来太过分了,它足够短,不需要实用程序功能和维护其他truthey / falsey惯例。
var value = "false";
var result = (value == "false") != Boolean(value);
// value = "true" => result = true
// value = "false" => result = false
// value = true => result = true
// value = false => result = false
// value = null => result = false
// value = [] => result = true
// etc..
答案 27 :(得分:7)
我对这个问题的看法是,它旨在满足三个目标:
使用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开发中更有用。勇敢地回答其他建议的答案!
答案 28 :(得分:6)
您需要(在您的思考中)分离您的选择的值和该值的表示。
在JavaScript逻辑中选择一个点,它们需要从字符串标记转换为本机类型并在那里进行比较,最好只需要为每个需要转换的值完成一次。如果字符串sentinel不是脚本知道的那个(即你默认为true还是false?),请记住要解决需要发生的事情。
换句话说,是的,你需要依赖字符串的值。 : - )
答案 29 :(得分:5)
圣洁的上帝这些答案中的一些只是狂野的。我喜欢JS及其无数种方法来涂抹布尔。
我不喜欢看到我的偏见是:
testVar = testVar.toString().match(/^(true|[1-9][0-9]*|[0-9]*[1-9]+|yes)$/i) ? true : false;
答案 30 :(得分:5)
我们只需要考虑“false”字符串,因为任何其他字符串(包括“true”)已经是true
。
function b(v){ return v==="false" ? false : !!v; }
<强>测试强>
b(true) //true
b('true') //true
b(false) //false
b('false') //false
function bool(v){ return v==="false" || v==="null" || v==="NaN" || v==="undefined" || v==="0" ? false : !!v; }
<强>测试强>
bool(true) //true
bool("true") //true
bool(1) //true
bool("1") //true
bool("hello") //true
bool(false) //false
bool("false") //false
bool(0) //false
bool("0") //false
bool(null) //false
bool("null") //false
bool(NaN) //false
bool("NaN") //false
bool(undefined) //false
bool("undefined") //false
bool("") //false
bool([]) //true
bool({}) //true
bool(alert) //true
bool(window) //true
答案 31 :(得分:5)
String(true).toLowerCase() == 'true'; // true
String("true").toLowerCase() == 'true'; // true
String("True").toLowerCase() == 'true'; // true
String("TRUE").toLowerCase() == 'true'; // true
String(false).toLowerCase() == 'true'; // false
如果您不确定输入,则上述适用于布尔值以及任何字符串。
答案 32 :(得分:5)
最简单的方法是
a = 'True';
a = !!a && ['1', 'true', 1, true].indexOf(a.toLowerCase()) > -1;
答案 33 :(得分:5)
我写了一个函数来匹配PHP的filter_var,这很好地完成了这个。主旨有:https://gist.github.com/CMCDragonkai/7389368
/**
* Parses mixed type values into booleans. This is the same function as filter_var in PHP using boolean validation
* @param {Mixed} value
* @param {Boolean} nullOnFailure = false
* @return {Boolean|Null}
*/
var parseBooleanStyle = function(value, nullOnFailure = false){
switch(value){
case true:
case 'true':
case 1:
case '1':
case 'on':
case 'yes':
value = true;
break;
case false:
case 'false':
case 0:
case '0':
case 'off':
case 'no':
value = false;
break;
default:
if(nullOnFailure){
value = null;
}else{
value = false;
}
break;
}
return value;
};
答案 34 :(得分:5)
function parseBool(value) {
if (typeof value === "boolean") return value;
if (typeof value === "number") {
return value === 1 ? true : value === 0 ? false : undefined;
}
if (typeof value != "string") return undefined;
return value.toLowerCase() === 'true' ? true : false;
}
答案 35 :(得分:4)
我发现对布尔值使用'1'和空值''比'true'或'false'字符串值更可预测...特别是html格式,因为Dom元素中未初始化/空值将持续评估为false,而中的任何值评估为true。
例如:
<input type='button' onclick='this.value = tog(this.value);' />
<script type="text/javascript">
function tog(off) {
if(off) {
alert('true, toggle to false');
return '';
} else {
alert('false, toggle to true');
return '1';
}
}
</script>
看起来似乎是一条更轻松的道路,到目前为止它已经非常一致/容易......也许有人可以决定打破这种方式吗?
答案 36 :(得分:4)
@ guinaps&GT;任何不是空字符串的字符串都将通过使用它们来评估为真。
如何使用String.match()方法
var str="true";
var boolStr=Boolean(str.match(/^true$/i));
单独这将不会得到1/0或是/否,但是它将捕获TRUE / true,并且对于碰巧具有“true”作为子串的任何字符串,它将返回false。 / p>
修改强>
下面是一个处理true / false的函数,1/0,是/否(不区分大小写)
function stringToBool(str) {
var bool;
if (str.match(/^(true|1|yes)$/i) !== null) {
bool = true;
} else if (str.match(/^(false|0|no)*$/i) !== null) {
bool = false;
} else {
bool = null;
if (console) console.log('"' + str + '" is not a boolean value');
}
return bool;
}
stringToBool('1'); // true
stringToBool('No'); // false
stringToBool('falsey'); // null ("falsey" is not a boolean value.)
stringToBool(''); // false
答案 37 :(得分:3)
我使用自己的方法,包括检查对象是否存在,以及更直观的转换为布尔值:
function str2bool(strvalue){
return (strvalue && typeof strvalue == 'string') ? (strvalue.toLowerCase() == 'true' || strvalue == '1') : (strvalue == true);
}
结果是:
var test; // false
var test2 = null; // false
var test3 = 'undefined'; // false
var test4 = 'true'; // true
var test5 = 'false'; // false
var test6 = true; // true
var test7 = false; // false
var test8 = 1; // true
var test9 = 0; // false
var test10 = '1'; // true
var test11 = '0'; // false
答案 38 :(得分:3)
/// Convert something to boolean
function toBoolean( o ) {
if ( null !== o ) {
let t = typeof o;
if ( "undefined" !== typeof o ) {
if ( "string" !== t ) return !!o;
o = o.toLowerCase().trim();
return "true" === o || "1" === o;
}
}
return false;
}
toBoolean(false) --> false
toBoolean(true) --> true
toBoolean("false") --> false
toBoolean("true") --> true
toBoolean("TRue") --> true
toBoolean("1") --> true
toBoolean("0") --> false
toBoolean(1) --> true
toBoolean(0) --> false
toBoolean(123.456) --> true
toBoolean(0.0) --> false
toBoolean("") --> false
toBoolean(null) --> false
toBoolean() --> false
答案 39 :(得分:3)
许多现有答案使用的语义与此相似,
但我认为提及以下“一个班轮”通常就足够了。例如,除了OP的大小写(形式为字符串)之外,人们经常想从process.env
中的NodeJS中读取环境变量(据我所知,其值始终是字符串)为了启用或禁用某些行为,通常这些行为的形式为SOME_ENV_VAR=1
。
const toBooleanSimple = (input) =>
['t', 'y', '1'].some(truePrefix => truePrefix === input[0].toLowerCase());
更健壮和更具表现力的实现可能看起来像这样:
/**
* Converts strings to booleans in a manner that is less surprising
* to the non-JS world (e.g. returns true for "1", "yes", "True", etc.
* and false for "0", "No", "false", etc.)
* @param input
* @returns {boolean}
*/
function toBoolean(input) {
if (typeof input !== 'string') {
return Boolean(input);
}
const s = input.toLowerCase();
return ['t', 'y', '1'].some(prefix => s.startsWith(prefix));
}
一个(玩笑的)单元测试可能看起来像这样:
describe(`toBoolean`, function() {
const groups = [{
inputs: ['y', 'Yes', 'true', '1', true, 1],
expectedOutput: true
}, {
inputs: ['n', 'No', 'false', '0', false, 0],
expectedOutput: false
}]
for (let group of groups) {
for (let input of group.inputs) {
it(`should return ${group.expectedOutput} for ${JSON.stringify(input)}`, function() {
expect(toBoolean(input)).toEqual(group.expectedOutput);
});
}
}
});
答案 40 :(得分:3)
我这样做,它将处理1 = TRUE = yes = YES = true,0 = FALSE = no = NO = false:
BOOL=false
if (STRING)
BOOL=JSON.parse(STRING.toLowerCase().replace('no','false').replace('yes','true'));
将STRING替换为字符串变量的名称。
如果它不是null,则是数值或其中一个字符串: “true”,“TRUE”,“false”,“FALSE”,“yes”,“YES”,“no”,“NO” 它会抛出错误(故意。)
答案 41 :(得分:2)
你可以使用:
var trueOrFalse='True';
result =JSON.parse(trueOrFalse.toLowerCase());
if(result==true)
alert('this is ture');
else
('this is false');
&#13;
在这种情况下.toLowerCase很重要
答案 42 :(得分:2)
这是我最近遇到的最简单的布尔转换方法。想加了。
JSON.parse('true');
let trueResponse = JSON.parse('true');
let falseResponse = JSON.parse('false');
console.log(trueResponse);
console.log(falseResponse);
答案 43 :(得分:2)
if (String(a) == "true"){
//true block
} else {
//false block
}
答案 44 :(得分:2)
如果您确定测试主题始终是字符串,那么最好检查它是否等于Screen2
。
您可能需要考虑添加一些代码,以防主体实际上是布尔值。
true
如果代码经过改进/重构以使用实际的布尔值而不是字符串,则可以在将来节省一些工作。
答案 45 :(得分:2)
function convertBoolean(value): boolean {
if (typeof value == 'string') {
value = value.toLowerCase();
}
switch (value) {
case true:
case "true":
case "evet": // Locale
case "t":
case "e": // Locale
case "1":
case "on":
case "yes":
case 1:
return true;
case false:
case "false":
case "hayır": // Locale
case "f":
case "h": // Locale
case "0":
case "off":
case "no":
case 0:
return false;
default:
return null;
}
}
答案 46 :(得分:2)
这是一个简单的功能,可以解决这个问题,
function convertStringToBool(str){
return ((str === "True") || (str === "true")) ? true:false;
}
这将给出以下结果
convertStringToBool("false") //returns false
convertStringToBool("true") // returns true
convertStringToBool("False") // returns false
convertStringToBool("True") // returns true
答案 47 :(得分:2)
我使用这种简单的方法(使用“myVarToTest”):
var trueValuesRange = ['1', 1, 'true', true];
myVarToTest = (trueValuesRange.indexOf(myVarToTest) >= 0);
答案 48 :(得分:2)
这里有很多花哨的答案。真的很惊讶没有人发布这个解决方案:
var booleanVal = toCast > '';
除了bool false,数字0和空字符串(显然)之外,这在大多数情况下都会解析为true。您可以在事实之后轻松查找其他错误的字符串值,例如:
var booleanVal = toCast > '' && toCast != 'false' && toCast != '0';
答案 49 :(得分:2)
function isTrue(val) {
try {
return !!JSON.parse(val);
} catch (e) {
return false;
}
}
答案 50 :(得分:2)
以下是我的1个班轮提交:我需要评估一个字符串和输出,如果&#39;是&#39;则为true,如果&#39; false&#39;则为false。还有一个数字,如果有&#39; -12.35673&#39;。
val = 'false';
val = /^false$/i.test(val) ? false : ( /^true$/i.test(val) ? true : val*1 ? val*1 : val );
答案 51 :(得分:2)
我写了一个辅助函数来处理你的情况(还有一些)。随意根据您的特定需求进行更改
/**
* @example
* <code>
* var pageRequestParams = {'enableFeatureX': 'true'};
* toBool(pageRequestParams.enableFeatureX); // returns true
*
* toBool(pageRequestParams.enableFeatureY, true, options.enableFeatureY)
* </code>
* @param {*}value
* @param {Boolean}[mapEmptyStringToTrue=false]
* @param {Boolean}[defaultVal=false] this is returned if value is undefined.
*
* @returns {Boolean}
* @example
* <code>
* toBool({'enableFeatureX': '' }.enableFeatureX); // false
* toBool({'enableFeatureX': '' }.enableFeatureX, true); // true
* toBool({ }.enableFeatureX, true); // false
* toBool({'enableFeatureX': 0 }.enableFeatureX); // false
* toBool({'enableFeatureX': '0' }.enableFeatureX); // false
* toBool({'enableFeatureX': '0 ' }.enableFeatureX); // false
* toBool({'enableFeatureX': 'false' }.enableFeatureX); // false
* toBool({'enableFeatureX': 'falsE ' }.enableFeatureX); // false
* toBool({'enableFeatureX': 'no' }.enableFeatureX); // false
*
* toBool({'enableFeatureX': 1 }.enableFeatureX); // true
* toBool({'enableFeatureX': '-2' }.enableFeatureX); // true
* toBool({'enableFeatureX': 'true' }.enableFeatureX); // true
* toBool({'enableFeatureX': 'false_' }.enableFeatureX); // true
* toBool({'enableFeatureX': 'john doe'}.enableFeatureX); // true
* </code>
*
*/
var toBool = function (value, mapEmptyStringToTrue, defaultVal) {
if (value === undefined) {return Boolean(defaultVal); }
mapEmptyStringToTrue = mapEmptyStringToTrue !== undefined ? mapEmptyStringToTrue : false; // default to false
var strFalseValues = ['0', 'false', 'no'].concat(!mapEmptyStringToTrue ? [''] : []);
if (typeof value === 'string') {
return (strFalseValues.indexOf(value.toLowerCase().trim()) === -1);
}
// value is likely null, boolean, or number
return Boolean(value);
};
答案 52 :(得分:2)
许多现有答案都是相似的,但大多数人忽略了给定参数也可能是一个对象的事实。
这是我刚刚掀起的事情:
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');
}
}
};
答案 53 :(得分:1)
我一直在使用这段代码转换数字和布尔值:
var result = !isNaN(value) ? parseFloat(value) : /^\s*(true|false)\s*$/i.exec(value) ? RegExp.$1.toLowerCase() === "true" : value;
答案 54 :(得分:1)
MyLib.Convert.bool = function(param) {
var res = String(param).toLowerCase();
return !(!Boolean(res) || res === "false" || res === "0");
};
答案 55 :(得分:1)
您甚至不需要将字符串转换为布尔值。只需使用以下内容:
var yourstring = yourstringValue == 1 ? true : false;
答案 56 :(得分:1)
我认为可以使用箭头功能在1个衬里完成
const convertStringToBoolean = (value) => value ? String(value).toLowerCase() === 'true' : false;
你们可以使用以下代码段运行和测试各种情况
const convertStringToBoolean = (value) => value ? String(value).toLowerCase() === 'true' : false;
console.log(convertStringToBoolean("a"));
console.log(convertStringToBoolean(null));
console.log(convertStringToBoolean(undefined));
console.log(convertStringToBoolean("undefined"));
console.log(convertStringToBoolean(true));
console.log(convertStringToBoolean(false));
console.log(convertStringToBoolean(0));
console.log(convertStringToBoolean(1)); // only case which will not work
答案 57 :(得分:1)
警告: 切勿将此方法用于不受信任的输入,例如URL参数。
您可以使用pivot_wider()
功能。
直接将您的字符串传递给eval()
函数。
eval()
答案 58 :(得分:1)
if
语句:
function parseBool(str) {
if (str.toLowerCase() == 'true') {
var val = true;
} else if (str.toLowerCase() == 'false') {
var val = false;
} else {
//If it is not true of false it returns undefined.//
var val = undefined;
}
return val;
}
console.log(parseBool(''), typeof parseBool(''));
console.log(parseBool('TrUe'), typeof parseBool('TrUe'));
console.log(parseBool('false'), typeof parseBool('false'));
答案 59 :(得分:1)
基于Steven上面的回答,我将此函数编写为字符串输入的通用解析器:
parse:
function (value) {
switch (value && value.toLowerCase()) {
case null: return null;
case "true": return true;
case "false": return false;
default: try { return parseFloat(value); } catch (e) { return value; }
}
}
答案 60 :(得分:1)
const result: Boolean = strValue === "true" ? true : false
答案 61 :(得分:1)
在HTML中,属性的值最终变为字符串。为了缓解这种情况,您可以使用函数有条件地将其解析为它们在JavaScript或其他任何感兴趣的编程语言中表示的值。
以下是从字符串类型恢复布尔类型的说明,但也可以将其进一步扩展为其他数据类型,例如数字,数组或对象。
除此以外,JSON.parse还有一个revive parameter这是一个函数。也可以用来达到相同目的。
我们叫一个看起来像 boolean ,“ true”, boolean字符串的字符串,同样,我们也可以像数字,“ 1”,数字字符串。然后,我们可以确定字符串是否为布尔字符串:
const isBooleanString = (string) => ['true', 'false'].some(item => item === string);
此后,我们需要通过JSON.parse
方法将布尔字符串解析为JSON:
JSON.parse(aBooleanString);
但是,任何不是 boolean字符串,数字字符串的字符串或任何字符串化的对象或数组(任何无效的JSON)都将导致JSON.parse
抛出SyntaxError
的方法。
因此,您需要知道如何称呼它,即它是否是布尔字符串。您可以通过编写一个函数来实现上面的 boolean string 检查并调用JSON.parse
:
function parse(string){
return isBooleanString(string) ? JSON.parse(string)
: string;
}
可以进一步推广isBooleanString
实用程序,以通过进一步参数化接受可接受的 boolean < / em>字符串:
const isBooleanString = (string, spec = ['true', 'false', 'True', 'False']) => spec.some(item => item === string);
答案 62 :(得分:1)
对于TypeScript,我们可以使用以下功能:
export function stringToBoolean(s: string, valueDefault: boolean = false): boolean {
switch(s.toLowerCase())
{
case "true":
case "1":
case "on":
case "yes":
case "y":
return true;
case "false":
case "0":
case "off":
case "no":
case "n":
return false;
}
return valueDefault;
}
答案 63 :(得分:1)
如果有一些其他代码将布尔值转换为字符串,则需要确切知道该代码如何存储true / false值。要么您或者您需要访问一个反转该转换的函数。
在字符串中表示布尔值的方式有很多种(“true”,“Y”,“1”等)。所以你不应该依赖一些通用的字符串到布尔转换器,比如Boolean(myValue)。您需要使用一个例程来反转原始的布尔到字符串转换,无论是什么。
如果您知道它将真正的布尔值转换为“真正的”字符串,那么您的示例代码就可以了。除了你应该使用===而不是==,所以没有自动类型转换。
答案 64 :(得分:1)
写一个更短的方法,可能是var isTrueSet = (myValue === "true") ? true : false;
只假设&#34; true&#34;是真的,其他价值观都是假的。
答案 65 :(得分:1)
简单的解决方案我已经使用了一段时间
function asBoolean(value) {
return (''+value) === 'true';
}
// asBoolean(true) ==> true
// asBoolean(false) ==> false
// asBoolean('true') ==> true
// asBoolean('false') ==> false
答案 66 :(得分:1)
当我从网址/表单或其他来源获取价值时,我正在使用这个。
这是非常通用的一行代码。
也许不是性能最佳,如果你需要运行数百万次让我知道,我们可以检查如何优化它,否则非常好并可定制。
boolResult = !(['false', '0', '', 'undefined'].indexOf(String(myVar).toLowerCase().trim()) + 1);
结果:
myVar = true; // true
myVar = 'true'; // true
myVar = 'TRUE'; // true
myVar = '1'; // true
myVar = 'any other value not related to false'; // true
myVar = false; // false
myVar = 'false'; // false
myVar = 'FALSE'; // false
myVar = '0'; // false
答案 67 :(得分:1)
Boolean.parse()
。它绝对不是通用的,所以如果你需要的东西比你不应该使用这种方法。但是在Chrome中,例如(我正在使用v21)它可以正常运行,正如人们所期望的那样。
答案 68 :(得分:1)
请注意,将来代码可能会更改并返回boolean而不是一个字符串。
解决方案是:
//Currently
var isTrue = 'true';
//In the future (Other developer change the code)
var isTrue = true;
//The solution to both cases
(isTrue).toString() == 'true'
答案 69 :(得分:1)
要像boolean一样评估类似布尔和布尔类的字符串,我使用了这个简单的公式:
var trueOrStringTrue = (trueOrStringTrue === true) || (trueOrStringTrue === 'true');
很明显,对于true和'true',它将返回true。其他一切都是假的。
答案 70 :(得分:1)
有助于在Javascript中加强代码执行的一项功能是短路评估:
当逻辑表达式从左到右进行评估时,它们会使用以下规则进行可能的“短路”评估测试:
- false&amp;&amp; (任何)短路评估为假。
- true || (任何)短路评估为真。
因此,如果您想在true
测试方式中测试false
JSON.parse
的字符串值并保持强大的性能,则可以使用||
运算符,以便在测试值为布尔类型时从执行中排除慢速代码。
test === true || ['true','yes','1'].indexOf(test.toString().toLowerCase()) > -1
由于Array.prototype.indexOf()
方法是第5版中 ECMA-262 标准的一部分,因此旧浏览器支持可能需要 polyfill 。< / p>
// Production steps of ECMA-262, Edition 5, 15.4.4.14
// Reference: http://es5.github.io/#x15.4.4.14
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(searchElement, fromIndex) {
var k;
// 1. Let O be the result of calling ToObject passing
// the this value as the argument.
if (this == null) {
throw new TypeError('"this" is null or not defined');
}
var O = Object(this);
// 2. Let lenValue be the result of calling the Get
// internal method of O with the argument "length".
// 3. Let len be ToUint32(lenValue).
var len = O.length >>> 0;
// 4. If len is 0, return -1.
if (len === 0) {
return -1;
}
// 5. If argument fromIndex was passed let n be
// ToInteger(fromIndex); else let n be 0.
var n = +fromIndex || 0;
if (Math.abs(n) === Infinity) {
n = 0;
}
// 6. If n >= len, return -1.
if (n >= len) {
return -1;
}
// 7. If n >= 0, then Let k be n.
// 8. Else, n<0, Let k be len - abs(n).
// If k is less than 0, then let k be 0.
k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
// 9. Repeat, while k < len
while (k < len) {
// a. Let Pk be ToString(k).
// This is implicit for LHS operands of the in operator
// b. Let kPresent be the result of calling the
// HasProperty internal method of O with argument Pk.
// This step can be combined with c
// c. If kPresent is true, then
// i. Let elementK be the result of calling the Get
// internal method of O with the argument ToString(k).
// ii. Let same be the result of applying the
// Strict Equality Comparison Algorithm to
// searchElement and elementK.
// iii. If same is true, return k.
if (k in O && O[k] === searchElement) {
return k;
}
k++;
}
return -1;
};
}
答案 71 :(得分:1)
function returnBoolean(str){
str=str.toString().toLowerCase();
if(str=='true' || str=='1' || str=='yes' || str=='y' || str=='on' || str=='+'){
return(true);
}
else if(str=='false' || str=='0' || str=='no' || str=='n' || str=='off' || str=='-'){
return(false);
}else{
return(undefined);
}
}
答案 72 :(得分:1)
使用此库轻松一下。
https://github.com/rohmanhm/force-boolean
你只需要写一行
const ForceBoolean = require('force-boolean')
const YOUR_VAR = 'false'
console.log(ForceBoolean(YOUR_VAR)) // it's return boolean false
它也支持以下
return false if value is number 0
return false if value is string '0'
return false if value is string 'false'
return false if value is boolean false
return true if value is number 1
return true if value is string '1'
return true if value is string 'true'
return true if value is boolean true
答案 73 :(得分:0)
`toBoolean'函数为null,undefined,'','false'返回false。对于任何其他字符串,它返回true:
const toBoolean = (bool) => {
if (bool === 'false') bool = false
return !!bool
}
toBoolean('false') // returns false
答案 74 :(得分:0)
const boolTrue = JSON.parse("true")
const boolFalse = JSON.parse("false")
console.log(boolTrue) // true
console.log(boolFalse) // false
将像 "true" 这样的字符串布尔值转换为实际的布尔值只是包装到 JSON.parse()
示例:JSON.parse("true")
答案 75 :(得分:0)
const string = "false"
const string2 = "true"
const test = (val) => (val === "true")
console.log(test(string))
console.log(test(string2))
答案 76 :(得分:0)
如果您确定输入的内容仅在 'true' 和 'false' 范围内 为什么不:
let x = 'true' ;
//let x= 'false';
let y = x==='true'?true:false;
console.log(typeof(y), y);
答案 77 :(得分:0)
最强的方法如下,因为它还处理未定义的情况:
({'true': true, 'false': false})[myValue];
({'true': true, 'false': false})[undefined] // => undefined
({'true': true, 'false': false})['true'] // => true
({'true': true, 'false': false})['false] // => false
答案 78 :(得分:0)
以下就足够了
String.prototype.boolean = function() {
return "true" == this;
};
"true".boolean() // returns true "false".boolean() // returns false
答案 79 :(得分:0)
如果您需要从字符串值中获取布尔值false
和true
,则只需执行简单的一行操作即可:
storeBooleanHere = stringVariable=="true"?true:false;
答案 80 :(得分:0)
您甚至不需要使用变量,如果您知道'true'始终是小写字母,则可以使用它返回true或false:
(eval(yourBooleanString == 'true'))
答案 81 :(得分:0)
var trueVals = ["y", "t", "yes", "true", "gimme"];
var isTrueSet = (trueVals.indexOf(myValue) > -1) ? true : false;
甚至只是
var trueVals = ["y", "t", "yes", "true", "gimme"];
var isTrueSet = (trueVals.indexOf(myValue) > -1);
与某些switch语句类似但更紧凑。返回的值只有在字符串是trueVals字符串之一时才为true。其他一切都是假的。当然,您可能希望规范化输入字符串以使其小写并修剪任何空格。
答案 82 :(得分:0)
将字符串转换为布尔值
var vIn = 0;
var vOut = parseInt(vIn,10/*base*/);
将字符串转换为数字
{{1}}
答案 83 :(得分:0)
我经常使用的最简单的方法是三元运算符:
let value = 'true';
let output = value === 'true' ? true : false;
答案 84 :(得分:0)
从字符串或数字中获取布尔值这是一个很好的解决方案:
var boolValue = Boolean(Number('0'));
var boolValue = Boolean(Number('1'));
首先返回false
,然后返回true
。
答案 85 :(得分:0)
在nodejs中使用node-boolify可以实现
布尔值转换结果
Boolify(true); //true
Boolify('true'); //true
Boolify('TRUE'); //null
Boolify(1); //true
Boolify(2); //null
Boolify(false); //false
Boolify('false'); //false
Boolify('FALSE'); //null
Boolify(0); //false
Boolify(null); //null
Boolify(undefined); //null
Boolify(); //null
Boolify(''); //null
答案 86 :(得分:0)
您可以使用Function
从字符串Boolean
或"true"
"false"
值
const TRUE_OR_FALSE = str => new Function(`return ${str}`)();
const [TRUE, FALSE] = ["true", "false"];
const [T, F] = [TRUE_OR_FALSE(TRUE), TRUE_OR_FALSE(FALSE)];
console.log(T, typeof T); // `true` `"boolean"`
console.log(F, typeof F); // `false` `"boolean"`
答案 87 :(得分:-1)
将字符串转换为布尔值的最简单方法如下:
Boolean(<stringVariable>)
答案 88 :(得分:-1)
答案 89 :(得分:-1)
我希望这是一个最全面的用例
function parseBoolean(token) {
if (typeof token === 'string') {
switch (token.toLowerCase()) {
case 'on':
case 'yes':
case 'ok':
case 'ja':
case 'да':
// case '':
// case '':
token = true;
break;
default:
token = false;
}
}
let ret = false;
try {
ret = Boolean(JSON.parse(token));
} catch (e) {
// do nothing or make a notification
}
return ret;
}
答案 90 :(得分:-2)
Boolean(Number(value));
var value = 1; //true
var value = "1" //true
var value = 0; //false
var value = "0" //false`
答案 91 :(得分:-3)
// 尝试两种方式将字符串转换为布尔值
const checkBoolean = Boolean("false");
const checkBoolean1 = !!"false";
console.log({checkBoolean, checkBoolean1});
答案 92 :(得分:-5)
完美且非常简单:
var boolean = "false";
boolean = (boolean === "true");
//boolean = JSON.parse(boolean); //or this way..
测试它:
var boolean = "false";
boolean = (boolean === "true");
//boolean = JSON.parse(boolean); //or this way..
if(boolean == true){
alert("boolean = "+boolean);
}else{
alert("boolean = "+boolean);
}
&#13;
答案 93 :(得分:-22)
只做一个:
var myBool = eval (yourString);
示例:
alert (eval ("true") == true); // TRUE
alert (eval ("true") == false); // FALSE
alert (eval ("1") == true); // TRUE
alert (eval ("1") == false); // FALSE
alert (eval ("false") == true); // FALSE;
alert (eval ("false") == false); // TRUE
alert (eval ("0") == true); // FALSE
alert (eval ("0") == false); // TRUE
alert (eval ("") == undefined); // TRUE
alert (eval () == undefined); // TRUE
此方法自然地处理空字符串和未定义字符串,就像声明变量而不为其赋值一样。
答案 94 :(得分:-30)
var myBool = Boolean.parse("true");
或
var myBool = Boolean("true");
或
var myBool = !!"true";
不确定第一个是否特定于IE。