我需要根据某些无线电组的值禁用/启用按钮。这些无线电由一些常规代码填充,因为我使用的是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
如此真实&& false == false,但false&&是= =是吗?请注意,这些值没有引号,因此它们是布尔值(我使用Chrome控制台调试,它代表双引号内的字符串,因此您可以区分true和“true”)。
有什么想法吗?
另外,像var x = true && false
这样的手动比较总是按预期工作,但是会出现问题存在的变量。
答案 0 :(得分:13)
来自您选中的单选按钮输入的this.value
实际上不是布尔值,而是字符串。字符串和布尔值的比较可能会导致这样的问题。这是为什么最佳做法是使用===
进行比较的原因之一。
有关详细信息,请参阅此SO问题; JavaScript === vs == : Does it matter which “equal” operator I use?
答案 1 :(得分:3)
请注意,&&
执行以下操作:
如果可以转换为false,则返回expr1;否则,返回 表达式2。
<子> source 子>
所以在以下情况下:
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)
所以我猜这样的事情正在发生
答案 2 :(得分: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");
非空的字符串等于(boolean)true,甚至是“false”。
并记住html元素属性是“String”s
答案 3 :(得分: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);
});
答案 4 :(得分:0)
尝试按位和&
副&&
。后者适用于条件比较,但不适用于为变量赋值。
答案 5 :(得分:0)
这真的是你想要做的吗? :
actual = actual && this.value;
这与:
相同if (actual) {
actual = this.value;
}
actual
始终是代码中定义的true
,因此actual
将是this.value
而不是布尔值。