Javascript 布尔值:false && true 结果为 true

Javascript booleans: false && true results in true

本文关键字:true amp 结果 布尔值 false Javascript      更新时间:2023-09-26

我需要根据某些单选组的值禁用/启用按钮。这些无线电由一些时髦的代码填充,因为我使用的是grails,一个时髦的框架,它是java的超集。这种解释是说无线电的值被定义为布尔值,这是很自然的,因为它们对应于是/否答案。

现在,要禁用/启用此按钮,我使用了一些 javascript,但它带有布尔值。正如标题所述,在某些时候,我在一个保存false的变量和另一个保存true的变量之间做了一个逻辑和

这是一段有问题的代码:

var actual = true;
$('.requerido input:radio:checked').each(function() {
    console.log("actual: " + actual);
    console.log("value: " + this.value);
    console.log("actual and value: " + (actual && this.value));
    actual = actual && this.value;
    console.log("actual: " + actual);
});

如您所见,我使用控制台.log进行调试,这就是在某个时候抛出的内容:

actual: true
value: true
actual and value: true
actual: true
actual: true
value: false
actual and value: false
actual: false
actual: false
value: true
actual and value: true
actual: true

所以真 &&假 == 假,但假 &&&真 == 真 ?请注意,这些值没有引号,因此它们是布尔值(我正在使用 Chrome 控制台进行调试,该控制台表示双引号内的字符串,因此您可以区分 true 和"true")。

有什么想法吗?

此外,像var x = true && false这样进行手动比较总是按预期工作,是问题存在的变量。

选中

的单选按钮输入中的this.value实际上不是布尔值,而是字符串。字符串和布尔值的比较可能会导致此类问题。它被认为是最佳实践的原因之一是使用===进行比较。

有关完整详细信息,请参阅此SO问题;JavaScript === vs == : 我使用哪个"相等"运算符重要吗?

请注意,&&执行以下操作:

如果可以转换为 false,则返回 expr1;否则,返回 expr2.

因此,在以下情况下:

var truish=true;//interchangeable with anything different than 0,"",false,null,undefined,NaN
var falsish=null;//interchangeable with 0,"",false,null,undefined,NaN
alert(truish&&falsish);//null (falsish was returned)

返回的值不一定是布尔值,对此的解决方案是强制布尔!(x&&y)

所以我的猜测是这样的事情正在发生

如果您尝试使用逻辑运算符进行计算,请记住:

var result = true && "false";// always results (string) "false"
var result = true && "true";// always results (string) "true"
var result = false && "true";// always results (boolean) false
var result = false && "false";// always results (boolean) false
var result = "true" && true;// always results (boolean) true
var result = "true" && false;// always results (boolean) false
var result = "false" && true;// always results (boolean) true
var result = "false" && false;// always results (boolean) false
var result = "true" && "true";// always results (string)"true"
var result = "true" && "false";// always results (string) "false"
var result = "false" && "true";// always results (string) "true"
var result = "false" && "false";// always results (string) "false"

因为:JavaScript 判断第一个操作数,如果为 true,它将返回第二个操作数,否则返回 false;它就像:

var first = true
var second = "false";
if (first) {
    result = second;
} else {
    result = false;
}

result = first ? second : false;

这就是JavaScript逻辑运算符实际工作的方式。您必须对不同的变量类型进行严格的比较:

result = true && (value==="false");

不为空的字符串等于(布尔值)真,甚至等于"假"。

并记住 html 元素属性是"字符串"的

这必须与无线电控件的值(其中一个)有关,因为在纯 javascript 中,这按预期计算:

function boolx(tf,val){ 
  var test = tf && val;
  console.log([tf,val,tf && val,test]); 
}
tf(true,false); //=> [true,false,false,false]
tf(false,true); //=> [false,true,false,false]

也许显式转换this.value会有所帮助,因为this.value实际上是一个字符串:

var actual = true;
$('.requerido input:radio:checked').each(function() {
    var val = /true/i.test(this.value);
    console.log("actual: " + actual);
    console.log("value: " + val);
    console.log("actual and value: " + (actual && val));
    actual = actual && val;
    console.log("actual: " + actual);
});

尝试按位&&&。后者适用于条件比较,但不适用于为变量赋值。

这真的是你想做的吗?

actual = actual && this.value;

这与:

if (actual) {
    actual = this.value;
}

actual始终按照代码中的定义true,因此actual将是this.value而不是布尔值。