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

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

一旦字段转换为字符串,我唯一能找到的确定它的布尔值的方法就是依赖于它的字符串表示的文字值。

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

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


当前回答

一个衬垫

我们只需要考虑“false”字符串,因为任何其他字符串(包括“true”)都已为true。

function b(v){ return v==="false" ? false : !!v; }

Test

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

Test

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

其他回答

以下内容就足够了

String.prototype.boolean = function() {
    return "true" == this; 
};

"true".boolean() // returns true "false".boolean() // returns false

const boolTrue=JSON.parse(“true”)const boolFalse=JSON.parse(“false”)console.log(boolTrue)//trueconsole.log(boolFalse)//false

要将字符串布尔值(如“true”)转换为实际布尔值,只需包装为JSON.parse()示例:JSON.parse(“true”)

许多现有的答案都是相似的,但大多数人忽略了一个事实,即给定的论点也可能是一个对象。

这是我刚刚想到的:

Utils.parseBoolean = function(val){
    if (typeof val === 'string' || val instanceof String){
        return /true/i.test(val);
    } else if (typeof val === 'boolean' || val instanceof Boolean){
        return new Boolean(val).valueOf();
    } else if (typeof val === 'number' || val instanceof Number){
        return new Number(val).valueOf() !== 0;
    }
    return false;
};

…和它的单元测试

Utils.Tests = function(){
    window.console.log('running unit tests');

    var booleanTests = [
        ['true', true],
        ['false', false],
        ['True', true],
        ['False', false],
        [, false],
        [true, true],
        [false, false],
        ['gibberish', false],
        [0, false],
        [1, true]
    ];

    for (var i = 0; i < booleanTests.length; i++){
        var lhs = Utils.parseBoolean(booleanTests[i][0]);
        var rhs = booleanTests[i][1];
        var result = lhs === rhs;

        if (result){
            console.log('Utils.parseBoolean('+booleanTests[i][0]+') === '+booleanTests[i][1]+'\t : \tpass');
        } else {
            console.log('Utils.parseBoolean('+booleanTests[i][0]+') === '+booleanTests[i][1]+'\t : \tfail');
        }
    }
};

可以按如下方式使用JSON.parse:

var trueOrFalse=“真”;result=JSON.parse(trueOrFalse.toLowerCase());if(结果==真)警报(“这是真的”);其他的警报(“这是错误的”);

在这种情况下,toLowerCase很重要

答案很多,很难选出一个。在我的情况下,我在选择时会优先考虑性能,所以我创建了这个jsPerf,我希望它能给我们带来一些启示。

结果简述(越高越好):

条件语句:2826922Bool对象上的开关盒:2825469转换为JSON:1867774!! 转换:805322字符串原型:713637

它们与相关答案相关联,在那里你可以找到关于每一个答案的更多信息(利弊);特别是在评论中。