Jak wykonuje się ta pętla while?

0

Witajcie,
wyrażenie hasBubbleGum.length ma wartość 4, no bo tyle ma elementów. Czyli już w pierwszym sprawdzeniu przez pętlę, ten var o wartości 1 jest mniejszy od 4 więc dlaczego nie wykonuje się ciało tej funkcji i nie wyświetla wyniku za pierwszym razem? Coś tu źle rozumiem :)

var products = ["Czu-Czu-Lada",
                "Miętowy chłód", "Ciasto naleśnikowe",
                "Guma balonowa"];
var hasBubbleGum = [false, 
                    false, 
                    false, 
                    true];

var i = 0;

while ( i < hasBubbleGum.length) {

	if (hasBubbleGum[i]) {
		console.log(products[i] + " zawiera gumę do żucia.");
    }
    i=i+1;
}

Wynik to "Guma balonowa zawiera gumę do żucia."

0

Po pierwsze - wklej całość, bo mam wrażenie, że trochę z góry Ci się urwało.
A po drugie, abstrahując od tego, czy ten kod działa, napisz proszę co chciałeś osiągnąć i co ma się wydarzyć. Bo mam wrażenie, że trochę przekombinowałeś ;)

0

Poprawiłem kod, wybacz pomyłkę :) ... próbuję po prostu zrozumieć dlaczego wyświetla się ""Guma balonowa zawiera gumę do żucia." a nie "Czu-Czu-Lada zawiera gumę do żucia." Przecież już w pierwszym działaniu pętli while 1<4 czyli już powinien się wykonać if.

1

Rzuć okiem proszę na ten link - https://jsfiddle.net/gvnt5akp/
Trochę tam zmieniłem/dodałem. Czy teraz może bardziej rozumiesz, dlaczego skrypt się tak zachowuje?

0

Dobrze, czyli to wyrażenie hasBubbleGum.length nie przekazuje długości indeksu tylko... hmmm właśnie...co robi.. Bo przecież nie może zwracać elementów bo żaden z nich nie jest stringiem. Zresztą bez sensu żeby w tym przypadku zwracał typ string.

0

Kolejna podpowiedź - wstaw sobie alert(hasBubbleGum.length); i powiedz, co Ci się pojawi :)

1

"Guma balonowa zawiera gumę do żucia." a nie "Czu-Czu-Lada zawiera gumę do żucia." Przecież już w pierwszym działaniu pętli while 1<4 czyli już powinien się wykonać if.

Niby czemu? Instrukcja warunkowa (if) wykonuje się, gdy zawarte w niej wyrażenie jest prawdziwe.

hasBubbleGum[i]

Jest prawdziwe tylko dla i=3.

0
  • var i = 0; - przypisujemy wartość początkową dla i
  • while ( i < hasBubbleGum.length) - tutaj dajemy warunek wykonania pętli. Ma się wykonywać tak długo, jak i jest mniejsze od hasBubbleGum.length. Wartość i startuje od zera i za każdym przebiegiem jest zwiększana o 1, natomiast hasBubbleGum.length pozostaje niezmienne i wynosi w naszym przypadku 4
  • if (hasBubbleGum[i]) - sprawdzamy, czy w tablicy hasBubbleGum pod indeksem [i] jest wartość TRUE. Jeśli tak, to wykonuje kolejne polecenie. Zwróć uwagę, że jedynie na 4 pozycji mamy TRUE, więc sprawdzenie będzie prawdziwe jedynie dla ostatniego elementu
  • console.log(products[i] + " zawiera gumę do żucia."); - jeśli sprawdzenie opisane w poprzednim punkcie wykona się poprawnie, to zapisujemy do konsoli pozycję z tablicy products o indeksie [i]. Ponieważ tylko 4 element tablicy hasBubbleGum jest ustawiony na TRUE, więc do konsoli trafia jedynie czwarta pozycja z tablicy products
  • i=i+1; - niezależnie od tego, co nam dał if, zwiększamy zmienną i oraz wykonujemy kolejną iterację pętli

Czy teraz wszystko jest jasne?

0

Ok, cerrato,

czyli co do tej pętli while to ona wykonuje się:

0<4 , 1<4 , 2<4, 3<4 ...i za każdym razem wartość false przelatuje przez if (hasBubbleGum[i]), dopóki nie wpadnie tam true?

Wybacz jeśli dzisiaj już nie odpiszę, zrobię to jutro lub na dniach.

Z góry dzięki!

1

Nie wiedziałem o tym, że if tak właśnie działa, że wystarczy jedno wyrażenie w ifie, by całe wyrażenie przyjmowało wartość true

Chyba nadal nie do końca masz dobry obraz tego, co się odbywa w podanym przez ciebie kodzie. Ten IF ma jeden parametr/wyrażenie, ale jest ono wykonywane/sprawdzane wiele razy, za każdym przebiegiem pętli. I każde z tych sprawdzeń jest niezależne od wcześniejszych lub następujących.

Za każdym razem, gdy wynik sprawdzenia jest TRUE to zostają wykonane polecenia po IF, tylko ponieważ dzieje się to w pętli, to za każdym razem zmienna i wskazuje na inny element tablicy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1