8

我需要根据某些无线电组的值禁用/启用按钮。这些收音机由一些 groovy 代码填充,因为我使用的是 grails,一个 groovy 框架,它是 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);
});

如您所见,我使用 console.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

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

有任何想法吗?

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

4

6 回答 6

13

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

有关详细信息,请参阅此 SO Question;JavaScript === vs == :我使用哪个“等于”运算符重要吗?

于 2012-04-23T05:25:55.227 回答
3

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

如果可以转换为 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)

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

于 2012-04-23T05:25:35.587 回答
2

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

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 元素属性是“字符串”

于 2012-04-23T05:44:33.953 回答
1

这必须与您的无线电控件的(其中一个)值有关,因为在普通的 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);
});
于 2012-04-23T05:23:19.530 回答
0

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

于 2012-04-23T05:22:15.740 回答
0

这真的是你想做的吗?:

actual = actual && this.value;

这与以下内容相同:

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

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

于 2012-04-23T05:23:05.517 回答