js Symbol

در جاوااسکریپت، Symbol یک نوع داده‌ی منحصربه‌فرد (Primitive Type) است که برای ایجاد شناسه‌های یکتا (Unique Identifiers) استفاده می‌شود.
هر Symbol مقدار یکتای خودش را دارد و هیچ Symbol دیگری—even با مقدار ظاهراً مشابه—با آن برابر نیست.

🔹 ساخت یک Symbol

برای ساخت Symbol از تابع ()Symbol استفاده می‌کنیم:

const id = Symbol();
console.log(id);

📌 خروجی:

Symbol()

🔹 Symbol با توضیح (Description)

می‌توان برای شفاف‌تر شدن، توضیحی درون پرانتز قرار داد (اما این توضیح در مقایسه‌ها تأثیری ندارد):

const id1 = Symbol("user");
const id2 = Symbol("user");

console.log(id1 === id2);

📌 خروجی:

false

هر دو Symbol توضیح یکسان دارند، ولی مقدارشان متفاوت و یکتا است.

🔹 استفاده از Symbol به‌عنوان کلید در شیء

Symbol معمولاً برای تعریف ویژگی‌هایی استفاده می‌شود که نباید با کلیدهای دیگر تداخل پیدا کنند:

const userId = Symbol("id");

const user = {
  name: "Ali",
  [userId]: 123
};

console.log(user[userId]);

📌 خروجی:

123

🔹 پنهان بودن Symbol در پیمایش شیء

ویژگی‌هایی که با Symbol تعریف شده‌اند در متدهایی مثل for...in یا ()Object.keys دیده نمی‌شوند:

for (let key in user) {
  console.log(key);
}

📌 خروجی:

name

فقط ویژگی‌های معمولی نمایش داده می‌شوند، نه آن‌هایی که کلیدشان Symbol است.

🔹 دسترسی به Symbol‌ها با متد مخصوص

برای دیدن Symbolهای یک شیء از ()Object.getOwnPropertySymbols استفاده می‌شود:

console.log(Object.getOwnPropertySymbols(user));

📌 خروجی:

[ Symbol(id) ]

🔹 Symbol‌های سراسری (Global Symbols)

با استفاده از ()Symbol.for می‌توان Symbolهایی ساخت که در سطح برنامه قابل‌دسترسی مجدد هستند:

const sym1 = Symbol.for("app.id");
const sym2 = Symbol.for("app.id");

console.log(sym1 === sym2);

📌 خروجی:

true

در این حالت، هر دو به یک Symbol سراسری اشاره دارند.

نکته:

  • Symbol همیشه یکتا است و نمی‌توان آن را به رشته به‌صورت خودکار تبدیل کرد.

  • برای تبدیل دستی می‌توانید از String(symbol) یا ()symbol.toString استفاده کنید.

  • از Symbol معمولاً برای جلوگیری از تداخل نام در اشیا یا ایجاد ویژگی‌های خصوصی استفاده می‌شود.