W rozdziale 2 opisane są najczęściej używane instrukcje sterujące, takie jak while
, for
i break
. Dla uproszczenia w rozdziale tym niektóre struktury pominąłem, ponieważ moim zdaniem są o wiele mniej przydatne. W tym dodatku znajduje się opis tych pominiętych struktur.
Pierwsza z nich to instrukcja do
. Działa podobnie do instrukcji while
, tylko zamiast wykonywać swoje instrukcje zero lub więcej razy wykonuje je przynajmniej raz. Instrukcja do
wygląda następująco:
do {
var answer = prompt("Powiedz „muuu”.", "");
print("Powiedziałeś „", answer, "”.");
} while (answer != "muuu");
Aby podkreślić fakt, że warunek jest sprawdzany dopiero po jednokrotnym wykonaniu kodu pętli, zapisuje się go za treścią główną pętli.
Kolejna instrukcja to continue
. Jest ona blisko spokrewniona z instrukcją break
i w niektórych przypadkach może ją zastępować. Podczas gdy break
powoduje wyskok z pętli i kontynuowanie wykonywania programu od miejsca za pętlą, continue
powoduje przejście do następnej iteracji pętli.
for (var i = 0; i < 10; i++) {
if (i % 3 != 0)
continue;
print(i, " jest podzielne przez trzy.");
}
Podobny efekt można uzyskać przy użyciu samej instrukcji if
, ale w niektórych przypadkach instrukcja continue
wygląda lepiej.
Jeśli pętla znajduje się w innej pętli, instrukcje break
i continue
dotyczą tylko wewnętrznej pętli. Czasami jednak trzeba wyjść z zewnętrznej pętli. Aby móc odwoływać się do wybranej pętli, można przypisać jej etykietę. Etykieta to nazwa (może być dowolna poprawna nazwa zmiennej) z dwukropkiem (:
).
outer: for (var sideA = 1; sideA < 10; sideA++) {
inner: for (var sideB = 1; sideB < 10; sideB++) {
var hypotenuse = Math.sqrt(sideA * sideA + sideB * sideB);
if (hypotenuse % 1 == 0) {
print("Trójkąt prostokątny o przyprostokątnych o długości ",
sideA, " i ", sideB, " ma przeciwprostokątną długości ",
hypotenuse, ".");
break outer;
}
}
}
Następna konstrukcja to switch
, której można używać do wybierania bloków kodu do wykonania zależnie od jakiejś wartości. Jest to bardzo wygodna konstrukcja, ale jej składnia w języku JavaScript (zapożyczona z języka C) jest tak nieporadna i brzydka, że zamiast niej wolę używać szeregów instrukcji if
.
function weatherAdvice(weather) {
switch(weather) {
case "deszcz":
print("Weź parasol.");
break;
case "słońce":
print("Ubierz się lekko.");
case "chmury":
print("Wyjdź na dwór.");
break;
default:
print("Nie wiadomo, jaka jest pogoda: ", weather);
break;
}
}
weatherAdvice("słońce");
W bloku switch
można wpisać dowolną liczbę klauzul case
. Program przeskoczy do etykiety odpowiadającej wartości podanej instrukcji switch
(porównując wartości przy użyciu operacji równoważnej z operatorem ===
, dzięki czemu nie wystąpi automatyczna konwersja typu) albo do klauzuli default
, jeśli nie zostanie znaleziona żadna pasująca wartość. Następnie wykona znajdujące się tam instrukcje oraz będzie kontynuował wykonywanie instrukcji kolejnych etykiet, aż napotka instrukcję break
. W niektórych przypadkach, jak np. "słońce"
w przykładzie, można to wykorzystać do tego, aby móc użyć wspólnego kodu dla niektórych przypadków (zalecenie wyjścia na dwór znajduje się w przypadku zarówno słonecznej jak i wietrznej pogody). Zazwyczaj konstrukcje te wymuszają tylko dodanie wielu brzydkich instrukcji break
albo powodują problemy, gdy się o takiej instrukcji zapomni.
Podobnie jak pętle, instrukcje switch
mogą mieć etykiety.
Na koniec zostawiłem słowo kluczowe with
. Nigdy go nie użyłem w żadnym prawdziwym programie, ale widziałem je w cudzych programach i dlatego myślę, że warto je znać. Kod z użyciem słowa kluczowego with
wygląda tak:
var scope = "outside";
var object = {name: "Ignatius", scope: "inside"};
with(object) {
print("Name == ", name, ", scope == ", scope);
name = "Raoul";
var newVariable = 49;
}
show(object.name);
show(newVariable);
Wewnątrz bloku własności obiektu przekazanego do with
zachowują się jak zmienne. Aczkolwiek nie są do niego dodawane jako własności nowo utworzone zmienne. Podejrzewam, że konstrukcja ta miała być przydatna w metodach, w których intensywnie wykorzystywane są własności ich obiektów. Pisanie takiej metody można zacząć od with(this) {...}
i wówczas nie trzeba ciągle pisać this
.