Mam to zachowanie Bizzare, których nigdy nie widziałem i nie rozumiem. Przechodzę przez tablicę za pomocą arrayname.length jako kontrola na pętlę. Które normalnie działa zgodnie z oczekiwaniami, ale ten konkretny przypadek tworzy niekończącą się pętlę, gdy długość tablicy nie jest zmniejszona poza pierwszą iteracją.

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

Tutaj początkową długość wynosi 4 i końcówka rozpoczyna się w true. Pierwsze elementy tablicy są fałszywe.

Zgodnie z oczekiwaniami na pierwszej iteracji, FinalCheck staje się fałszywy i data.length staje się 3, ale wtedy na każdą iteracji potem dane

0
DeviousBlue 11 listopad 2011, 01:24

3 odpowiedzi

Najlepsza odpowiedź

finalCheck staje się fałszywy w pewnym momencie, powodując data.pop(), aby nie zostać wykonany. Następnie pętla staje się nieskończona.

data.pop() zwraca usunięty element z tablicy. Jeśli jest to wartość oceniająca fałszywe, żadne elementy zostaną usunięte na następnej iteracji, powodując data.length, aby zawsze być wyższe niż zero.

var data = [0, 1], finalCheck = false;
while( data.length > 0){
    finalCheck = finalCheck && data.pop(); //Hello infinite loop
}

W przedstawionym wcześniejszym przykładzie, finalCheck jest już false przed iteracją, powodując data.pop(), aby nigdy nie zostać wykonany. Nawet jeśli finalCheck jest zainicjowany w true, finalCheck zostanie ustawiony na zero i utknij ponownie.

Aby naprawić kod, powinieneś przynajmniej użyć:

while( data.length > 0 && finalCheck){
    finalCheck = data.pop(); //Bye infinite loop
}
1
Rob W 10 listopad 2011, 21:27

Jeśli finalCheck staje się fałszywym, dlaczego powinna wystąpić data.pop(). Interpreter JavaScript jest prawidłowo zwarcia i nie oceniający prawej strony wyrażenia.

Jeśli próbujesz poczekać do finalCheck, prawdopodobnie chcesz użyć operatora ||}:

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

Musisz także upewnić się, że wyrwałeś się z pętli, gdy uderzyłeś swój terminy!

1
Platinum Azure 10 listopad 2011, 21:27

Warunkiem w pętli używa operatora {X0}}, więc pop nie będzie już nazywany tak szybko, jak finalCheck jest fałszywe.

Możesz po prostu przejść z pętli, gdy tylko finalCheck stanie się fałszywe. Kiedy już jest fałszywa, nie stanie się prawdziwym, więc nie ma powodu, aby kontynuować w tym momencie:

while (finalCheck && data.length > 0) {
  finalCheck = finalCheck && data.pop();
}
1
Guffa 10 listopad 2011, 22:17