如何在JavaScript中将字符串转换为布尔值?


2547

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

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

一旦将字段转换为字符串,我可以确定该字段的布尔值的唯一方法就是依赖其字符串表示形式的文字值。

var myValue = document.myForm.IS_TRUE.value;
var isTrueSet = myValue == 'true';

有没有更好的方法可以做到这一点?


50
“有没有更好的方法来实现这一目标?” -当然还有更糟糕的方法:Dstring=(string==String(string?true:false))?(string?true:false):(!string?true:fa‌​lse);
马克·科恩

3
轻松处理线和function parseBool(val) { return val === true || val === "true" }
布尔

1
@Markfunction checkBool(x) { if(x) {return true;} else {return false;} }
Sebi

2
@Sebi:您忘记记录它了:if (checkBool(x) != false) { ... } else { ... }
Mark K Cowan

3
!!(parseInt(value) || value === "true")
安德鲁·卢卡

Answers:


3472

做:

var isTrueSet = (myValue == 'true');

您可以使用身份运算符(===)来使其更严格,当比较的变量具有不同类型时,它不会进行任何隐式类型转换,而不是相等运算符(==)。

var isTrueSet = (myValue === 'true');

别:

您可能应谨慎使用这两种方法来满足您的特定需求:

var myBool = Boolean("false");  // == true

var myBool = !!"false";  // == true

任何不是空字符串的字符串都将true通过使用它们来求值。尽管它们是我可以想到的与布尔转换有关的最干净的方法,但我认为它们并不是您想要的。


196
myValue === 'true';正好等于myValue == 'true';=====这里使用没有任何好处。
蒂姆·唐

551
我会遵循克罗克福德的建议和使用,===并且!==只要有可能,几乎总是这样。
guinaps,2011年

55
例如,大写的“ TRUE”怎么办?
BMiner 2011年

102
@guinaps我通常会遵循Crockford的建议,但是==vs ===场景是我没有的少数场景之一。我完全不同意使用它“几乎总是”是有意义的===存在类型松散的语言因为我们不想关心类型。如果我们检查类似的东西,if (price >= 50)我们不在乎它是否以字符串开头。我说,大多数时候,我们希望对类型进行处理。在极少数情况下,我们不想打杂(例如if (price === null)),则可以使用===。这是我多年来所做的,而且从未遇到过问题。
JMTyler 2013年

169
@JMTyler可能会忽略后续的维护程序员。始终使用适当的比较运算符!如果您肯定两面都知道类型,但是不使用===,那么稍后查看代码时,我将不具备这些知识。如果您的代码被重用,这可能会成为噩梦。如果您确实希望像您所说的那样“打乱”类型,那么请使用“ ==”,但是太多的JS开发人员会很容易绊倒,更好地收紧代码。我希望字符串“ false”表示布尔值“ true”的频率是多少?
aikeru

685

警告

从技术上讲,这个高度推崇的旧式答案是正确的,但仅适用于特定情况,即您的字符串值为EXACTLY "true""false"

在下面的函数中传递的无效json字符串将引发异常


原始答案:

怎么样?

JSON.parse("True".toLowerCase());

或与jQuery

$.parseJSON("TRUE".toLowerCase());

62
这样做的问题是,许多潜在值都会生成一个解析错误,从而停止JS执行。因此,运行JSON.parse(“ FALSE”)会轰炸Javascript。我认为,问题的重点不是简单地解决这些确切的案例,而是要对其他案例具有弹性。
BishopZ

3
@Luke这个解决方案实际上正是我需要的;好吧,将其包装在try ... catch中。我只想在字符串中是布尔值时才将其转换为布尔值;否则,只需使用提供的字符串。这可行!谢谢。
jedmao 2013年

47
只需说一说就很简单,JSON.parse("TRUE".toLowerCase())以便可以正确解析。
2013年

27
为什么会有这么多的投票?这是低效而可怕的。下一步是什么?'true'.length === 4
马克西姆六世。

21
@MaksimVi。typeof str==="string"&& str.length===4&& str.charAt(0)==="t" && str.charAt(1)==="r" && str.charAt(2)==="u" && str.charAt(3)==="e"&& true===true && true!==false && false===false
/////

