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

Kevin 2328 javascript

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

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

我可以找到确定字段的布尔值的唯一方法,一旦将其转换为字符串,就要依赖于字符串表示的字面值.

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

有没有更好的方法来实现这一目标?

guinaps.. 3156

做:

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

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

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

别:

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

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

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

任何不是空字符串的字符串都将true使用它们进行评估.虽然它们是我能想到的关于布尔转换的最干净的方法,但我认为它们不是你想要的.

  • 我遵循[Crockford的建议](http://javascript.crockford.com/code.html)并且只要有意义就使用`===`和`!==`,这几乎总是如此. (516认同)
  • `myValue ==='true';`完全等同于`myValue =='true';`.在这里使用`===`而非`==`没有任何好处. (183认同)
  • @JMTyler可能会忽视维护程序员.始终使用正确的比较运算符!如果您确实"确定"双方的类型,但不使用===,那么在以后查看您的代码时我不会有这方面的知识.如果您的代码被重用,这可能会成为一场噩梦.如果你真的想要你的类型'玩杂耍',那么使用'==',但太多的JS开发人员会在这方面绊倒,更好地收紧你的代码.我多久需要字符串'false'来表示布尔值'true'? (156认同)
  • @guinaps我通常遵循Crockford的建议,但是`==`vs.` ===`场景是我不知道的少数几个场景之一.我*完全*不同意它"几乎总是"使用`===`是有道理的.松散类型的语言*存在*因为我们不想关心类型; 如果我们检查一下像'if(price> = 50)`我们不在乎它是否以字符串开头.我说,*大多数时候,我们*希望*类型被耍弄.在我们不想要类型杂耍的极少数情况下(例如`if(price === null)`),我们使用`===`.这就是我多年来所做的,而且我从来没有遇到过问题. (93认同)
  • 例如,大写的"TRUE"怎么样? (51认同)
  • 我发现Crockford被引用过,他的一些JS约定很糟糕.顶部的示例变量声明以逗号分隔是容易出错且不实用的; 我说声明代码可读性并且总是明确地使用`var`关键字. (12认同)
  • @TimDown如果`myValue`是一个字符串,如果它是一个数组`['true']`,或者甚至是一个数组`[['true']]`那么`myValue =='true'`将是真的还验证,这可能是不受欢迎的:) (5认同)
  • 覆盖大写:!!(''+ myValue).toLowerCase(); 或((''+ myValue).toLowerCase()==='true'); (5认同)
  • @BMiner然后首先将`myValue`转换为小写. (3认同)
  • @guinaps什么时候最有意义? (3认同)
  • @JMTyler我完全同意.在我的整个职业生涯中,我实际上只遇到过一次问题,当时我没有使用`if(foo!== 0)`,而是`if(foo)`.等等...... Crockford没有建议不要*那*... (3认同)
  • 我同意re:顶部的变量声明.首先,在实际使用之前声明声明会让你考虑你想要变量的"逻辑"范围(无论是否通过闭包可用).其次,在将来(ES6),你可以用"let"替换那些"var",你也可以强制执行逻辑范围. (3认同)
  • @cciotti当您不需要隐式强制时。或像guinaps一样,几乎总是这样。 (2认同)
  • 为了支持@ aikeru的观点,如果你让`price`成为一个字符串(或者你只是不确定),这可能会痛苦地结束:`if(price> = 50){price + = 10; }` (2认同)
  • @TimDown你不对.尝试:`var myValue = {toString:function(){return"true"}};` (2认同)
  • @Pawel:我不同意不使用`==`是严肃的开发人员唯一可能的选择.它是一个混合经验或能力团队中有用的代码标准,但在每个处理代码的人都理解语言的环境中,我没有看到问题.对于采用特定标准而言,使用棉绒本身并不是一个很好的理由,并且无论如何都可以配置大多数短绒. (2认同)

Luke.. 643

警告

这个高度支持的遗留答案在技术上是正确的,但只涵盖一个非常具体的场景,当你的字符串值是完全"true""false"(必须也是小写).

传递给下面这些函数的无效json字符串将引发异常.


原始答案:

怎么样?

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

