3

在构建一个应该传递布尔值的 jQuery 插件时,以用户友好的方式将输入转换为布尔值的最简单的方法是什么?

更准确地说:我担心人们可能会传递一个 String of 'false'(而不是 plain false),因此对!!optionor的简单转换Boolean(option)将返回“错误”值(!!'false'is true)。

目前我正在检查我var option的这样的:

if (typeof(option) != 'boolean'){
    if (option === 'false'){
        option = false; //fake false
    } else {
        option = !!option; //everything else is converted as truthy / falsy in a standard manner  
    }
}

但我想知道是否有更优雅和简洁的方式来做到这一点,或者这只是 JavaScript 处理这个的方式?

4

3 回答 3

4

我会这样做。

var result = ( userInput === true );

此结果返回 true 的唯一方法是类型为布尔值且值为 true。否则其他一切都是假的。不要浪费时间去纠正别人的错误。

但是....如果您手头有很多时间,那么试试这个。

var getBooleanValue = function( userInput ){
    if( !userInput ){
        return false;
    }
    var boolNames = {
        'true':1, 'yes':1,
        'false':0,'no':0,
        'yourMoM':1
    };
    return (userInput in boolNames && !!boolNames[ userInput ])|| ( userInput === true );
};
var tests = [
    [ true, true ],
    [ 'true', true ],
    [ 'yes', true ],

    [ false, false ],
    [ 'false', false ],
    [ 'no', false ]
];
var runTest = function( tests ){
    var i = tests.length;
    while( i-- ){
        if( getBooleanValue(tests[i][0]) !== tests[i][1] ){
            throw new Error( "Test error: getBooleanValues( " + tests[i][0] + ") should return " + tests[i][1] );
        }
    }
};
runTest( tests );
于 2012-04-29T15:52:49.723 回答
4

最简单的方法,如果你害怕这样的输入,就是这样做

if (typeof(option) != 'boolean')
    console.error('Function X expects a Boolean.');

看看你现在的解决方案,你没有考虑到0or 1no或者或者怎么样yes

字符串和整数不应该用作布尔值。所以,没有必要解析它们。


看看高质量/使用 JS 框架,他们不这样做。 你为什么要?

于 2012-04-29T15:56:33.683 回答
3

我会做这样的事情:

var falsey = ["0", "", "false", "null", "undefined", "NaN"];
var isFalse = false;

for(var i = 0, len = falsey.length; i < len; i++){
    if(options + "" == falsey[i]){
        isFalse = true;
        break;
    }
}

我所做的是对 theoptions和 false 值进行字符串化0, "", false, null, undefined, NaN

无论它们是什么,这都会检测到它们(技术类似于搜索词和比较词的大写)

因为列表很短,您也可以使用 switch case 或 ifs

于 2012-04-29T16:02:48.297 回答