שיפור לולאת for ב-JavaScript

שייך לקטגוריות JavaScript

בד"כ, לולאת for רגילה נכתבת כך:

for (var i=0;i<someArray.length;i++) {
	var item=someArray[i];
	alert(item);
}

שיפור קל ללולאה הזו:

for (var i=0,item;item=someArray[i];i++) {
	alert(item);
}

הגדרנו את item ב-condition statement של הלולאה, שקורה לפני כל איטרציה. כך אנו ניגשים אליו בצורה טבעית כמו בלולאת foreach.

הלולאה תעצר ברגע שהתנאי [item=someArray[i כבר לא יחזיר שווה ערך ל-true (ערך מהמערך) אלא שווה ערך ל-false (ערך שלא נמצא באינדקס i הנוכחי, undefined).

בלולאה כדאי להשתמש רק במעבר על collection, למשל getElementsByTagName, childNodes, זאת מאחר וריצה על ערכים שעלולים לכלול 0, undefined, null, מחרוזת ריקה או כל ערך השווה ל-false תופסק באמצע.



קטגוריות

חיפוש

עיקבו אחרי (אקספרימנטלי!)

9 תגובות

כתיבת תגובה

31.12.06 בשעה 8:58
גלעד

יפה מאוד!
אחד הטיפים הטובים…!

1
31.12.06 בשעה 23:13
ניר טייב
(אתר)

שיטה יעילה.

התייחסתי לפוסט שלך בבלוג שלי.

2
01.01.07 בשעה 12:45
שי

נחמד אבל גם פחות קריא.
זה משפר ביצועים משהו?

3
01.01.07 בשעה 13:49
ניר טייב
(אתר)

מבדיקות שערכתי זה מהיר יותר בכ-33% מהשיטה הרגילה.

4
04.03.07 בשעה 23:40
יוני לוי

הא? לא יוצא לי לעבוד עם JS לעיתים קרובות, אבל זה פשוט עקום.
מה אם someArray[i] == 0?

5
05.03.07 בשעה 9:18
אלעד
יוני לוי אמר/ה:
הא? לא יוצא לי לעבוד עם JS לעיתים קרובות, אבל זה פשוט עקום.
מה אם someArray[i] == 0?

שים לב למשפט הבא:

בלולאה כדאי להשתמש רק במעבר על collection, למשל getElementsByTagName, childNodes, זאת מאחר וריצה על ערכים שעלולים לכלול 0, undefined, null, מחרוזת ריקה או כל ערך השווה ל-false תופסק באמצע.

ולהתייחסותך לגבי "עקימות" הדרך:
תכנות ב-JS הוא לא תכנות "אמיתי" ואין להתייחס אליו ככזה. השפה נותנת גמישות עצומה וכתיבה ככל העולה על רוחו של המפתח.
זהו חיסרון בולט מצד אחד, מאחר והקוד לא קריא למפתחים אחרים, אך יתרון לא קטן מצד שני עקב שיפור ביצועים.
קח לדוגמה (RegEx(p. מפתחים רבים חוששים משימוש בו כי הוא לא מספיק קריא ויעדיפו לכתוב עשרות שורות קוד כדי לבצע ולידאציה על כתובת email או טלפון (לעומת שורה אחת בלבד בשימוש ב-RegEx).
אני רואה את הדבר קצת אבסורדי :)

6
05.03.07 בשעה 19:55
יוני לוי
אלעד אמר/ה:
יוני לוי:הא? לא יוצא לי לעבוד עם JS לעיתים קרובות, אבל זה פשוט עקום.

מה אם someArray[i] == 0?

שים לב למשפט הבא:
בלולאה כדאי להשתמש רק במעבר על collection, למשל getElementsByTagName, childNodes, זאת מאחר וריצה על ערכים שעלולים לכלול 0, undefined, null, מחרוזת ריקה או כל ערך השווה ל-false תופסק באמצע.

ולהתייחסותך לגבי "עקימות" הדרך:
תכנות ב-JS הוא לא תכנות "אמיתי" ואין להתייחס אליו ככזה. השפה נותנת גמישות עצומה וכתיבה ככל העולה על רוחו של המפתח.
זהו חיסרון בולט מצד אחד, מאחר והקוד לא קריא למפתחים אחרים, אך יתרון לא קטן מצד שני עקב שיפור ביצועים.
קח לדוגמה (RegEx(p. מפתחים רבים חוששים משימוש בו כי הוא לא מספיק קריא ויעדיפו לכתוב עשרות שורות קוד כדי לבצע ולידאציה על כתובת email או טלפון (לעומת שורה אחת בלבד בשימוש ב-RegEx).
אני רואה את הדבר קצת אבסורדי :)

בקשר להערה הראשונה, אני מתנצל, כנראה פספסתי את השורות האלו.
לגבי ההערה השנייה, אני חולק עלייך. לא משנה באיזה שפה אתה כותב, תמיד קריאות חשובה על יעול סתמי. אם אחרי profiling מצאת קטע קריטי שחשוב לך לייעל – ייעל כאוות נפשך. יש הבדל בין הדוגמה שהבאת עם regexp* לבין הטריק הנ"ל, שכן הבעיה שregexp עוזר לנו לפתור היא בעיה כבדה שפתרון סתמי שלה כמעט תמיד יהיה איטי מדי לצרכינו, לעומת איטרציה של לולאה שהיא פעולה מאד לא קריטית.

* זאת צרה אחרת לגמרי, גם מregexp צריך להיפטר אבל לא במחיר של ביצועים, פשוט לפתח סינטקס יותר קריא.

7
13.07.07 בשעה 19:09
עומרי

שכחת את השיפור הכי פשוט שעדיף לעשות לכל לולאה

במקום לכתוב ++i עדיף לכתוב i++

בגלל שבראשון הסקריפט קודם מחזיר את i ואז מעדכן אותו
ובשני הוא ישר מעלה את ערך אני אישית לא בדקתי אם זה משפר את הביצועים
אבל אני בכל מקרה עושה את זה

8
13.07.07 בשעה 19:11
עומרי

אני עכשיו מסתכל והאנגלית התהפכה אז שימו לב זה אמור להיות הפוך

9

כתיבת תגובה

תגיות מותרות לשימוש בתוכן
XHTML: אפשר להשתמש בתגים הללו: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre>