Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.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 逻辑运算符后不减少array.length的Pop_Javascript_Arrays_While Loop_Logical Operators - Fatal编程技术网

Javascript 逻辑运算符后不减少array.length的Pop

Javascript 逻辑运算符后不减少array.length的Pop,javascript,arrays,while-loop,logical-operators,Javascript,Arrays,While Loop,Logical Operators,我有一种奇怪的行为,我从未见过,也不理解。我将使用arrayname.length作为while循环的控件遍历一个数组。这通常按预期工作,但是当数组的长度没有减少到第一次迭代之后,这个特殊情况会创建一个无止境的循环 while( data.length > 0){ finalCheck = finalCheck && data.pop(); } 这里,初始长度为4,最终检查从true开始。第一对数组元素为false 正如第一次迭代时所预期的,finalCheck变

我有一种奇怪的行为,我从未见过,也不理解。我将使用arrayname.length作为while循环的控件遍历一个数组。这通常按预期工作,但是当数组的长度没有减少到第一次迭代之后,这个特殊情况会创建一个无止境的循环

while( data.length > 0){
    finalCheck = finalCheck && data.pop();
}
这里,初始长度为4,最终检查从true开始。第一对数组元素为false


正如第一次迭代时所预期的,finalCheck变为false,data.length变为3,但之后每次迭代的data.length都保持在3。。。有人知道为什么会这样吗

如果
finalCheck
变为false,为什么需要执行
data.pop()
?JavaScript解释器正确短路,并且没有计算表达式的右侧

如果您试图等到
finalCheck
为true,则可能需要使用
|
运算符:

finalCheck = false; // initially anyway
while( data.length > 0 && !finalCheck){
    finalCheck = finalCheck || data.pop();
}

您还需要确保在达到终止条件时打破循环

如果
finalCheck
变为false,为什么需要执行
data.pop()
?JavaScript解释器正确短路,并且没有计算表达式的右侧

如果您试图等到
finalCheck
为true,则可能需要使用
|
运算符:

finalCheck = false; // initially anyway
while( data.length > 0 && !finalCheck){
    finalCheck = finalCheck || data.pop();
}

您还需要确保在达到终止条件时打破循环

finalCheck
在某个点变为false,导致
data.pop()
无法执行。然后,循环变得无限大

data.pop()
返回从数组中删除的元素。如果值的计算结果为false,则在下一次迭代中不会删除任何元素,从而导致
data.length
始终大于零

var data = [0, 1], finalCheck = false;
while( data.length > 0){
    finalCheck = finalCheck && data.pop(); //Hello infinite loop
}
在前面显示的示例中,
finalCheck
在迭代之前已经是
false
,导致永远不会执行
data.pop()。即使将
finalCheck
初始化为
true
finalCheck
也将设置为零,并再次被卡住

要修复代码,您至少应使用:

while( data.length > 0 && finalCheck){
    finalCheck = data.pop(); //Bye infinite loop
}

finalCheck
在某个点变为false,导致
data.pop()
无法执行。然后,循环变得无限大

data.pop()
返回从数组中删除的元素。如果值的计算结果为false,则在下一次迭代中不会删除任何元素,从而导致
data.length
始终大于零

var data = [0, 1], finalCheck = false;
while( data.length > 0){
    finalCheck = finalCheck && data.pop(); //Hello infinite loop
}
在前面显示的示例中,
finalCheck
在迭代之前已经是
false
,导致永远不会执行
data.pop()。即使将
finalCheck
初始化为
true
finalCheck
也将设置为零,并再次被卡住

要修复代码,您至少应使用:

while( data.length > 0 && finalCheck){
    finalCheck = data.pop(); //Bye infinite loop
}

循环中的条件使用短路
&&
运算符,因此只要
finalCheck
为false,将不再调用
pop

只要
finalCheck
变为false,您就可以跳过循环。一旦它是假的,它就永远不会再变成真的,因此没有理由在这一点上继续:

while (finalCheck && data.length > 0) {
  finalCheck = finalCheck && data.pop();
}

循环中的条件使用短路
&&
运算符,因此只要
finalCheck
为false,将不再调用
pop

只要
finalCheck
变为false,您就可以跳过循环。一旦它是假的,它就永远不会再变成真的,因此没有理由在这一点上继续:

while (finalCheck && data.length > 0) {
  finalCheck = finalCheck && data.pop();
}

哦,我没有想到这一点,因为我没有在条件的上下文中使用“AND”操作符。我希望它使用逻辑“AND”来计算这两个值。谢谢,这很有帮助。我想我还不习惯解释语言的一些怪癖。如果你想计算双方,只需在条件之外执行语句并计算结果的条件运算符:
result=data.pop();finalCheck=finalCheck&&result哦,我没有想到这一点,因为我没有在条件的上下文中使用“AND”操作符。我希望它使用逻辑“AND”来计算这两个值。谢谢,这很有帮助。我想我还不习惯解释语言的一些怪癖。如果你想计算双方,只需在条件之外执行语句并计算结果的条件运算符:
result=data.pop();finalCheck=finalCheck&&result谢谢,你的答案很好。这就是我所期待的行为。有点像额头,但我很惊讶javascript将和视为上下文中的一个条件。逻辑运算符将始终起作用,嗯,逻辑;)你期待什么?谢谢,你的回答很好。这就是我所期待的行为。有点像额头,但我很惊讶javascript将和视为上下文中的一个条件。逻辑运算符将始终起作用,嗯,逻辑;)您期望得到什么?
&=
相当于
finalCheck=finalCheck&data.pop()
,这是一个按位运算符。这段代码的结果与
finalCheck=finalCheck&&data.pop()不同。
@RobW:是的,你是对的。我从答案中删除了该部分。
&=
相当于
finalCheck=finalCheck&data.pop()
,这是一个按位运算符。这段代码的结果与
finalCheck=finalCheck&&data.pop()不同。
@RobW:是的,你是对的。我从答案中删除了那部分。