223
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);
    }
}

43
实际上可以简化。1)没有必要测试"true""yes""1"。2)toLowerCase不退货null。3)Boolean(string)string!==""此处相同。=>switch(string.toLowerCase()) {case "false": case "no": case "0": case "": return false; default: return true;}
罗伯特·

15
@Robert,很好,但是我宁愿使用默认值false
drigoangelo

@drigoangelo default: return true;当然有可能。但这会改变功能的行为。
罗伯特

2
我认为这是最好的答案,并希望在这里就可以了阐述:stackoverflow.com/questions/263965/...
BrDaHa

9
如果您通过调用.toLowerCase()来规范化数据,那么您可能不希望同时插入trim()来删除空格
jCuga 2014年

174

我认为这很普遍:

if (String(a) == "true") ...

它去了:

String(true) == "true"     //returns true
String(false) == "true"    //returns false
String("true") == "true"   //returns true
String("false") == "true"  //returns false

20
如果您可以接收大写或布尔值的字符串,则String(a).toLowerCase() === 'true'
pauloya

String("what about input like this that isn't a bool?") == "true"
Thomas Eding 2013年

6
@ThomasEding假...您希望它返回什么?
2013年

2
甚至可以通过不使用String()构造函数来缩短:true+'' === 'true' // true
Todd 2015年

1
顺便说一句,对于1或0,它也应该转换为假或真
Miguel

128

请记住要区分大小写:

var isTrueSet = (myValue.toLowerCase() === 'true');

另外,如果它是一个表单元素复选框,则还可以检测是否已选中该复选框:

var isTrueSet = document.myForm.IS_TRUE.checked;

假设如果选中,则将其“设置”等于true。评估为真/假。


3
如果myValue恰好是或其他某种类型null,这将引发异常true……
mik01aj 2015年

115

您可以使用正则表达式:

