Javascript 为什么JQuery(!)不返回仅为false的赋值
我在做一个项目,有很多布尔字段。我希望这些字段返回布尔值(1或0)。我不知道这是否是一个令人尴尬的问题,但我不能通过在jQuery中不Javascript 为什么JQuery(!)不返回仅为false的赋值,javascript,jquery,Javascript,Jquery,我在做一个项目,有很多布尔字段。我希望这些字段返回布尔值(1或0)。我不知道这是否是一个令人尴尬的问题,但我不能通过在jQuery中不(!)赋值来更改输入的值。它可以运行两次单击,然后总是返回false。第一次单击时,由于隐藏输入的值为空,因此返回true,第二次单击时返回false为!真=假。之后,在所有单击上,它只返回false 我的Html <div class="col-md-4"> <label>Required?</label&g
(!)
赋值来更改输入的值。它可以运行两次单击,然后总是返回false
。第一次单击时,由于隐藏输入的值为空,因此返回true
,第二次单击时返回false
为!真=假
。之后,在所有单击上,它只返回false
我的Html
<div class="col-md-4">
<label>Required?</label>
<input type="checkbox" name="" class="form-control required_field">
<input type="hidden" name="field_required[]" value="">
</div>
它与三元运算符和if else
,如果我将其与以下值进行比较:
$('.div').on('click','.required_field',function(){
$(this).siblings('input').val(($(this).siblings('input').val()==1)?0:1);
console.log($(this).siblings('input').val());
});
或
我觉得很奇怪怎么会是!假=假
??我错过了什么?这让我很烦。如果有人能向我解释这一点,我将非常高兴。先谢谢你
以下是代码的详细信息。问题是因为任何非空字符串都强制为true,即使它包含单词
“false”
,或数字“0”
。因此,!“false”
总是false
要解决此问题,您需要使用代码>。右边的代码>将字符串转换为布尔值,左边的代码>运算符反转该结果
$('div')。在('click','上。必填字段,'函数(){
设v=!!$(this.sibbines('input').val();
$(this.sibbines('input').val(v);
});代码>
必修的?
谢谢大家帮助我,你们真是棒极了
我做了一些挖掘,得出了以下结论:
下面是上面代码中发生的事情。每次从HTML
元素获取输入值时,它都是一个字符串。第一次单击中的值将是一个空字符串,(!“”)
(就像如果empty为false!empty为true一样)将是true,这与相同!0
这是正确的。在第二次单击中,输入值将是“true”
(一个字符串)和!'true“
(值不是空的,因此将返回false)为false。在那之前,一切看起来都很完美。在此之后,每隔一次单击将返回false
string valuenot(!)运算符
将返回false,因为该值不是空的
更好地理解
//first click
console.log('first click');
let v = '';
console.log('!v is: '+!v);
console.log('typeof !v is: '+typeof(!v));
console.log(!v);
v = !v;
//second click
console.log('Second click');
v='true';
console.log('!v is: '+!v);
console.log('typeof !v is: '+typeof(!v));
console.log(!v);
//third click
console.log('Third click');
v='false';
console.log('!v is: '+!v);
console.log('typeof !v is: '+typeof(!v));
console.log(!v);
//Fourth click
console.log('Fourth click');
v='false';
console.log('!v is: '+!v);
console.log('typeof !v is: '+typeof(!v));
console.log(!v);
要克服此问题并保留布尔值,请执行以下操作:
$('div').on('click', '.required_field', function() {
let v = !($(this).siblings('input').val()==='true');
$(this).siblings('input').val(v);
console.log($(this).siblings('input').val());
});
我得到了以下方面的帮助:
HTML输入返回字符串,由于JS的松散类型!“0”
仍然是false
x==1
与不完全相同!x
是否确实要反转值?也许!!x
?您实际上是在评估!“假”变成了!正确的结果是false@nip谢谢你们,谢谢你们。我了解这个问题。谢谢你们的解决方案,但我很好奇为什么!true
在第二次单击时返回false
?在第一次单击时,值是一个空字符串,这将正确强制为false
。感谢您的澄清。我理解这个问题。现在添加代码>第二次单击后仍为真。确实如此。如果您所要做的只是将checked
标志的布尔状态存储在文本框中(这本身有点多余),只需直接使用checked
属性:$(this).sibbines('input').val(this.checked)代码>
//first click
console.log('first click');
let v = '';
console.log('!v is: '+!v);
console.log('typeof !v is: '+typeof(!v));
console.log(!v);
v = !v;
//second click
console.log('Second click');
v='true';
console.log('!v is: '+!v);
console.log('typeof !v is: '+typeof(!v));
console.log(!v);
//third click
console.log('Third click');
v='false';
console.log('!v is: '+!v);
console.log('typeof !v is: '+typeof(!v));
console.log(!v);
//Fourth click
console.log('Fourth click');
v='false';
console.log('!v is: '+!v);
console.log('typeof !v is: '+typeof(!v));
console.log(!v);
$('div').on('click', '.required_field', function() {
let v = !($(this).siblings('input').val()==='true');
$(this).siblings('input').val(v);
console.log($(this).siblings('input').val());
});