2

我通过将“真实”布尔值传递给函数来在脚本中设置模式。在函数中,一个简单的if语句检查参数是否为truefalse。我有时将它作为一直有效的字符串或布尔值传递,但由于某种原因,它不是为了这个:

setMode: function(Setting) {    
    if (Setting) {
        console.log('Enabling mode');
    } else {
        console.log('Disabling mode');
    }
}

例如,当我将一个字符串传递给控制台'false'并记录Setting到控制台时,控制台说false,但该if语句认为这是真的。

我必须将此添加到函数的开头才能使其工作:

if (typeof Setting == 'string') { Setting = (Setting == "true"); }

它的一个使用示例:

var inverted = $('INPUT[name="Mode"]').prop('checked');
app.setMode(inverted);

另一个:

var mode = localStorage.getItem('Mode');
this.setMode(mode);

这太奇怪了,因为我多年来一直在做这种事情,但现在才刚刚开始。也许是因为我正在使用localStorageand .prop

4

3 回答 3

2

如果您尝试记录'false',很明显控制台记录false(它是一个字符串)并且 if 语句看到true,因为非空字符串是一个真正的布尔值。

如果您想检查字符串是否是"true",或者"false"您必须使用普通运算符进行检查。因此,您可以在函数的开头添加这一行:

Setting = (typeof Setting === 'string') ? Setting === "true" : Setting;
于 2013-05-26T10:52:50.017 回答
2

要回答有关字符串到布尔转换的问题:

ECMA 规格:

如果参数是空字符串(其长度为零),则[此转换的]结果为假;否则结果为真。

所以是的,如果您传递字符串“false”,它将被转换为true,这意味着您唯一的选择是手动检查字符串“true”或“false”并自己进行转换。

但是,jQuery 函数.prop("checked")应该返回一个布尔值(或者undefined如果该属性未定义)。所以我会说你应该能够真正做到

if (elem.prop("checked"))

喜欢这里

于 2013-05-26T11:21:09.327 回答
1

例如,当我将一个字符串传递给它'false'并将其记录到控制台时,控制台说false,但 if 语句认为它是真的。

控制台输出令人困惑,它隐藏了false字符串"false"和 boolean的引号和日志false。然而,这两者并不等价,字符串不是空的,确实是真的。

也许是因为我使用的是 localStorage 和 .prop?

是的。该.checked属性返回一个布尔值,一切正常。相反,本地存储只存储字符串,当你传入一个布尔值时,你会得到它的字符串化。您可以使用

var modeStr = localStorage.getItem('Mode');
var mode = JSON.parse(modeStr);
this.setMode(mode);
于 2013-05-26T11:20:21.793 回答