即使价值为假,“真实”评估仍在运行

时间:2012-12-20 16:23:09

标签: javascript jquery boolean-expression

我有一个非常简单的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));

的结果

enter image description here

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

enter image description here

发现问题

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

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

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

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

尝试if (!!r.location.defaultLocation) {}强制该值为boolean类型。

答案 2 :(得分:2)

我认为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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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

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

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