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 معمولاً برای جلوگیری از تداخل نام در اشیا یا ایجاد ویژگیهای خصوصی استفاده میشود.