Javascript布尔值:假&&真实的结果

时间:2012-04-23 05:12:29

标签: javascript

我需要根据某些无线电组的值禁用/启用按钮。这些无线电由一些常规代码填充,因为我使用的是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这样的手动比较总是按预期工作,但是会出现问题存在的变量。

6 个答案:

答案 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而不是布尔值。