Menu

Destructuring ב-JavaScript: אובייקטים, מערכים, ברירות מחדל ו-rest

איך destructuring עובד ב-JavaScript: שליפת ערכים מאובייקטים וממערכים, שינוי שמות, ברירות מחדל, תבניות מקוננות ופרמטרים של פונקציות.

בדף הזה יש עורכים שאפשר להריץ - לערוך, להריץ ולראות את הפלט מיד.

Destructuring הוא התאמת תבניות לפי צורה

Destructuring מאפשר לכתוב תבנית שמשקפת את הצורה של אובייקט או מערך, ובסגנון של Python לשלוף ערכים לפי שם או לפי מיקום בשורה אחת. במקום לגשת לערך מאפיין אחרי מאפיין, מתארים מה רוצים ו-JavaScript מגיש את זה.

שני הסוגים:

הסוגריים המסולסלים מתאימים אובייקט לפי שם מאפיין. הסוגריים המרובעים מתאימים מערך לפי מיקום. בשני המקרים, המשתנים בצד שמאל הם הצהרות חדשות: אתם לא ניגשים לערך לפי אינדקס, אלא מתארים תבנית שמחלצת את החלקים.

לפני שהיה destructuring, אותו קוד נראה כך:

const name = user.name;
const age = user.age;
const first = scores[0];
const second = scores[1];

לא סוף העולם, אבל חוזר על עצמו ברגע שעושים את זה בכל פונקציה.

Destructuring של אובייקטים משתמש בשמות מאפיינים

באובייקטים, השמות בתוך הסוגריים המסולסלים חייבים להתאים לשמות המאפיינים במקור. הסדר לא משנה: JavaScript מחפש אותם לפי מפתח.

אם מאפיין לא קיים באובייקט, המשתנה יהיה undefined, בלי שגיאה:

חשוב לזכור את ההתנהגות השקטה הזו של undefined כשטעות הקלדה בשם מאפיין משאירה אתכם מגרדים בראש בשתיים בלילה.

שינוי שמות של משתנים

לפעמים שם המאפיין באובייקט הוא לא השם שאתם רוצים לתת למשתנה: אולי הוא מתנגש במשהו אחר ב-scope, או שה-API משתמש במוסכמת שמות שאתם לא אוהבים. השתמשו ב-original: newName כדי לקשור מחדש:

קראו את זה כ"קח את המאפיין id וקרא לו userId". שם המאפיין בא קודם, ושם המשתנה החדש אחרי הנקודתיים. זה נראה כמו הגדרת טיפוס משפות אחרות, אבל זה לא.

ערכי ברירת מחדל

אם מאפיין עשוי לחסור, תנו לו ברירת מחדל ישר בתוך התבנית:

ברירות מחדל נכנסות לפעולה רק כשהערך הוא undefined. null, 0 ו-"" עוברים כולם בלי שינוי:

זה תופס הרבה אנשים. אם רוצים ש-null יפעיל גם הוא את ברירת המחדל, צריך בדיקה מפורשת, או להשתמש באופרטור nullish coalescing ?? אחרי ה-destructuring.

אפשר לשלב ברירות מחדל עם שינוי שם:

Destructuring של מערכים משתמש במיקום

למערכים אין שמות, רק אינדקסים, ולכן התבנית מתאימה לפי מיקום. השתמשו בפסיקים כדי לדלג על איברים שלא מעניינים אתכם:

שני הפסיקים בהתחלה אומרים "דלג על אינדקס 0 ו-1". קצת צפוף לעין, אבל שימושי כשרוצים רק ערך אחד מהאמצע.

Destructuring של מערכים זוהר במיוחד עם פונקציות שמחזירות tuples:

אותה תבנית מופיעה בכל מקום ב-hooks של React: const [count, setCount] = useState(0).

תבניות rest: איסוף השאריות

בתוך תבנית destructuring, ...name אוסף את כל מה שלא הותאם לפי שם או מיקום לתוך משתנה חדש.

במערכים, rest תופס את הזנב:

באובייקטים, rest תופס כל מאפיין שלא נקרא בשמו במפורש:

