首页 文章

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

提问于
浏览
1972

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

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

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

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

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

30 回答

  • 5

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

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

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

  • 13
    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);
        }
    }
    
  • 8

    我认为这很普遍:

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

    它会:

    String(true) == "true"     //returns true
    String(false) == "true"    //returns false
    String("true") == "true"   //returns true
    String("false") == "true"  //returns false
    
  • 553
    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;
    }
    
  • 8

    Boolean对象没有'解析'方法 . Boolean('false') 返回true,因此无效 . !!'false' 也返回 true ,因此也不起作用 .

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

  • 194

    另一种方案 . 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
    >
    
  • 11

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

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

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

    // 0-> false
    // any other number -> true
    
  • 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到其他建议的答案!

  • 15

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

    我使用以下内容:

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

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

  • 5

    做:

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

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

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

    不要:

    您应该 be cautious about using these two methods 满足您的特定需求:

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

    任何不是空字符串的字符串都将使用它们计算为 true . 虽然他们不是你想要的 .

  • 26

    你正在寻找的表达方式就是

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

    就像@ 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;
      }
    }
    
  • 40
    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.");
      }
    };
    
  • 21

    已经有很多答案可供选择 . 但在某些情况下,以下内容可能很有用 .

    // 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
    
  • 2654

    你的解决方案很好 .

    在这种情况下使用 === 只是愚蠢,因为字段的 value 将始终是 String .

  • 106
    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());
    
  • 29

    我有点晚了,但我有一个小片段来做这件事,它基本上维护了所有的JScripts truthey / falsey / filthy-ness但是包含 "false" 作为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..
    
  • 6

    您可以使用正则表达式:

    /*
     * 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显示为真.Bug 720760

  • 107

    我认为@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 值(或添加其他值,它非常简单),其他所有内容都将被视为 false

  • 8

    我写了一个函数来匹配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;
    };
    
  • 12

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

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

    记得要匹配案例:

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

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

    var isTrueSet = document.myForm.IS_TRUE.checked;
    

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

  • 7

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

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

    哪里 flag 可以

    var flag = true
     var flag = "true"
     var flag = false
     var flag = "false"
    
  • 130

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

    结果简述(越高越好):

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

  • 11

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

  • 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"
    
  • 17

    以最简单的方式(假设你的字符串将是'true'或'false')是:

    var z = 'true';
    var y = 'false';
    var b = (z === 'true'); // will evaluate to true
    var c = (y === 'true'); // will evaluate to false
    

    Always 使用===运算符而不是==运算符进行这些类型的转换!

  • 7

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

    警告

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

    传递给 WILL throw an exception 下面的这些函数的无效json字符串 .


    Original answer:

    怎么样?

    JSON.parse("true");
    

    或者使用jQuery

    $.parseJSON("true");
    

相关问题