עיבוד חזרתי ב-JavaScript
במאמר זה נסביר על עיבוד חזרתי ב-JavaScript.
YouTube Video
פקודת for
ב-JavaScript
תחביר בסיסי
1for (initialization; condition; update) {
2 // Code to repeat
3}
פקודת for
ב-JavaScript היא תחביר לביצוע חזרתיות. היא מפעילה שוב ושוב בלוק מסוים של קוד כל עוד מתקיימת תנאי ספציפי. על ידי שימוש בפקודת for
, ניתן לבצע את אותו התהליך בצורה יעילה מספר פעמים.
- אתחול (
initialization
): החלק שמבוצע פעם אחת בלבד לפני תחילת הלולאה. אתחול משתנים כמו מונה הלולאה. - תנאי (
condition
): התנאי שמחליט אם להמשיך את הלולאה. אםtrue
, הלולאה ממשיכה; אםfalse
, היא מסתיימת. - עדכון (
update
): זה מבוצע בסוף כל לולאה כדי לעדכן את מונה הלולאה.
דוגמה
1for (let i = 0; i < 5; i++) {
2 console.log(i);
3}
במקרה הזה, i
מתחיל ב-0
, והלולאה רצה כל עוד i < 5
הוא true
. i++
מעלה את הערך של i
ב-1 בכל איטרציה של הלולאה. כתוצאה מכך, מוצגים מספרים מ-0
עד 4
.
תחום הגדרת מונה הלולאה
הכרזת או אתחול משתנים בחלק האתחול של פקודת for
. משתנים שהוגדרו כאן תקפים רק בתוך תחום הלולאה.
1for (let i = 0; i < 3; i++) {
2 console.log(i); // Outputs 0, 1, 2
3}
4console.log(i); // ReferenceError
- כפי שמוצג בדוגמה זו, התייחסות למשתנה מחוץ לפקודת
for
תגרום לשגיאה.
לולאה אינסופית
הגדרת תנאי שאינו עוצר את הלולאה תביא ללולאה אינסופית. זה עלול להכביד על הדפדפן או המערכת, ולכן יש לנהוג בזהירות.
1for (;;) {
2 console.log("Infinite loop");
3 break; // Exits the infinite loop with break
4}
מערכים ופקודת for
זה נפוץ להשתמש בפקודת for
יחד עם מערכים. זה נוח לעיבוד כל אלמנט במערך.
דוגמה
1let fruits = ["apple", "banana", "cherry"];
2
3for (let i = 0; i < fruits.length; i++) {
4 console.log(fruits[i]);
5}
6// Outputs "apple", "banana", "cherry"
בדרך זו, אפשר לעבד כל אלמנט במערך באמצעות אינדקסים.
מבני לולאות אחרים
פקודת for...of
פקודת for...of
משמשת לאובייקטים הניתנים לאיטרציה כמו מערכים ומחרוזות.
1let fruits = ["apple", "banana", "cherry"];
2
3for (let fruit of fruits) {
4 console.log(fruit);
5}
6// Outputs "apple", "banana", "cherry"
זה מאפשר לעבד כל אלמנט בלי להשתמש באינדקסים.
פקודת for...in
פקודת for...in
משמשת כדי לעבור על המאפיינים של אובייקט.
1let person = { name: "John", age: 30, city: "Tokyo" };
2
3for (let key in person) {
4 console.log(key + ": " + person[key]);
5}
6// Outputs "name: John", "age: 30", "city: Tokyo"
בדרך זו, ניתן לבצע פעולות על כל אלמנט באמצעות המפתחות.
סיכום
- פקודת
for
היא מבנה לולאה עם שלושה חלקים: אתחול, תנאי ועדכון. - ניתן לשלוט בהתנהגות הלולאות באמצעות
break
אוcontinue
. - כאשר משולב עם מערכים או אובייקטים, ניתן לעבד אלמנטים או מאפיינים בצורה יעילה.
פקודת while
ב-JavaScript
תחביר בסיסי
1while (condition) {
2 // Code that repeats while the condition is true
3}
פקודת while
ב-JavaScript היא מבנה לולאה שמבצע פעולות חוזרות כל עוד התנאי שצוין הוא true
. בדומה לפקודת for
, פקודת while
מפרטת רק את התנאי.
- תנאי: כתוב את הביטוי התנאי שקובע אם להמשיך את הלולאה. הלולאה נמשכת כל עוד התנאי הוא
true
ונגמרת כשהוא הופך ל-false
.
דוגמה
1let i = 0;
2
3while (i < 5) {
4 console.log(i);
5 i++;
6}
7console.log(i); // 5
בדוגמה זו, הלולאה מתחילה עם המשתנה i
בערך 0
ומבוצעת כל עוד i < 5
הוא true
. בכל איטרציה של הלולאה, i
מוגדל ב-1, וכאשר i
הופך ל-5, התנאי הופך ל-false
והלולאה נגמרת. כתוצאה מכך, פקודת while
מציגה את הערכים מ-0
עד 4
.
בניגוד לפקודת for
, בפקודת while
, אתחול ועדכון משתנים נכתבים כהצהרות נפרדות. ניתן להתייחס למשתנה גם לאחר פקודת while
. במקרה זה, 5
מוצג לאחר שפקודת while
הסתיימה.
לולאה אינסופית
אם התנאי הוא תמיד true
, מתרחשת לולאה אינסופית שאינה נגמרת. יש להימנע מלולאות אינסופיות, אבל אם משתמשים בהן בכוונה, אפשר לסיים את הלולאה באמצעות פקודת break
.
דוגמה
1while (true) {
2 console.log("Infinite loop");
3 break; // Ends the loop with `break`
4}
עיבוד מערכים עם לולאת while
ניתן גם לעבד מערכים באמצעות פקודת while
.
דוגמה
1let fruits = ["apple", "banana", "cherry"];
2let i = 0;
3
4while (i < fruits.length) {
5 console.log(fruits[i]);
6 i++;
7}
8// Outputs "apple", "banana", "cherry"
פקודת do...while
תחביר בסיסי
1do {
2 // Code that is executed at least once
3} while (condition);
פקודת do...while
, שהיא גרסה של פקודת while
, בודקת את התנאי לאחר שהלולאה התבצעה לפחות פעם אחת. בעוד פקודת while
בודקת את התנאי תחילה, פקודת do...while
מריצה את התהליך פעם אחת לפני בדיקת התנאי.
דוגמה
1let i = 0;
2
3do {
4 console.log(i);
5 i++;
6} while (i < 5);
בדוגמה זו, מוצג i
מ-0
עד 4
. פקודת do...while
שונה מפקודת while
בכך שהיא תמיד מתבצעת פעם אחת, גם אם התנאי הוא false
.
סיכום
- פקודת
while
משמשת להרצת קוד חוזרת כל עוד התנאי הואtrue
. - יש להיזהר מלולאות אינסופיות, אך ניתן לשלוט בזרימת הלולאות באמצעות
break
ו-continue
. - פקודת
do...while
מועילה כאשר רוצים להריץ את הלולאה לפחות פעם אחת.
break
ו-continue
ניתן להשתמש ב-break
ו-continue
בתוך הלולאה.
- פקודת
break
משמשת לסיים את הלולאה לפני הזמן. - פקודת
continue
מדלגת על האיטרציה הנוכחית וממשיכה לאיטרציה הבאה.
דוגמה ל-break
1for (let i = 0; i < 10; i++) {
2 if (i === 5) {
3 break; // Exits the loop when i is 5
4 }
5 console.log(i);
6}
7// Outputs 0, 1, 2, 3, 4
8
9let i = 0;
10
11while (i < 10) {
12 if (i === 5) {
13 break; // Ends the loop when i is 5
14 }
15 console.log(i++);
16}
17// Outputs 0, 1, 2, 3, 4
במקרה זה, פקודת break
מתבצעת כאשר i
הופך ל-5. כתוצאה מכך, מוצגים מספרים מ-0
עד 4
.
דוגמה ל-continue
1for (let i = 0; i < 5; i++) {
2 if (i === 2) {
3 continue; // Skips when i is 2
4 }
5 console.log(i);
6}
7// Outputs 0, 1, 3, 4
8
9let i = 0;
10while (i < 5) {
11 i++;
12 if (i === 3) {
13 continue; // Skips when i is 3
14 }
15 console.log(i);
16}
17// Outputs 1, 2, 4, 5
במקרה זה, פקודת continue
מתבצעת כאשר i
הוא 2
. כתוצאה מכך, מוצגים מספרים שאינם 2
.
לולאות מקוננות ב-JavaScript
בתכנות ב-JavaScript, לולאה מקוננת (nested loop) היא מבנה שבו לולאה אחת נמצאת בתוך לולאה אחרת. לולאות כאלה הן יעילות מאוד כאשר אלגוריתמים או תהליכים מסוימים משתרעים על פני ממדים או שכבות מרובות. לדוגמה, עיבוד מערך רב-ממדי עם מערכים בתוך מערכים הוא מקרה טיפוסי.
כאן נסביר את המבנה הבסיסי של לולאות מקוננות, דוגמאות שימוש, אמצעי זהירות ושיקולי אופטימיזציה.
מבנה בסיסי של לולאות מקוננות
המבנה הבסיסי של לולאה מקוננת הוא צורה שבה לולאה אחת או יותר נמצאות בתוך לולאה אחרת. בכל פעם שהלולאה החיצונית מבוצעת פעם אחת, הלולאה הפנימית מבוצעת לפי אותו מספר פעמים.
להלן דוגמה בסיסית לשתי לולאות מקוננות.
1for (let i = 0; i < 3; i++) {
2 console.log(`Outer loop iteration: ${i}`);
3
4 for (let j = 0; j < 2; j++) {
5 console.log(` Inner loop iteration: ${j}`);
6 }
7}
8// Output:
9// Outer loop iteration: 0
10// Inner loop iteration: 0
11// Inner loop iteration: 1
12// Outer loop iteration: 1
13// Inner loop iteration: 0
14// Inner loop iteration: 1
15// Outer loop iteration: 2
16// Inner loop iteration: 0
17// Inner loop iteration: 1
בקוד שלמעלה, המשתנה i
נספר בלולאה החיצונית, והמשתנה j
נספר בלולאה הפנימית. בכל פעם שהלולאה החיצונית מבוצעת פעם אחת, הלולאה הפנימית מבוצעת פעמיים.
דוגמה מעשית של לולאות מקוננות
לולאות מקוננות שימושיות במיוחד עבור טיפול במערכים רב-ממדיים. לדוגמה, כאשר מעבדים מערך דו-ממדי, יש לטפל גם בשורות (לולאה חיצונית) וגם בעמודות (לולאה פנימית).
בדוגמה הבאה, אנו מטפלים במערך דו-ממדי ומדפיסים כל אלמנט.
1const matrix = [
2 [1, 2, 3],
3 [4, 5, 6],
4 [7, 8, 9]
5];
6
7for (let row = 0; row < matrix.length; row++) {
8 for (let col = 0; col < matrix[row].length; col++) {
9 console.log(`Element at [${row}][${col}] is: ${matrix[row][col]}`);
10 }
11}
12// Output:
13// Element at [0][0] is: 1
14// Element at [0][1] is: 2
15// Element at [0][2] is: 3
16// Element at [1][0] is: 4
17// Element at [1][1] is: 5
18// Element at [1][2] is: 6
19// Element at [2][0] is: 7
20// Element at [2][1] is: 8
21// Element at [2][2] is: 9
בדרך זו, השימוש בלולאות מקוננות מאפשר גישה לכל אלמנט במערך דו-ממדי.
הערות
ישנם כמה נקודות שיש להיות מודעים אליהן בעת שימוש בלולאות מקוננות.
-
נושאי ביצועים
כאשר לולאות מקוננות נעשות עמוקות יותר, זמן הביצוע עולה בחדות. לדוגמה, אם הלולאה החיצונית מבוצעת 100 פעמים והלולאה הפנימית 100 פעמים, מתבצעות בסך הכול 10,000 פעולות. לכן, אם יש הרבה חזרות בלולאה, יש לשקול אופטימיזציה של הלולאות למען היעילות.
-
יישום לאלגוריתמים מורכבים
לולאות מקוננות הן חזקות מאוד, אך ככל שהעיבוד נעשה מורכב יותר, קוד עלול להפוך קשה להבנה. לכן, לשם שמירה על קריאות הקוד, חשוב לארגן את העיבוד עם הערות ופונקציות מתאימות.
שיקולי אופטימיזציה
בעת שימוש בלולאות מקוננות, ניתן לשקול את האופטימיזציות הבאות.
-
סיום מוקדם של לולאה
אם תנאי מסוים מתקיים בתוך הלולאה, ניתן להשתמש בפקודת
break
כדי לצאת מהלולאה. דבר זה יכול למנוע לולאות מיותרות ולשפר את הביצועים.
1for (let i = 0; i < 5; i++) {
2 for (let j = 0; j < 5; j++) {
3 if (i + j > 5) {
4 break;
5 }
6 console.log(`i: ${i}, j: ${j}`);
7 }
8}
-
העברת חישובים החוצה
במקום לבצע את אותו חישוב בתוך הלולאה בכל פעם, ניתן לבצע אותו פעם אחת מחוץ ללולאה ולהשתמש בתוצאה כדי להפוך את התהליך ליעיל יותר.
1let array = [1, 2, 3, 4, 5];
2
3// Inefficient example (calculating every time)
4for (let i = 0; i < array.length; i++) {
5 for (let j = 0; j < array.length; j++) {
6 let sum = array[i] + array[j];
7 console.log(sum);
8 }
9}
10
11// Efficient example (calculating outside)
12let arrayLength = array.length;
13for (let i = 0; i < arrayLength; i++) {
14 for (let j = 0; j < arrayLength; j++) {
15 let sum = array[i] + array[j];
16 console.log(sum);
17 }
18}
סיכום
לולאות מקוננות מועילות מאוד לטיפול במבני נתונים מורכבים ובאלגוריתמים בג'אווהסקריפט. עם זאת, אם לא נעשה בהן שימוש נכון, הן עשויות לגרום לירידה בביצועים ולקריאות קוד מופחתת. על מנת להשתמש בלולאות מקוננות ביעילות, חשוב לשאוף לאופטימיזציה של הלולאות, לארגון הקוד ולנקוט בגישות מתאימות בהתאם למצב.
תוכלו לעקוב אחר המאמר שלמעלה באמצעות Visual Studio Code בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.