זו הדרך המקובלת להסיר שדה אחד מאובייקט בלי לשנות אותו: rest הוא אובייקט חדש שמכיל הכל חוץ מ-id.

Rest חייב להיות האיבר האחרון בתבנית. const [...init, last] היא שגיאת תחביר.

Destructuring מקונן

תבניות יכולות להיות מקוננות. אם מאפיין הוא בעצמו אובייקט או מערך, אפשר לפרק גם אותו באותו ביטוי:

חזק, אבל השתמשו בזה בזהירות. שלוש רמות של סוגריים מקוננים מתחילות להרגיש כמו חידה. כשזה קורה, שלפו ערכי ביניים למשתנים משלהם: קריאות עדיפה על תחכום.

מלכודת אחת: data: { user } בתבנית לא יוצר משתנה בשם data. זו הוראה שאומרת "רד לתוך data והמשך לפרק". אם אתם צריכים את data עצמו, הוסיפו אותו בנפרד:

Destructuring של פרמטרים של פונקציה

המקום הנפוץ ביותר שבו תשתמשו ב-destructuring הוא רשימת הפרמטרים של פונקציה. הוא הופך "העבר אובייקט אפשרויות" לחתימה שמתעדת את עצמה:

בצד הקורא, זה נראה כמו כל קריאה עם אובייקט אפשרויות. בתוך הפונקציה מקבלים משתנים עם שמות וברירות מחדל, בלי עוד קוד תבניתי כמו options.name || "default".

פינה חדה אחת: קריאה לפונקציה הזו בלי ארגומנט קורסת, כי אי אפשר לפרק undefined. תנו לפרמטר כולו ברירת מחדל:

ה-= {} אחרי התבנית אומר "אם לא הגיע ארגומנט, נניח שזה אובייקט ריק". ואז ברירות המחדל הפנימיות נכנסות לפעולה.

החלפה והשמה מחדש

Destructuring עובד גם עם משתנים שכבר הוצהרו, אבל צריך סוגריים עגולים סביב תבנית האובייקט (אחרת JavaScript קורא את ה-{ כתחילת בלוק):

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

דוגמה מציאותית

שילוב של רוב מה שראינו: פונקציה שמעבדת תשובה מ-API:

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

הבא בתור: object spread

Destructuring שולף ערכים מתוך אובייקטים. Spread מכניס אותם פנימה: העתקה, מיזוג ודריסה. השניים הולכים יד ביד ב-JavaScript מודרני, ו-spread הוא הנושא הבא.

שאלות נפוצות

מה זה destructuring ב-JavaScript?

Destructuring הוא תחביר לשליפת ערכים מאובייקטים או ממערכים וקשירתם למשתנים בצעד אחד. const { name } = user; לוקח את המאפיין name מתוך user. const [first, second] = list; לוקח את שני האיברים הראשונים של list. זו תבנית בצד שמאל של = שמשקפת את הצורה של הערך בצד ימין.

איך משנים שם של משתנה בזמן destructuring?

השתמשו בתחביר { original: newName }. const { name: username } = user; שולף את המאפיין name מתוך user וקושר אותו למשתנה מקומי בשם username. קל לקרוא את זה בטעות כהגדרת טיפוס: זכרו ששם המאפיין בא קודם, ושם המשתנה החדש בא אחרי הנקודתיים.

אפשר להגדיר ערכי ברירת מחדל עם destructuring?

כן. const { timeout = 5000 } = options; משתמש ב-5000 אם options.timeout הוא undefined. ברירות מחדל חלות רק על undefined: null, 0 ו-'' עוברים בלי שינוי. אפשר לשלב ברירות מחדל עם שינוי שם: const { t: timeout = 5000 } = options;.

מה ההבדל בין destructuring ל-spread?

הם נראים דומים אבל עושים דברים הפוכים. Destructuring (const { a, b } = obj) שולף ערכים מתוך מבנה. Spread (const copy = { ...obj }) מכניס ערכים לתוך מבנה חדש. ה-... בתוך תבנית destructuring הוא תבנית rest: הוא אוסף את השאריות לתוך משתנה חדש.

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל