جاوا اسکریپت از هفت نوع داده اصلی(primitive) پشتیبانی می کند: string, number, bigint, boolean, null, undefined و symbol . در میان این نوع داده ها شاید کمتر در مورد Symbol شنیده باشید.
داده Symbol برای ایجاد کلید های یکتا مورد استفاده قرار گیرد و دارای متدهای استاتیک و یک ساختار object داخلی است. این نوع داده فاقد constructor می باشد و امکان استفاده از new برای ایجاد شیء symbol ممکن نمی باشد.
const symObj = new Symbol(‘chars’);
اجرای عبارت بالا سبب ایجاد خطا از نوع type می شود.
برای ایجاد کلید یکتا می توانیم از symbol به صورت زیر استفاده کنیم:
const symObj = Symbol(‘chars’);
نکته: کلیدهایی که با symbol ایجاد می شوند هرگز یکسان نخواهند بود حتی اگر رشته یکسان تعریف داده شده باشد.
Symbol(‘chars’) === Symbol(‘chars’) // print false
یکی از موارد استفاده از symbol آن است که می تواند برای تعریف ویژگی های خصوصی در object ها استفاده شود.
const sym1 = Symbol(“A”); const sym2 = Symbol(“B”); const sym3 = Symbol(“C”); const newObj = { “hello”: “Hello World”, [sym1]: “Hello”, [sym2]: “World”, }; newObj[sym3] = “Bye World”;
در صورت چاپ کردن متغیر newObj مقدار آن به همراه کلیدهای symbol نمایش داده می شود.
console.log(newObj); /* * hello: "Hello World" * Symbol(A): "Hello" * Symbol(B): "World" * Symbol(C): "Bye World" */
1- ویژگی های object که از نوع symbol هستند در Object.entries, Object.keys و سایر حلقه های تکرار همانند for...in نمایش داده نمی شوند:
console.log(Object.entries(newObj)); // (2) [“hello”, “Hello World”]
همچنین در متد JSON.stringify نیز نمایش داده نمی شوند:
console.log(JSON.stringfy(newObj)); // {“hello”: “Hello World”}
2- با استفاده از متد Object.getOwnPropertySymbols می توانیم ویژگی های object که از نوع symbol هستند را در خروجی نمایش دهیم:
console.log(Object.getOwnPropertySymbols(newObj)); /* * (3) [Symbol(A), Symbol(B), Symbol(C)] * 0: Symbol(A) * 1: Symbol(B) * 2: Symbol(C) */
3- با استفاده از دو متد Symbol.for و Symbol.keyFor می توانیم برای رشته های همسان مورد استفاده در Symbol یک کلید یکسان تولید کنیم.
const sym1 = Symbol.for(“A”); const sym2 = Symbol.for(“A”); let newObj = {[sym1]: “Hello”}; newObj[sym2] += “ World”; console.log(newObj[sym1]); // print “Hello World”