המבנה של משפט if
משפט if מריץ בלוק קוד רק כשתנאי מתקיים. המבנה הוא מילת מפתח, תנאי בסוגריים ובלוק בסוגריים מסולסלים:
התנאי age >= 18 מוערך כ-true, ולכן הבלוק רץ. אם age היה 16, התנאי היה false ו-JavaScript הייתה מדלגת על הבלוק לגמרי.
הסוגריים המסולסלים הם טכנית אופציונליים כשהבלוק הוא פקודה אחת, אבל השתמשו בהם תמיד. משפטי if בלי סוגריים הם מקור קלאסי לבאגים כשמישהו מוסיף אחר כך שורה שנייה ושוכח שהיא בכלל לא בתוך הבלוק.
else: הענף החלופי
צרפו else ל-if כדי להריץ קוד אחר כשהתנאי לא מתקיים:
בדיוק אחד משני הענפים רץ. אף פעם לא שניהם, ואף פעם לא אף אחד. ל-else אין תנאי משלו: הוא תופס את כל המקרים שבהם "ה-if היה שקר".
else if: בחירה מתוך כמה אפשרויות
כשיש יותר משני מקרים, משרשרים אותם עם else if. JavaScript בודקת כל תנאי לפי הסדר ועוצרת בראשון שמתקיים:
רק ענף אחד רץ. ברגע שתנאי מתאים, השאר מדולגים, גם אם גם הם היו מתקיימים. לכן הסדר חשוב: אם הייתם הופכים את השרשרת ובודקים קודם score >= 60, כל מי שמעל 60 היה מקבל D.
ה-else האחרון אופציונלי, אבל הוספה שלו מבהירה את הכוונה: "אם שום דבר אחר לא התאים, עשו את זה".
תנאי יכול להיות כל ביטוי
מה שבתוך הסוגריים לא חייב להיות השוואה. זה יכול להיות כל ביטוי, ו-JavaScript ממירה את התוצאה לבוליאני:
מחרוזות לא ריקות הן truthy. 0 ומחרוזות ריקות הן falsy, ולכן כש-items.length הוא 0 נכנסים לענף ה-else. זה הביטוי המקובל ב-JavaScript לבדיקה "האם יש שם משהו".
הרשימה המלאה של ערכי falsy קצרה ושווה לזכור אותה בעל פה: false, 0, -0, 0n, "", null, undefined ו-NaN. כל השאר truthy, כולל "0", "false", [] ו-{}. שני האחרונים מפילים אנשים.
שילוב תנאים: && ו-||
השתמשו ב-&& (וגם) וב-|| (או) כדי לשלב תנאים:
&& דורש ששני הצדדים יהיו truthy. || דורש לפחות אחד. שניהם מבצעים קצר (short-circuit): && עוצר בערך ה-falsy הראשון, ו-|| עוצר בערך ה-truthy הראשון. זה חשוב כשלתנאי השני יש תופעת לוואי או שהוא עלול לזרוק שגיאה: user && user.name מחזיר בבטחה undefined אם user הוא null, בלי להתפוצץ.
עטפו לוגיקה מעורבת בסוגריים כדי שסדר הקדימויות יהיה ברור:
בלי הסוגריים, && נקשר חזק יותר מ-||, וזה בדרך כלל ההפך ממה שנקרא באופן טבעי.
== מול === (השתמשו ב-===)
כשבודקים שוויון בתוך if, השתמשו ב-=== וב-!==, לא ב-== וב-!=:
== ממיר טיפוסים לפני ההשוואה, וזה מוביל להפתעות כמו "" == 0 שהוא אמת ו-null == undefined שהוא אמת. === משווה בלי המרה: אותו טיפוס ואותו ערך. השתמשו ב-=== כברירת מחדל. החריג הנפוץ היחיד הוא x == null, שבודק גם null וגם undefined בבת אחת.
האופרטור הטרנרי
לבחירה בין שני ערכים, האופרטור הטרנרי condition ? a : b לרוב נקי יותר מ-if/else מלא:
הטרנרי הוא ביטוי: הוא מייצר ערך. זה ההבדל המרכזי מ-if/else, שהוא פקודה. השתמשו בטרנרי כשצריך את התוצאה (הצבה למשתנה, החזרה, בניית מחרוזת). השתמשו ב-if/else כשמריצים תופעות לוואי.
אפשר לשרשר טרנרים, אבל הקריאות צונחת מצוק:
// אל תעשו את זה:
const grade = score >= 90 ? "A" : score >= 80 ? "B" : score >= 70 ? "C" : "F";
אם אתם משרשרים, חזרו ל-else if.
if מקונן מול else if שטוח
לפעמים תנאי אחד הגיוני רק בתוך תנאי אחר. קינון מתאים לזה:
אבל קינון של שלוש או ארבע רמות הוא סימן לקוד בעייתי. שטחו אותו עם החזרות מוקדמות או עם תנאי משולב:
החזרות מוקדמות שומרות כל ענף קצר ובאותה רמת הזחה. הרבה יותר קל לסרוק מפירמידה של if מקוננים.
מלכודת נפוצה: השמה בתוך if
= מציב. === משווה. בלבול ביניהם בתוך תנאי הוא באג קלאסי:
status = "done" מציב את "done" ב-status ומוערך כ-"done", שהוא truthy, כך שהבלוק תמיד רץ, ודרסתם את המשתנה בשקט. Linters תופסים את זה. Strict mode לא. פשוט היזהרו, והשתמשו ב-=== כשאתם מתכוונים להשוות.
הבא בתור: switch
כשמשווים ערך אחד מול הרבה התאמות אפשריות, שרשרת else if ארוכה מתחילה להרגיש חזרתית. משפט switch של JavaScript נבנה בדיוק למקרה הזה, ויש לו מוזרויות משלו סביב break ו-fall-through, שהן הנושא הבא.
שאלות נפוצות
איך כותבים משפט if/else ב-JavaScript?
שמים תנאי בסוגריים אחרי if, ואחריו בלוק בסוגריים מסולסלים. אחר כך מוסיפים else ובלוק נוסף למקרה החלופי. לדוגמה: if (age >= 18) { console.log('adult'); } else { console.log('minor'); }. התנאי יכול להיות כל ביטוי: JavaScript ממירה אותו לבוליאני.
מה ההבדל בין else if ל-if מקונן ב-JavaScript?
else if משרשר תנאים כך שרק ענף אחד רץ: JavaScript בודקת כל תנאי לפי הסדר ועוצרת בהתאמה הראשונה. משפטי if מקוננים שמים אחד בתוך השני, בדרך כלל כדי לבדוק תנאי שני רק כשהראשון היה אמת. שרשראות else if שטוחות כמעט תמיד קלות יותר לקריאה מ-if מקוננים לעומק.
מתי להשתמש באופרטור הטרנרי במקום if/else?
השתמשו בטרנרי condition ? a : b כשבוחרים בין שני ערכים בתוך ביטוי: הצבה למשתנה, החזרה מפונקציה, בניית מחרוזת. הישארו עם if/else כשהענפים מריצים פקודות עם תופעות לוואי, או כשאחד הצדדים ארוך יותר מביטוי קצר. טרנרים משורשרים הופכים לבלתי קריאים מהר מאוד.
למה if (0) מתנהג אחרת מ-if (false) ב-JavaScript?
הוא לא מתנהג אחרת: שניהם מדלגים על הבלוק. JavaScript ממירה את התנאי לבוליאני, ו-0, '', null, undefined, NaN ו-false הם כולם falsy. המלכודת היא שערכים כמו '0' (מחרוזת לא ריקה) ו-[] (מערך ריק) הם truthy, וזה מפתיע אנשים שמגיעים משפות אחרות.