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

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

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

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

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

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

答案

做:

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

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

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

别:

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

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

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

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

警告

从技术上讲,这个高度推崇的旧式答案是正确的,但是仅当字符串值完全为"true""false"时,才涵盖非常特定的情况。

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


原始答案:

怎么样?

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

或与 jQuery

$.parseJSON("TRUE".toLowerCase());
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);
    }
}

我认为这很普遍:

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

它去了:

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

请记住要区分大小写:

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

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

var isTrueSet = document.myForm.IS_TRUE.checked;

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

您可以使用正则表达式:

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

木眼要小心。在对 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 解析的通用解决方案:

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/

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

如果您已经知道所有true情况,就不必涵盖所有false情况。您可以将任何可以传递为true值的方法传递给此方法(或添加其他值,这非常简单),其他所有内容都将被视为false

您的解决方案很好。

在这种情况下,使用===会很愚蠢,因为该字段的value始终是String