
התחביר של הצהרת switch-case
הצהרת switch-case מורכבת מביטוי switch, אחריו מספר ביטויי מקרה המייצגים ערכים אפשריים של הביטוי ולסיום משפט ברירת מחדל אופציונלי לטיפול במקרים ללא התאמה. להלן התחביר הבסיסי:
switch (expression) {
case value1:
// Code to execute if expression === value1
break;
case value2:
// Code to execute if expression === value2
break;
default:
// Code to execute if expression doesn't match any case
}
הביטוי expression נבדק. אם הוא זהה לערך value1, יבוצע קטע הקוד שמיד אחרי ה-case הראשון ועד ה-break הקרוב. אחרת, אם הוא זהה לערך value2, יבוצע קטע הקוד שמיד אחרי ה-case השני ועד ה-break הקרוב. בכל מקרה אחר, כברירת מחדל יבוצע קטע הקוד שלאחר ה-default.
כמה הערות:
- אין מגבלה על כמות שורת ה-case. בדוגמה לעיל, ראינו 2 שורות case, אך באותה מידה יכולנו לשים גם 20 כאלו.
- לאחר כל case, אין הגבלה על כמות הקוד שאפשר לבצע.
- בכל פעם שנמצא ה-case עם הערך המתאים ל-expression, יבוצע כל הקוד עד שורת ה-break הקרובה. כל עוד לא נתקלים ב-break ממשיכים לבצע את הקוד, גם אם יש גלישה ל-case הבא.
דוגמה:
let day = "Monday";
switch (day) {
case "Monday":
console.log("It's the beginning of the week");
break;
case "Friday":
console.log("It's almost the weekend");
break;
default:
console.log("It's a regular day");
}
בדוגמה זו, אנו בוחנים את ערך המשתנה day ופועלים בהתאם. במקרה שערך המשתנה הוא Monday, תופעל קריאת ה-log הראשונה. במקרה שערך המשתנה הוא Friday, תופעל קריאת ה-log השניה. בכל מקרה אחר, תופעל קריאת ה-log האחרונה.
דוגמה נוספת:
let day = "Monday";
switch (day) {
case "Sunday":
case "Monday":
console.log("It's the beginning of the week");
break;
case "Wednesday":
console.log("It's the middle of the week");
break;
case "Friday":
case "Saturday":
console.log("It's almost the weekend");
break;
default:
console.log("It's a regular day");
}
בדוגמה זו, גם הפעם אנו בודקים את ערך המשתנה day. אם ערך המשתנה הוא Sunday מופעל הקוד משורת ה-case הרלוונטית ועד ה-break הקרוב, כלומר, תבוצע קריאת ה-log הראשונה. כלומר, גלשנו מעל פני שורת ה-case השניה שבודקת אם ערך המשתנה הוא Monday והמשכנו בביצוע הקוד, כי לא נתקלנו ב-break לפני כן. באופן דומה, אם ערך המשתנה הוא Friday, תבוצע שורת ה-log השלישית, בדיוק כמו במקרה שערך המשתנה הוא Saturday.
הביטוי הנבדק בהצהרת ה-switch יכול להיות מכל טיפוס ולאו דווקא מספר או מחרוזת.
דוגמה:
function getType(input) {
switch (typeof input) {
case "number":
return "Number";
case "string":
return "String";
case "boolean":
return "Boolean";
default:
return "Unknown";
}
}
console.log(getType(42)); // Output: Number
console.log(getType("hello")); // Output: String
console.log(getType(true)); // Output: Boolean
console.log(getType([])); // Output: Unknown
בדוגמה זו, יצרנו פונקציה המקבלת פרמטר input ובודקת אותו ב-switch. אם הפרמטר הוא מספר, הפונקציה תחזיר את המחרוזת Number. אם הפרמטר הוא מחרוזת, הפונקציה תחזיר את המחרוזת String. אם הפרמטר הוא בוליאני, הפונקציה תחזיר את המחרוזת Boolean. בכל מקרה אחר, הפונקציה תחזיר את המחרוזת Unknown.
נשים לב שבדוגמה זו לא השתמשנו בהצהרות break, כיוון שיציאה מכל מצב case שנבדק נעשית באמצעות return, שמסיים את בלוק ה-switch ויוצא לגמרי מהפונקציה. עוד על פונקציות בג'אווה סקריפט נראה בהרחבה בפרקים הבאים במדריך.
יתרונות השימוש בהצהרות Switch-Case לעומת הצהרות if-else
הצהרות switch-case מציעות מספר יתרונות על פני הצהרות if-else:
- קריאות - הצהרות switch-case יכולות לשפר את קריאות הקוד, במיוחד עבור תנאים מרובים.
- יעילות - במקרים רבים, הצהרות switch-case עשויות להיות יעילות יותר מהצהרות if-else ארוכות.
- טיפול במקרי ברירת מחדל - קטע ה-default מאפשר אפשרות נוחה לטיפול בערכים בלתי צפויים.
שיטות עבודה מומלצות לשימוש בהצהרות של Switch-Case
כדי להשתמש ביעילות בהצהרות switch-case, שקול את השיטות המומלצות הבאות:
- שימוש עבור ערכים בדידים - הצהרות switch-case מתאימות ביותר לערכים בדידים (למשל, מחרוזות או מספרים).
- כלול מקרה ברירת מחדל - כלול תמיד מקרה ברירת מחדל (קטע default), כדי לטפל בערכים בלתי צפויים בצורה נכונה.
- סדר מקרים בצורה יעילה - סדר את סעיפי המקרים בצורה לוגית, עם מקרים נפוצים יותר תחילה. כך תשפר גם את קריאות הקוד וגם את יעילותו מבחינת זמני הביצוע.
- שים לב שלא לשכוח הצהרות break - שים לב תמיד לכלול הצהרות break במקומות הנדרשים, כדי למנוע התנהגות של גלישה שאינה מתוכננת (ביצוע של הקוד של ה-case הרלוונטי וגם של ה-case הבא אחריו).
- שקול גלישה במידת הנדרש - לפי הנדרש, שקול להשמיט במכוון הצהרות break כדי לבצע גלישה מהצהרת case להצהרה הבא. כך תחסוך שכפול קוד (במקום לכתוב את אותו הקוד לכל אחד מהצהרות ה-case, הוא יופיע פעם אחת בלבד).
מלכודות נפוצות שיש להימנע מהן
חשוב להכיר את המלכודות הנפוצות שקיימות בהצהרות switch-case ולהזהר מהן.
יש לשים לב להצהרות break חסרות. אי הכללה של הצהרת break עלולה להוביל להתנהגות לא מכוונת של גלישה בין הצהרות ה-case.
דוגמה:
let day = "Monday";
switch (day) {
case "Monday":
console.log("It's Monday");
case "Tuesday":
console.log("It's Tuesday");
break;
default:
console.log("It's another day");
}
בדוגמה זו, שכחנו לשים הצהרת break עבור הצהרת ה-case הראשונה. לכן, אם ערך המשתנה day הוא Monday, יבוצעו בטעות 2 קריאות ה-log הראשונות ויכתבו ב-console גם It's Monday וגם It's Tuesday.
יש לשים לב להשמטת הצהרת ה-default. אי הכללה של הצהרת default עלולה לגרום להתנהגות בלתי צפויה במקרים של ערכים שלא טופלו בהצהרות ה-case השונות.
דוגמה:
let fruit = "Apple";
switch (fruit) {
case "Apple":
console.log("It's an apple");
break;
case "Banana":
console.log("It's a banana");
break;
// No default case included
}
בדוגמה זו, השמטנו את הצהרת ה-default ואנו מטפלים רק במקרים בהם ערך המשתנה fruit הוא Apple או Banana. לכן, אם ערך המשתנה fruit הוא למשל Orange, או כל ערך אחר שאינו מטופל, לא קיים קוד רלוונטי המטפל במקרה ולא יבוצע דבר.
יש להמנע משימוש ב-switch case במקרה של תנאים מורכבים או טווחים בעיתיים.
דוגמה:
let num = 10;
switch (true) {
case num > 5 && num < 15:
console.log("Number is between 5 and 15");
break;
case num > 20 || num < 0:
console.log("Number is either greater than 20 or negative");
break;
default:
console.log("Number is not within specified ranges");
}
בדוגמה זו, אנו בודקים את הערך true מול טווחים של המשתנה num. ניתן לראות כי הקוד מסורבל ולא ברור לקריאה, גם כי הביטוי הנבדק אינו משתנה אלא הערך true, וגם כי האפשרויות הנבדקות בהצהרות ה-case הן טווחים שונים, כאשר הצהרת ה-case הראשונה כוללת אופרטור && ואילו השניה אופרטור ||. היה פשוט וקריא יותר להחליף את הקוד הזה בתנאי if-else.