מה יש לך נגד for...in
אחת הלולאות שהיו פעם פופולריות ב JavaScript אבל בשנים האחרונות מתכנתים כמעט והפסיקו להשתמש בהן היא לולאת for...in. לולאה זו נועדה לרוץ על כל המפתחות של אוביקט למשל כדי להדפיס את כל תוכן האוביקט או לחפש מפתח של ערך מסוים.
בדוגמא מעשית נניח שיש לנו אוביקט שמחזיק כתובות מייל של משתמשים:
const email = {
bob: 'bob@gmail.com',
jane: 'jane@gmail.com',
dave: 'dave@hotmail.com',
};
אז נוכל להשתמש בלולאת for...in כדי להדפיס את כל האנשים שיש להם כתובת מייל בג'ימייל:
for (let name in email) {
const address = email[name];
if (address.endsWith('@gmail.com')) {
console.log(name);
}
}
אבל - לולאת for...in כוללת גם מוקש קטן. המפתחות שחוזרים הם לא רק המפתחות מהאוביקט שאתם סורקים, אלא גם המפתחות מכל ה Prototypes של אותו אוביקט. לכן הקוד הבא ידפיס 3:
let count = 0;
const one = { a: 10, b: 20 };
const two = Object.create(one);
two.c = 30;
for (let k in two) {
// count the keys
count ++;
}
console.log(count);
הלולאה ספרה שני מפתחות מהאוביקט one ועוד מפתח אחד מהאוביקט two וכך הגיעה ל-3. כשיש לנו אוביקט ביד לא תמיד אנחנו יודעים לצפות מי ה Prototype שלו ואיזה מאפיינים הגיעו מאותו Prototype, ולכן לולאות for...in עלולות לרוץ על יותר מפתחות ממה שציפינו.
בקוד JavaScript חדש אנחנו מעדיפים להשתמש בפונקציה Object.keys שמחזירה רק את המפתחות של האוביקט שהעברתם לה. קוד מקביל עם Object.keys יראה כך והפעם ידפיס 1:
let count = 0;
const one = { a: 10, b: 20 };
const two = Object.create(one);
two.c = 30;
for (let k of Object.keys(two)) {
// count the keys
count ++;
}
console.log(count);