【问题标题】:"true" evaluation running even when value is false即使值为假,“真”评估也会运行
【发布时间】:2012-12-20 16:23:08
【问题描述】:

我有一个非常简单的 jquery 需要检查从 ajax 调用返回的布尔值,并设置一个复选框来检查它是否为真。

console.log("loc: " + r.location.defaultLocation);
if( r.location.defaultLocation == true ) {
    $('#loc-default').attr('checked',true);
}

这在打开模式表单的 onclick 函数中运行 - 如果返回的位置信息表明这是默认位置,则应选中该复选框。我们在一个页面上有 5 个这样的位置 - 即用户可以点击的 5 个位置。

我遇到的是,即使 r.location.defaultLocation 返回 false(根据 console.log 行),该复选框仍处于选中状态。我做错了什么?

对于那些坚持 true/false 必须是字符串而不是布尔值的人:

这是console.info(typeof(r.location.defaultLocation));的结果

这是console.dir(r) 的结果,如果有帮助的话。 (group 是模糊的,因为它是敏感信息。)

发现问题

显然 jquery 记得#loc-default 在第一个被标记为检查后被检查。我在函数中添加了一个 else,现在它可以工作了:

if( r.location.defaultLocation == true ) {
    $('#loc-default').attr('checked',true);
}
else {
    $('#loc-default').attr('checked', false);
}

【问题讨论】:

  • 只需使用if( r.location.defaultLocation ) {。与您的问题无关,但当我看到== true 时让我很恼火:P
  • 并使用prop 而不是attr。
  • 您确定r.location.defaultLocation 是布尔值而不是字符串吗?
  • r.location.defaultLocation 是否已初始化?如果是这样,它总是正确的。 r.location.defaultLocation 的值是多少?您可能想对此进行测试。
  • @Doorknob - 我先尝试过,得到了相同的结果,所以我想我会回到完整版看看它是否有所作为。

标签: javascript jquery boolean-expression


【解决方案1】:

我能看到发生这种情况的唯一方法是,如果 defaultLocation 实际上不是布尔值 false,而是字符串“false”,它的计算结果为 true。

【讨论】:

    【解决方案2】:

    确保r.location.defaultLocation 是一个布尔值。

    尝试if (!!r.location.defaultLocation) {} 将值强制为布尔类型。

    【讨论】:

    • 唯一的问题是!!"false"变成true。
    • @Mottie 不会将!!false 变成false:即!(!false) -> !(true) -> false?
    • @mikeTheLiar 是的,但"false" 是一个字符串,所以!!"anything" 将永远是true
    【解决方案3】:

    我认为r.location.defaultLocation 是字符串 "false"。所以如果你在上面使用console.log,你会看到"false"。但"false" == true 是真的。

    您可以使用typeof检查变量的类型。

    console.log(typeof r.location.defaultLocation); // Log the current type of r.location.defaultLocation
    console.log(typeof false); // Display boolean
    console.log(typeof "false"); // Display string
    

    【讨论】:

    • 不会记录"false" 吗?没关系她正在连接字符串
    • 不是字符串;我已经对此进行了测试。这绝对是一个布尔值 true/false。
    【解决方案4】:

    由于您的代码看起来是正确的,我会尝试处理 else 语句并强制不选中复选框。

    if( r.location.defaultLocation == true ) {
        $('#loc-default').attr('checked',true);
    } else {
        $('#loc-default').attr('checked',false);
    }
    

    【讨论】:

    • 很高兴您得到了答案!你能通过检查他的解决方案来赞扬 Kenji 吗? :)
    【解决方案5】:

    首先我会检查r.location.defaultLocation 是什么

     console.info(typeof(r.location.defaultLocation));
    

    然后我会从那里开始,但使用上面的代码:

     if (!!r.location.defaultLocation && typeof(r.location.defaultLocation)==="string") {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      • 1970-01-01
      • 2016-08-25
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多