javascript - string转bool - 字符串转布尔值




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

做:

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

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

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

别:

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

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

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

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

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

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

一旦将字段转换为字符串,我可以发现确定字段布尔值的唯一方法是依赖于字符串表示形式的字面值。

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

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


警告

这个高度优先的遗留答案在技术上是正确的,但只包含一个非常具体的情况,当你的字符串值完全是"true""false" (必须是小写)。

传递给下面这些函数的无效json字符串将会抛出异常

原始答案:

怎么样?

JSON.parse("true");

或与jQuery

$.parseJSON("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对象的其他代码冲突的人(请参阅注释):

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


你正在寻找的表达只是

/^true$/i.test(myValue)

如在

var isTrueSet = /^true$/i.test(myValue);

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

你需要分离(在你的思维中)你选择的价值和价值的表示。

在JavaScript逻辑中选择一个点,它们需要从字符串标记转换为本地类型,然后在那里进行比较,最好是只对每个需要转换的值完成一次。 请记住,如果字符串标记不是脚本知道的(即,您是否默认为true或false),那么需要解决什么问题?

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


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

就像@ 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;
  }
}

已经有很多答案可用。 但在以下情况下可能会有用。

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

我使用以下内容:

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

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


我写了一个函数来匹配PHP的filter_var,这很好地做到了。 要点如下: https://gist.github.com/CMCDragonkai/7389368https://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;
};

我有点晚了,但我有一小段代码要做到这一点,它基本上保持了所有JScripts truthey / falsey / filthyness,但包括"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..

我正在使用这个

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"

我认为这个问题是为了实现三个目标:

  • 对于真值和伪值,返回真/假,但对于多个字符串值,如果它们是布尔值而不是字符串,则会返回真/假。
  • 其次,提供一个弹性接口,以便除了指定的值以外的值不会失败,而是返回一个默认值
  • 第三,尽可能使用尽可能少的代码来完成这一切。

使用JSON的问题是,它导致Javascript错误失败。 该解决方案不具有弹性(尽管满足1和3):

JSON.parse("FALSE") // fails

这个解决方案不够简洁:

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

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

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

它适用于很多情况,在传入{}等值时不会失败,并且非常简洁。 此外,它返回false作为默认值而不是未定义或抛出一个错误,这在松散类型的Javascript开发中更为有用。 布拉沃到其他建议它的答案!


我认为这非常普遍:

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

它是:

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

有很多答案,很难选择一个答案。 就我而言,我在选择时优先考虑性能,所以我创建了这个jsPerf ,我希望可以在这里引起一些注意。

结果简述(越高越好):

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

它们与相关的答案相关,你可以找到关于每个答案的更多信息(优缺点); 特别是在评论中。


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

这是从公认的答案中得出的,但实际上它有一个非常薄弱的​​地方,我很震惊它是如何得到upvotes的数量,它的问题是你必须考虑字符串的情况,因为这是区分大小写的

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

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

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

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




javascript