只要符合特定條件,你就可以用 while 迴圈重複執行程式碼。
它的寫法是以while關鍵字開頭,後面接著用括號包住的條件,以及用大括號包住迴圈_主體_的程式區塊。
while (condition) {
// code that is executed repeatedly as long as the condition is true
}
JavaScript 也有 do-while 迴圈。它的條件是在迴圈主體執行完之後才檢查,因此當條件取決於迴圈主體中運算出來的結果時,就非常實用。
do {
// The code here will always be executed once and then
// repeatedly while the condition is true.
} while (condition);
在迴圈主體裡,你可以使用break關鍵字來完全停止迴圈的執行。相對地,continue關鍵字只會停止目前這次疊代,然後繼續執行下一次。善用continue,通常就能避免把迴圈主體的一大段程式碼包進 if 敘述裡。
let i = 0;
while (i < 100) {
i = i + 2;
if (i % 3 === 0) {
continue;
}
// The code here will only be executed when i was not divisible
// by 3 in the check above.
}
除了 if 敘述之外,JavaScript 也有 switch 敘述,可以依照條件執行不同的邏輯。當單一變數需要與多個不同的值比較時,就會用到它。比較的方式是檢查嚴格相等(===),請參閱比較的概念。以某個變數x來說,JavaScript 的 switch 敘述語法如下。
switch (x) {
case option1:
// code that is executed when "x === option1" is true
break;
case option2:
// code that is executed when "x === option2" is true
break;
default:
// code that is executed when x does not equal any of the options
}
default分支是選用的,當其他選項都不符合這個變數時,可以用它來執行一些程式碼。
上面這些break敘述之所以必要,是因為在 JavaScript 中,所有分支預設都會「fallthrough」。也就是說,如果沒有break敘述,即使x不符合後面那些選項,第一個符合的選項底下所有分支的程式碼還是會被執行。這種「預設 fallthrough」的行為,是在 JavaScript 中使用switch時常見的陷阱。在函式內,也可以用return取代break來避免這個問題。
你的朋友 Li Mei 經營一間果汁吧,賣的是美味的綜合果汁。 你是她店裡的常客,有天發現自己其實可以讓朋友的生活輕鬆一點。 你決定運用你的程式設計技能,幫 Li Mei 分擔一些工作。
Li Mei 喜歡事先告訴客人,他們從菜單上點的那杯果汁要等多久。
她很不容易記住確切的數字,因為每種果汁調製的時間都不一樣。
'Pure Strawberry Joy'需要 0.5 分鐘,'Energizer'和'Green Garden'各需要 1.5 分鐘,'Tropical Island'需要 3 分鐘,'All or Nothing'需要 5 分鐘。
至於其他飲品(例如特惠品),可以假設準備時間是 2.5 分鐘。
為了幫你的朋友,請寫一個函式timeToMixJuice,它接受菜單上的一杯果汁作為引數,回傳調製這杯飲品所需的分鐘數。
timeToMixJuice('Tropical Island');
// => 3
timeToMixJuice('Berries & Lime');
// => 2.5
Li Mei 的許多飲品都會用到萊姆角,無論是當作材料,還是作為裝飾的一部分。 所以早上開始上班時,她得先確定裝萊姆角的容器是滿的,才能應付接下來的一天。
請實作函式limesToCut,它接受 Li Mei 需要切的萊姆角數量,以及一個代表她手邊整顆萊姆存量的陣列。
一顆'small'萊姆可以切出 6 個萊姆角,一顆'medium'萊姆可以切出 8 個,而'large'萊姆則可以切出 10 個。
她總是按照萊姆在陣列中出現的順序來切,從第一項開始。
她會一直切,直到切出所需的萊姆角數量,或是萊姆用完為止。
Li Mei 想事先知道她總共需要切幾顆萊姆。
limesToCut函式應該回傳需要切的萊姆數量。
limesToCut(25, ['small', 'small', 'large', 'medium', 'small']);
// => 4
Li Mei 總是工作到下午 3 點。 之後由她的員工 Dmitry 接手。 Li Mei 的班結束時,常常還有已經點好、卻還沒調製的飲品。 Dmitry 接著會把剩下的果汁調製好。
為了讓交接更順利,請實作函式remainingOrders,它接受 Li Mei 班表剩餘的分鐘數,以及一個已經點好、但還沒調製的果汁陣列。
這個函式應該回傳 Li Mei 在下班前無法開始調製的訂單。
班表剩餘的時間永遠大於 0。 要調製的果汁陣列永遠不會是空的。 此外,訂單會按照它們在陣列中出現的順序來調製。 只要 Li Mei 開始調製某杯果汁,她就一定會把它做完,即使得多工作一會兒。 如果沒有剩下任何需要 Dmitry 處理的訂單,就應該回傳一個空陣列。
remainingOrders(5, ['Energizer', 'All or Nothing', 'Green Garden']);
// => ['Green Garden']