Javascript 布尔值:false && true 结果为 true
Javascript booleans: false && true results in true
我需要根据某些单选组的值禁用/启用按钮。这些无线电由一些时髦的代码填充,因为我使用的是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
而不是布尔值。
- 如何在angularJS中编辑时,如果DB中的值为true,则设置复选框,如果值为false,则取消选中复选框
- jquery点击函数select&取消选择
- Windows8应用程序(html&Javascript):从图片库(除了文件选择器)显示图像的另一种方式
- AngularJS-使用'true'属性
- Angular js-返回一个包含类似
- 一点javascript元编程&可链接的设置器
- 通过JSON&比较时间
- Jquery模板,如果xx&&如果yy
- jQuery工具验证器自定义效果-添加&消除影响
- Twitter引导程序Typeahead-Id&标签
- AngularJS&JSON-从Previous&下一个对象
- JavaScript-切换“;全部检查”;复选框true/false
- 什么是&&在没有if的行中的变量之间
- location.reload(true)崩溃浏览器选项卡
- 指令的模板必须只有一个根元素:With restrict E&替换true
- 为什么布尔(true)&&string是javascript中的字符串
- 如何使真实&&angularjs表达式中的false等于true
- 我如何使计时器启动&只有当onFocus为true时才能工作
- 将复选框的默认值绑定到角度模型,其中true和amp;false表示为'是'&'没有'
- JavaScript执行函数数组&如果全部返回True,则返回True