【问题标题】:JavaScript IF statement boolean strictJavaScript IF 语句 boolean strict
【发布时间】:2013-05-21 10:37:21
【问题描述】:

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

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

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

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

if (typeof Setting == 'string') { 设置=(设置==“真”); }

使用示例:

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

还有一个:

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

这太奇怪了,因为我已经做了很多年了,但现在才刚刚开始。可能是因为我使用的是localStorage.prop

【问题讨论】:

  • localStorage 只能存储字符串。我建议对 LS 的访问始终包含在 JSON.parse/stringify 对中。
  • 这有关系吗?如果是字符串或布尔值,if 语句仍会将其视为 truefalse,但在这种情况下并非如此。
  • 此外,我还尝试使用具有相同结果的复选框。

标签: javascript jquery html if-statement boolean


【解决方案1】:

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

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

Setting = (typeof Setting === 'string') ? Setting === "true" : Setting;

【讨论】:

  • 这不适用于字符串 'false'。 !!'false' === true
  • 查看我更新的答案,空字符串为假,非空为 JS。
  • if (!!Setting)if (Setting) 有什么不同,除了添加无用的混乱?
  • 登录Setting!!Setting 是不同的,反正你是对的,在这种情况下它不会改变任何东西,最好的方法是添加if (typeof Setting == 'string') { Setting = (Setting == "true"); }
  • 为什么我需要强制它为布尔值? if 语句不应该将其视为truefalse,因为它是truthyfalsy
【解决方案2】:

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

ECMA 规范:

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

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

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

if (elem.prop("checked"))

点赞here

【讨论】:

    【解决方案3】:

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

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

    可能是因为我使用的是 localStorage 和 .prop?

    是的。 .checked 属性返回一个布尔值,一切正常。相比之下,local storage only stores strings,当你传入一个布尔值时,你会得到它的字符串化。您可以使用

    撤消该操作
    var modeStr = localStorage.getItem('Mode');
    var mode = JSON.parse(modeStr);
    this.setMode(mode);
    

    【讨论】:

      猜你喜欢
      • 2016-06-02
      • 1970-01-01
      • 2015-11-09
      • 1970-01-01
      • 2021-09-11
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 2016-06-21
      相关资源
      最近更新 更多