2012-04-23 134 views
7

我需要根据某些广播组的值禁用/启用某个按钮。这些收音机由一些常规代码填充,因为我使用grails,这是Groovy的框架,这是java的超集。那么解释就是说无线电的价值被定义为布尔值,这很自然,因为它们对应于是/否的答案。Javascript布尔值:false && true true results in true

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

这里的另一个变量之间是有问题的代码peice的:

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 == true?请注意,这些值没有引号,因此它们是布尔值(我正在使用Chrome控制台进行调试,它代表双引号内的字符串,因此您可以区分true和“true”)。

任何想法?

另外,像var x = true && false这样的手动比较总是按预期工作,对于存在问题的变量是非常有用的。

+0

因为这显然是很奇怪的,我想减少这种例子在最小测试用例将是你有用。 – zmccord 2012-04-23 05:16:48

+1

http://twitter.com/#!/mattmight/statuses/191964430312030208在PHP和JavaScript中,“==”发音为“可能等于”。 – 2012-04-23 05:36:33

回答

11

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

看到这个问题的全部细节; JavaScript === vs == : Does it matter which “equal” operator I use?

+0

如果它不是一个布尔值,那么我认为它被隐含地转换为一个,因为控制台输出的是真,而不是“真”或“真”。另外,当我尝试将广播的值放入标签或其他所有html标签中时,直到明确地转换'.toString()'后才会显示它。这就是为什么我认为它是一个布尔值而不是字符串。 – GalmWing 2012-04-23 05:51:06

+0

我最终扔掉了布尔和使用的数字。作为一个教训:在js中,当值存在于HTML标签中时,从不使用布尔值。由于这个答案陈述了真正的问题“实际上并不是一个布尔值,所以它是一个字符串”,我会接受它(并且对于延迟延迟抱歉)。 – GalmWing 2012-10-22 01:29:38

0

尝试按位和&&&。后者适用于条件比较,但不适用于将值分配给变量。

0

这真的是你想要做的吗? :

actual = actual && this.value; 

这是一样的:

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

actual总是true在你的代码中定义的,所以actualthis.value,而不是一个布尔值。

+0

这是我究竟在做什么? 'actual'并不总是如此,就像你在日志输出中看到的一样。 – GalmWing 2012-04-23 05:57:15

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); 
}); 
2

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

返回expr1是否可以转换为false;否则,返回 expr2。

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

,如果你试图用逻辑运算符来计算,记住:

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法官的第一个操作数,如果是真的它将返回第二个操作数,否则返回false;它就像:

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

result = first ? second : false; 

这是JavaScript逻辑运算符实际运作方式。 你必须在不同的变量类型之间进行严格的比较:

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

字符串不是空等于(布尔型),甚至是“假的”。

,并记住,HTML元素的属性是“字符串” s