DanLevy.net

חידון: Symbols ו-Enumerables

מכירים את החלקים הפחות מוכרים של ES2015?

חידון: ממשקי JavaScript, Symbols ו-Enumerables

כיצד עליך לגשת לנכס של אובייקט JavaScript שמשתמש במתודת getter?

const obj = {
get val() {
return 'got it!';
}
};
console.log(obj.val);

ב-JavaScript, ניתן לגשת ל-getter כמו לנכס רגיל. אין צורך לקרוא לו כמו פונקציה. בדוגמה זו, גישה ל-obj.val ישירות מפעילה את מתודת ה-getter ומדפיסה got it!.

מהי הדרך הנכונה ליצור מפתח מאפיין ייחודי באמת עבור אובייקט JavaScript?

const uniqueKey = Symbol('myUniqueKey');
const obj = {
[uniqueKey]: 'unique value'
};
console.log(obj[uniqueKey]);

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

האם המאפיין age יופיע במהלך איטרציית for...in?

const person = {};
Object.defineProperty(person, 'age', {
value: 25,
enumerable: true
});
for (let key in person) {
console.log(key);
}

המאפיין enumerable ב-Object.defineProperty() קובע אם המאפיין יופיע בשיטות מנייה כמו for...in. בדוגמה זו, מכיוון ש-enumerable: true, המאפיין age יופיע במהלך האיטרציה.

מהי ברירת המחדל של ספירה של מאפיין כאשר משתמשים ב-Object.defineProperty() מבלי לציין enumerable?

const car = {};
Object.defineProperty(car, 'make', {
value: 'Toyota'
});
console.log(Object.keys(car));

כאשר אתה משתמש ב-Object.defineProperty() מבלי לציין enumerable, ערך ברירת המחדל שלו הוא false. משמעות הדבר היא שהמאפיין make לא יופיע ב-Object.keys() או בשיטות ספירה אחרות.

מה תהיה התוצאה של ההשוואה הבאה?

const sym1 = Symbol('id');
const sym2 = Symbol('id');
console.log(sym1 === sym2);

כל קריאה ל-Symbol() יוצרת ערך ייחודי ובלתי ניתן לשינוי, גם אם התיאור זהה. במקרה זה, sym1 ו-sym2 הם סימבולים שונים, כך שההשוואה מחזירה false.

האם המאפיין עם מפתח Symbol יופיע במהלך איטרציית for...in?

const sym = Symbol('uniqueKey');
const obj = {
[sym]: 'symbol value',
regularKey: 'regular value'
};
for (let key in obj) {
console.log(key);
}

למאפיינים עם מפתחות Symbol יכולה להיות דגל enumerable משלהם, אבל for...in ו-Object.keys() מבקרים רק במאפיינים הניתנים למנייה עם מפתחות מחרוזת. בדוגמה זו, רק regularKey יופיע ברשימה, לא המאפיין עם מפתח Symbol.

באיזו שיטה ניתן להשתמש כדי לאחזר את כל מפתחות Symbol של אובייקט?

השיטה Object.getOwnPropertySymbols() משמשת לאחזור מפתחות Symbol עצמיים של אובייקט.

const sym1 = Symbol('id');
const sym2 = Symbol('name');
const obj = {
[sym1]: 'symbol value',
[sym2]: 'another symbol value'
};
console.log(Object.getOwnPropertySymbols(obj));
// [Symbol(id), Symbol(name)]