הסמל ב-Javascript

הכר את הסמלים: סוג הנתונים הייחודי למאפייני אובייקט

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

שימוש בסמלים ב-Javascript

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

יצירת סמל היא פשוטה.

const mySymbol = Symbol();

אתה יכול גם ליצור סמל עם תיאור.

const mySymbol = Symbol("my description");

אם תיצור מספר סמלים עם אותו תיאור, הם יהיו ערכים שונים.

const sym1 = Symbol("foo");
const sym2 = Symbol("foo");

// false
console.log(sym1 === sym2);

מה מייחד את הסמלים

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

const obj = {};
obj[mySymbol] = "bar";

// "bar"
console.log(obj[mySymbol]);

אתה יכול להשתמש בסמלים כמפתחות עבור מאפייני אובייקט, אך אינך יכול להשתמש בהם בתור שמות מאפיינים (מפתחות) ב-JSON.

const sym = Symbol("foo");
const obj = { [sym]: "bar" };

// {}
console.log(JSON.stringify(obj));

סמלים אינם נספרים, ולכן הם לא יופיעו כאשר אתה משתמש בלולאת for-in על אובייקט.

const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";

for (var key in obj) {
  // undefined
  console.log(key);
}

אתה יכול להשתמש ב- Object.getOwnPropertySymbols כדי לקבל מערך של כל הסמלים על אובייקט.

const obj = {};
obj[Symbol("a")] = "a";
obj[Symbol("b")] = "b";

const symbols = Object.getOwnPropertySymbols(obj);

// [Symbol(a), Symbol(b)]
console.log(symbols);

שימוש בסמל כאיטרטור

אתה יכול להשתמש בסמל Symbol.iterator הידוע כדי לקבל סמל שיכול לשמש כאיטרטור.

const arr = [1, 2, 3];
const it = arr[Symbol.iterator]();

// { value: 1, done: false }
console.log(it.next());

// { value: 2, done: false }
console.log(it.next());

// { value: 3, done: false }
console.log(it.next()); 

// { value: undefined, done: true }
console.log(it.next());

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

אתה יכול ליצור סמלים משלך, אבל אין דרך להבטיח שהם ייחודיים. אם אתה צריך סמל ייחודי, עליך להשתמש בסמל().

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

const person = {
  name: "John Doe"
};
const birthYear = Symbol("birth year");
person[birthYear] = "1955";

for (var key in person) {
  // name
  console.log(key); 
}

// 1955
console.log(person[birthYear]);