Javascript 逻辑运算符后不减少array.length的Pop
我有一种奇怪的行为,我从未见过,也不理解。我将使用arrayname.length作为while循环的控件遍历一个数组。这通常按预期工作,但是当数组的长度没有减少到第一次迭代之后,这个特殊情况会创建一个无止境的循环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变
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:是的,你是对的。我从答案中删除了那部分。