Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么JQuery(!)不返回仅为false的赋值_Javascript_Jquery - Fatal编程技术网

Javascript 为什么JQuery(!)不返回仅为false的赋值

Javascript 为什么JQuery(!)不返回仅为false的赋值,javascript,jquery,Javascript,Jquery,我在做一个项目,有很多布尔字段。我希望这些字段返回布尔值(1或0)。我不知道这是否是一个令人尴尬的问题,但我不能通过在jQuery中不(!)赋值来更改输入的值。它可以运行两次单击,然后总是返回false。第一次单击时,由于隐藏输入的值为空,因此返回true,第二次单击时返回false为!真=假。之后,在所有单击上,它只返回false 我的Html <div class="col-md-4"> <label>Required?</label&g

我在做一个项目,有很多布尔字段。我希望这些字段返回布尔值(1或0)。我不知道这是否是一个令人尴尬的问题,但我不能通过在jQuery中不
(!)
赋值来更改输入的值。它可以运行两次单击,然后总是返回
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 value
not(!)运算符
将返回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());
});