/*
 * 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显示为false,而Opera,Chrome,Safari和IE显示为true。错误720760


10
如果您担心该函数会干扰其他代码,则可以始终为该函数添加前缀。如果某些代码仍然中断,则该代码太脆弱了,应该修复。如果您添加的函数使对象过于沉重,从而导致其他代码出现性能问题,那么显然您不想这样做。但是,我认为扩展内置对象通常不是一个坏主意。如果是这种情况,它们也不会公开扩展。
Shadow2531 2011年

41
@DTrejo @Szymon我不同意。这正是使原型超载的目的。如果您担心它破坏依赖于for..in的(可怜的)代码,则可以使用一些方法来隐藏枚举中的属性。请参阅Object.defineProperty
devios1 2011年

为了遵循惯例,我称之为parseBool
guzart

8
布尔解析不属于String类。您最终将在其中得到大量垃圾解析器和转换。-1到一般更改原型。-1表示无法跨浏览器使用的解决方案。-1用于较差的设计。
Thomas W

1
这是所有答案的性能比较。stackoverflow.com/a/28588344/2824333
sospedra 2015年

49

木眼要小心。在对500多个投票应用了最高答案后,看到了后果,我觉得有义务发布一些实际上有用的东西:

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

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]));}

请记住,如果使用第一种方法,则较旧的浏览器可能需要JSON polyfill。
DRaehal '16

1
使用“ false”字符串将false布尔值转换为布尔值有多快JSON.parse?在CPU,内存性能方面
绿色

从if(str){...}开始以消除已经为假的东西会更容易吗?而在这个if条件中,只需担心返回true,因为您已经以return false结束!
Larphoid

请记住,您可以使用[[“ true”,“ yes”,“ 1”]。indexOf(str.toLowerCase()。trim())!= -1)缩短许多字符串测试,并使用回退布尔(STR)像“空”封面的事情
斯科特

37

我以为@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


我使用这一点是因为它涵盖了您从XML / HTML ElementNodes属性中获得的东西,例如autocomplete="on"
philk

2
我会在toLowerCase()之前添加.trim()
Luis Lobo Borobia

34

带有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

UPDATE(不带JSON):

function getBool(val){ 
    var num = +val;
    return !isNaN(num) ? !!num : !!String(val).toLowerCase().replace(!!0,'');
}

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


1
“没有JSON”版本存在一些缺陷:val =“ 0”; console.log(!!(+ val || String(val).toLowerCase()。replace(!! 0,''))); 产生真实
Etienne

3
getBool(undefined)使用原始JSON版本时将崩溃,第二版本将返回true。这是第三个返回false的版本:function getBool(val){var num; return val!= null &&(!isNaN(num = + val)?!! num:!! String(val).toLowerCase()。replace(!! 0,'')); }
罗恩·马丁内斯

31

您的解决方案很好。

使用===也只是傻在这种情况下,作为该领域的value将永远是一个String


17
为什么您认为使用它会很愚蠢===?就性能而言,如果两种类型均为字符串,则将完全相同。无论如何,我宁愿使用,===因为我总是避免使用==!=。理由:stackoverflow.com/questions/359494/...
马里亚诺Desanze

3
既然value永远都是string既不==也不===傻。两者都是完成这项工作的正确工具。它们仅在类型相等时不同。在这种情况下===简单地返回false==比较前一个复杂的类型强制算法执行。
罗伯特·

23
var falsy = /^(?:f(?:alse)?|no?|0+)$/i;
Boolean.parse = function(val) { 
    return !falsy.test(val) && !!val;
};

此返回false每falsy值和true对于不同的是每truthy值'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());

20

布尔对象没有'parse'方法。Boolean('false')返回true,因此将无法正常工作。!!'false'也返回true,因此也将不起作用。

如果要让string 'true'返回布尔值true而让string 'false'返回布尔值false,则最简单的解决方案是使用eval()eval('true')返回true并eval('false')返回false。使用时请记住性能影响eval()


要了解eval的“错误”(或正确),请查看javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval之类的文章,或在stackoverflow上搜索“ Javascript eval恶意软件”
GrahamMc

2
我同意这var isTrueSet = (myValue === 'true');是最好的答案。
thdoan

我喜欢这很简洁。但是对于的基本情况却失败了eval('TRUE'); 再次证明那eval()是邪恶的。
雪人2015年

以同样的方式,@ Area 51侦探小说JSON.parse('TRUE')也从下面的答案中失败了。在JavaScript(或其他任何一种语言)中强制错误条件非常容易。为了解决这个问题,你应该首先规格化字符串,如var myValue = document.myForm.IS_TRUE.value.toLowerCase(); var isTrueSet = (myValue==='true' || myValue==='false') ? eval(myValue) : false;
thdoan

1
@ 10basetom:非常正确。您应该.toLowerCase()在答案中包括我的观点。我不是要强迫任何事情。大写TRUE是足够多的通用值,可以由许多UI小部件返回。
2015年

16

我使用以下内容:

function parseBool(b) {
    return !(/^(false|0)$/i).test(b) && !!b;
}

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


16

答案很多,很难选择。就我而言,我在选择时会优先考虑性能,因此我创建了这个jsPerf,希望可以对此有所启发

结果简介(越高越好):

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

它们链接到相关的答案,您可以在其中找到有关每个答案的更多信息(利弊);特别是在评论中。


尝试查看jsPerf测试时“出了问题”
spottedmahn

16

这是从公认的答案中得出的,但实际上它有一个很薄弱的地方,我很震惊它如何获得赞成票数,它的问题在于您必须考虑字符串的大小写,因为这是区分大小写的

var isTrueSet = (myValue.toLowerCase() === 'true');

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.");
  }
};

2
您可以使用true.toString()代替“ true”,以使其更加干净:-)
耕till

不要改变全局,尽量保持你的改变孤立的,也许创建一个新的function parseBoolean来代替
钢脑

13

您正在寻找的表情仅仅是

/^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

12

要将string(“ true”,“ false”)和boolean都转换为boolean

('' + flag) === "true"

哪里flag可以

 var flag = true
 var flag = "true"
 var flag = false
 var flag = "false"

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

9

我正在用这个

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"

这很好,但仅适用于String类型。想象一下,可能需要一个可能为"true"或的变量使用此变量true。如果第二个来,这将不起作用。是否可以document.prototype在我们需要的地方使用它?
MarceloBarbosa 2015年

这看起来很优雅。做得好!但是,我注意到,在大型JS应用程序中重载基本原型(还需要进行单元测试)可能会导致某些意外行为(即,当您想通过“ for”遍历具有重载原型的数组时,会得到一些您通常不会期望的属性)。你被警告了。;)
cassi.lup 2015年

您的变体也接受布尔函数StringOrElse2Bool(sob){if(typeof sob ===“ string”){return [“ no”,“ false”,“ 0”,“ off”]。indexOf(sob.toLowerCase ())!== -1吗?假:真; } else {return !! sob}
bortunac 2015年

9

你为什么不尝试这样的事情

Boolean(JSON.parse((yourString.toString()).toLowerCase()));

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

// 0-> false
// any other number -> true

9

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


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

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


4
您在说什么转换?:-)
YMMD 2012年

1
在JavaScript中比较字符串时,不使用转换时,使用==或===运算符之间没有区别。在这里,您正在与字符串进行比较,因此没有类型转换。参见stackoverflow.com/questions/359494/…–
ars265

8

就像@ Shadow2531所说,您不能直接将其转换。我还建议您考虑将“ true”和“ false”以外的字符串输入视为“ true”和“ falsey”,如果您的代码将被其他人重用/使用。这是我用的:

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;
  }
}

7

您需要(在您的思想中)分离选择的价值和该价值的表示形式。

在JavaScript逻辑中选择一个点,他们需要将其从字符串标记转换为纯类型并在那里进行比较,最好是在每个需要转换的值仅做一次的情况下进行比较。请记住,如果字符串sendinel不是脚本知道的字符串(即,您默认为true还是false?),请解决发生的情况。

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


7

我对这个问题的看法是,它旨在实现三个目标:

  • 对于true和false值,返回true / false,但是对于多个字符串值(如果它们是布尔值而不是字符串),则返回true / false。
  • 其次,提供弹性接口,以使指定值以外的其他值都不会失败,而是返回默认值
  • 第三,用尽可能少的代码来完成所有这些工作。

使用JSON的问题在于,它会由于导致Javascript错误而失败。此解决方案没有弹性(尽管满足1和3):

JSON.parse("FALSE") // fails

此解决方案不够简洁:

if(value === "TRUE" || value === "yes" || ...) { return true; }

我正在努力解决Typecast.js的确切问题。这三个目标的最佳解决方案是:

return /^true$/i.test(v);

它在很多情况下都有效,当传入{}之类的值时不会失败,并且非常简洁。它还返回false作为默认值,而不是未定义或抛出错误,这在松散类型的Javascript开发中更为有用。勇敢地建议其他答案!


只是回到您的目标,第三个也是最好的解决方案的唯一问题是它不符合目标#1-仅当值为时返回true 'true',而对于任何真实输入均不返回。为了使之满足目标#1,它是只稍微比溶液#2更简洁,并且少得多可读性。
JMTyler 2013年

return /^(true|yes|1|t|y)$/i.test(str);
凯文·布歇

7

我有点晚了,但我有一个小片段来做到这一点,它本质上维护所有JScripts truthey / falsey /的肮脏 -ness但包括"false"作为虚假的acceptible值。

我更喜欢这种方法,因为它不依赖第三方来解析代码(即eval / JSON.parse),这在我看来是过大了,它足够短,不需要实用程序函数并进行维护其他的Trueey / 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..

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
> 

6

神圣的上帝,其中一些答案是荒谬的。我喜欢JS及其无数种方法。

令我震惊的是,我的偏好是:

testVar = testVar.toString().match(/^(true|[1-9][0-9]*|[0-9]*[1-9]+|yes)$/i) ? true : false;

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;
}

对于字符串,我个人会true像您一样返回“ true”,但是false仅返回“ false”,undefined否则返回。类似于您以前使用整数大小写进行的操作。
Pierre-Adrien Buisson
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.