或者使用jQuery

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

  • 这个问题是很多潜在的值会产生一个解析错误,导致JS执行停止.所以运行JSON.parse("FALSE")炸弹Javascript.我认为,问题的关键不在于简单地解决这些确切的案例,而是对其他案件具有弹性. (60认同)
  • 只是说`JSON.parse("TRUE".toLowerCase())`非常简单,这样它就可以正确解析. (44认同)
  • 为什么会有这么多的赞成?这是低效和可怕的.接下来是什么?`'true'.length === 4`? (25认同)
  • @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` //只是为了确定 (18认同)
  • @Luke这个解决方案实际上正是我所需要的; 好吧,尽量把它包起来...... 我想只在它是字符串中的布尔值时转换为bool; 否则,只需使用提供的字符串.这有效!谢谢. (3认同)

小智.. 211

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

  • 实际上它可以简化.1)没有必要测试""真"","是"和"1".2)`toLowerCase`不返回`null`.3)`Boolean(string)`和`string!==""`这里相同.=>`switch(string.toLowerCase()){case"false":case"no":case"0":case"":return false; default:return true;}` (42认同)
  • @Robert,很好,但我宁愿把默认值改为`false`. (13认同)
  • 如果你通过调用.toLowerCase()来规范化数据,那么你可能不想抛出trim()以去除空白 (9认同)
  • 我认为这是最好的答案,并希望在此处详细说明:http://stackoverflow.com/questions/263965/how-can-i-convert-a-string-to-boolean-in-javascript/21976486# 21976486 (2认同)

小智.. 164

我认为这很普遍:

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

它会:

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

  • 当你可以接收大写的字符串或布尔值时,那么`String(a).toLowerCase()==='true'` (19认同)
  • @ThomasEding false ...你想要它返回什么? (5认同)

Jared Farris.. 123

请记住匹配案例:

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

此外,如果它是表单元素复选框,您还可以检测是否选中了复选框:

var isTrueSet = document.myForm.IS_TRUE.checked;

假设如果选中它,则"set"等于true.这个评估为真/假.

  • 如果`myValue`恰好是`null`,`true`或其他类型,这将抛出异常...... (3认同)

Shadow2531.. 113

您可以使用正则表达式:

/*
 * 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)

  • @DTrejo @Szymon我不同意.这正是重载原型的那种东西.如果你害怕它依赖于for..in而破坏(差)代码,有一些方法可以隐藏枚举中的属性.请参阅`Object.defineProperty`. (41认同)
  • 修改内置对象的原型不是一个好主意! (29认同)
  • 如果您害怕它会干扰其他一些代码,您可以随时为该函数添加前缀.如果某些代码仍然中断,那么代码太脆弱了,应该修复.如果您添加的函数使对象太重而导致其他代码出现性能问题,那么,显然您不希望这样做.但是,我认为扩展内置对象通常不是一个坏主意.如果是这样的话,它们也不会公开扩展. (10认同)
  • 布尔解析不属于String类..你最终会得到任何数量的垃圾解析器和转换.-1一般改变原型.-1到跨浏览器不起作用的解决方案.-1表示设计不佳. (7认同)

Stefan Steig.. 47

木眼要小心.在使用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]));}


Jan Remunda.. 33

使用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/

  • `getBool(undefined)`将崩溃当使用原始JSON版本时,将为第二个版本返回true.这是第三个返回false的版本:function getBool(val){var num; return val!= null &&(!isNaN(num = + val)?!! num:!! String(val).toLowerCase().replace(!! 0,'')); } (3认同)

BrDaHa.. 32

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

  • 我会在toLowerCase()之前添加.trim() (2认同)

Jonny Buchan.. 30

你的解决方案很好.

===在这种情况下使用只是愚蠢,因为该领域value永远是一个String.

  • 为什么你认为使用`===`会很愚蠢?就性能而言,如果两种类型都是字符串则完全相同.无论如何,我宁愿使用`===`因为我总是避免使用`==`和`!=`.理由:http://stackoverflow.com/questions/359494/javascript-vs-does-it-matter-which-equal-operator-i-use/359509#359509 (17认同)
  • 因为`value`将始终是一个`字符串`既不是'=='也不是`==='都是愚蠢的.两者都是这项工作的正确工具.它们仅在类型__not__相等时才有所不同.在这种情况下,`===`只返回`false`,而`==`在比较之前执行复杂的类型强制算法. (3认同)

Prestaul.. 22

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());


thdoan.. 18

Boolean对象没有'parse'方法.Boolean('false')返回true,这样就行不通了.!!'false'也返回true,这样也行不通.

如果你想让string 'true'返回布尔值true而字符串'false'返回布尔值false,那么最简单的解决方案是使用eval().eval('true')返回true并eval('false')返回false.请记住使用时的性能影响eval().

  • eval()是一种安全和恶意代码执行风险.别. (8认同)
  • 我同意`var isTrueSet =(myValue ==='true');`是最好的答案. (2认同)

zobier.. 15

我使用以下内容:

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

此函数执行通常的布尔强制,但字符串"false"(不区分大小写)和"0"除外.


sospedra.. 15

有很多答案,很难选择一个.在我的情况下,我在选择时优先考虑性能,所以我创建了这个jsPerf,我希望可以在这里提出一些建议.

结果简述(越高越好):

  1. 条件声明:2,826,922
  2. 在Bool对象上切换案例:2,825,469
  3. 投射到JSON:1,867,774
  4. !转换:805,322
  5. 字符串原型:713,637

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


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


AndreasPizsa.. 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


Hakan Fıstık.. 13

这是从已接受的答案中取得的,但实际上它有一个非常弱点,我很震惊它是如何得到那些upvotes,它的问题,你必须考虑字符串的情况,因为这是区分大小写

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


Sandip Nirma.. 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


Fizer Khan.. 10

将字符串("true","false")和布尔值都转换为布尔值

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

哪里flag可以

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


小智.. 9

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

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

当给出一些其他文本而不是真或假时,它将返回错误,无论情况如何,它也将捕获数字

// 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认同)

小智.. 8

就像@ Shadow2531所说,你不能直接转换它.我还建议你考虑字符串输入,除了"真实"和"假",如果你的代码将被其他人重用/使用,那么它们是"真实的"和"虚假的".这是我使用的:

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


pie6k.. 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"


staticsan.. 7

您需要(在您的思考中)分离您的选择的值和该值的表示.

在JavaScript逻辑中选择一个点,它们需要从字符串标记转换为本机类型并在那里进行比较,最好只需要为每个需要转换的值完成一次.如果字符串sentinel不是脚本知道的那个(即你默认为true还是false?),请记住要解决需要发生的事情.

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


BishopZ.. 7

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

  • 对于truthy和falsey值返回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作为默认值而不是undefined或抛出Error,这在松散类型的Javascript开发中更有用.Bravo到其他建议的答案!


Dead.Rabit.. 7

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

我更喜欢这种方法,因为它不依赖于第三方来解析代码(即: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..


vbranden.. 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
> 


Cliff Mayson.. 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;
}


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


Vitim.us.. 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


OhkaBaka.. 5

神圣的一些这些答案只是疯狂的.我喜欢JS及其无数种方法来涂抹bool.

我不喜欢看到的我的偏好是:

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


归档时间:

查看次数:

1808485 次

最近记录:

8 月,1 周 前