כשלא יודעים כמה איטרציות צריך
לולאת for מצטיינת כשיודעים את הטווח מראש: "עשו את זה 10 פעמים", "עברו על כל אינדקס במערך הזה". לולאת while מיועדת למקרה השני: להמשיך עד שמשהו משתנה. לא יודעים כמה איטרציות זה ייקח, רק את התנאי שגורם לעצור.
הצורה מינימלית:
JavaScript מחשבת את התנאי שבסוגריים. אם הוא truthy, הבלוק רץ. אחר כך היא בודקת את התנאי שוב, ושוב, עד שהוא הופך ל-falsy. אם שוכחים את count++, התנאי אף פעם לא משתנה, וברוכים הבאים ללולאה אינסופית.
המודל המחשבתי: בדיקה, הרצה, חזרה
שלושה דברים חייבים להתקיים כדי שללולאת while יהיה היגיון:
- משהו שהתנאי תלוי בו.
- דרך שבה הגוף משנה את אותו משהו.
- בסופו של דבר, התנאי הופך ל-false.
אם אחד מהם חסר, אתם בצרות. הבאג הקלאסי הוא לשכוח את שלב 2:
let count = 0;
while (count < 5) {
console.log(count);
// forgot to increment count - loops forever
}
זה רץ עד שהורגים את התהליך. נזק אמיתי כשזה קורה על שרת. שאלו את עצמכם תמיד: מה בגוף הלולאה יגרום לתנאי להיות false?
שימוש אמיתי: נקודת עצירה לא ידועה
כאן while מנצח את for. אתם צורכים פריטים ממקור כלשהו ולא יודעים כמה יש עד שרוקנתם אותו:
shift() מסיר ומחזיר את הפריט הראשון. הלולאה רצה כל עוד יש משהו בתור, ויוצאת באופן טבעי כשהוא ריק. אפשר לכתוב את זה עם לולאת for, אבל אז נלחמים בצורה של הבעיה: while נקרא כמו הכוונה.
do...while: קודם מריצים, אחר כך שואלים
do...while הופך את הסדר: מריץ את הגוף ו_אז_ בודק את התנאי. זה מבטיח לפחות איטרציה אחת:
הגוף תמיד רץ פעם אחת, גם אם התנאי false כבר מההתחלה. השוו את זה ל-while רגיל, שבו תנאי false פירושו אפס איטרציות.
המקרה היומיומי: לבקש מהמשתמש קלט, לאמת את התשובה ולבקש שוב אם היא לא טובה. תמיד רוצים לשאול לפחות פעם אחת, ולכן do...while מתאים.
שימו לב לנקודה-פסיק אחרי ה-) הסוגר: בשונה מ-while ומ-for, do...while צריך אותה.
break: לצאת מוקדם
break יוצא מיד מהלולאה הקרובה ביותר. כך עוצרים כשהתנאי הטבעי לא בדיוק מתאים למשימה:
ברגע ש-break רץ, שום דבר נוסף בלולאה לא מתבצע: לא שאר הגוף ולא בדיקת תנאי נוספת. אתם בחוץ.
while (true) עם break
כשקל יותר לבטא את תנאי העצירה בתוך הגוף מאשר בכותרת, הפכו את המבנה: רוצו לנצח וצאו עם break כשסיימתם.
שתי יציאות: הצלחה ותקרת ביטחון. תקרת הביטחון חשובה. while (true) בלי מסלול break מובטח הוא לולאה אינסופית שמחכה לקרות.
continue: לדלג לאיטרציה הבאה
continue קופץ לבדיקת התנאי הבאה ומדלג על שאר הגוף של האיטרציה הנוכחית:
מלכודת אחת: אם מה שמקדם את הלולאה נמצא אחרי ה-continue, בניתם הרגע לולאה אינסופית. בדוגמה למעלה, n++ נמצא לפני ה-continue, אז אנחנו בטוחים. שימו אותו אחרי, ו-n נתקע לנצח על מספר זוגי.
while מול for: במה להשתמש
כלל אצבע מכני:
- ספירה או מעבר לפי אינדקס על טווח ידוע:
for.for (let i = 0; i < arr.length; i++)שומר את אתחול המונה, התנאי והצעד בשורה אחת. - מעבר על אוסף:
for...of. נקי יותר מניהול אינדקס. - לולאה עד שמצב כלשהו משתנה:
while. עיבוד תור, polling, צריכת stream, ניסיון חוזר עד הצלחה. - תמיד לרוץ לפחות פעם אחת:
do...while.
בתיאוריה הן ניתנות להחלפה: כל for אפשר לכתוב מחדש כ-while ולהפך. אבל בחירה במה שמתאים לצורה של הבעיה הופכת את הקוד למתעד את עצמו.
לולאות אינסופיות: הכלל האחד
כל לולאת while צריכה תשובה ברורה לשאלה: מה גורם לזה לעצור?
או שהתנאי בכותרת יהפוך בסופו של דבר ל-false, או שיש break שבוודאות ירוץ. אם אי אפשר להצביע על אחד מהם, הלולאה עוד לא גמורה.
// לא טוב: התנאי אף פעם לא משתנה
let ready = false;
while (!ready) {
console.log("מחכים...");
// שום דבר כאן לא משנה את `ready`
}
// טוב: הגוף משפיע על התנאי
let ready = false;
let checks = 0;
while (!ready) {
checks++;
if (checks >= 3) ready = true;
}
בדפדפן, לולאה אינסופית מקפיאה את הלשונית. ב-Node, היא מעמיסה ליבת CPU עד שהורגים את התהליך. שווה לתפוס אותן לפני שהן מגיעות לפרודקשן.
הבא בתור: for...of ו-for...in
while מטפל במקרה של "עד שמשהו משתנה". למעבר על מערכים, מחרוזות ואובייקטים פריט אחרי פריט, ל-JavaScript יש עוד שתי צורות של לולאה שתוכננו בדיוק בשביל זה: for...of ו-for...in, שמגיעות מיד.
שאלות נפוצות
מה זו לולאת while ב-JavaScript?
לולאת while מריצה את הגוף שלה שוב ושוב כל עוד תנאי מסוים הוא truthy. JavaScript בודקת קודם את התנאי, מריצה את הבלוק ואז בודקת שוב. אם התנאי false כבר בפעם הראשונה, הגוף לא רץ בכלל.
מה ההבדל בין while ל-do...while?
while בודק את התנאי לפני שהוא מריץ את הגוף, כך שייתכנו אפס איטרציות. do...while מריץ את הגוף פעם אחת ואז בודק את התנאי, ולכן הוא תמיד רץ לפחות פעם אחת. השתמשו ב-do...while כשהאיטרציה הראשונה חייבת לקרות בלי תנאי, למשל כשמבקשים מהמשתמש קלט.
איך יוצאים מלולאת while ב-JavaScript?
השתמשו בהוראה break כדי לצאת מהלולאה מיד, או ב-continue כדי לדלג לאיטרציה הבאה. break הוא הדרך לממש לולאות while (true) בבטחה: רצים לנצח, ויוצאים עם break כשתנאי כלשהו בתוך הגוף מתקיים.