از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
نمادهای ES6 از میان تمام ویژگیهای جدید ES6، Symbols ممکن است یکی از جالبترین ویژگیها برای من باشد. من هرگز یک نبوده ام Ruby توسعه دهنده، بنابراین من هرگز این انواع اولیه را در عمل ندیده یا استفاده نکرده ام. این یک مفهوم جالب است، و من در طول این مقاله به موارد ضروری می پردازم. ES6…
سرفصلهای مطلب
معرفی
از میان تمام ویژگی های جدید ES6، نمادها شاید یکی از جالب ترین ها برای من باشد من هرگز یک نبوده ام Ruby توسعه دهنده، بنابراین من هرگز این انواع اولیه را در عمل ندیده یا استفاده نکرده ام. این یک مفهوم جالب است، و من در طول این مقاله به موارد ضروری می پردازم.
نمادهای ES6
بنابراین، نماد جاوا اسکریپت دقیقاً چیست؟ این یک نوع داده بدوی، منحصر به فرد، تغییرناپذیر و بدوی است که در ES6 معرفی شده است، که در اصل به منظور ارائه ویژگی های خصوصی بود.
var sym = Symbol();
typeof sym; // Returns "symbol"
از نمادها می توان برای دسترسی به خصوصیات شیء استفاده کرد، درست مانند رشته ها:
var obj = {};
var sym = Symbol();
obj(sym) = "a";
console.log(obj(sym)); // Prints "a"
تفاوت اصلی در اینجا اموال قابل دسترسی است sym
در صورت تکرار در شی نشان داده نمی شود روی، یا اگر stringify
d. مثلا:
var obj = {};
var sym = Symbol();
obj('hi') = "bye";
obj(sym) = "a";
console.log(obj); // Prints "{hi: 'bye'}"
for (var i in obj) {
console.log(i); // Prints "hi"
}
console.log(JSON.stringify(obj)); // Prints {"hi":"bye"}
بنابراین، همانطور که می بینید، فقط روشی که شما می توانید به یک ویژگی “symboled” دسترسی پیدا کنید، با شی نماد اصلی است، در غیر این صورت حتی نمی دانید که این ویژگی وجود دارد. بنابراین این بدان معناست که ما می توانیم از Symbols استفاده کنیم تا در نهایت ویژگی های خصوصی در جاوا اسکریپت داشته باشیم، درست است؟ جواب منفی. به نظر می رسد، نمادها به شدت از مشخصات اصلی کاهش یافته اند (به دلایلی که برای من ناشناخته است)، و نمی توان از آنها برای ایجاد ویژگی های خصوصی قابل اعتماد استفاده کرد. از طریق می توان به نمادهای یک شیء دسترسی داشت Object.getOwnPropertySymbols
، بنابراین آنها را برای همگان عمومی می کند.
var obj = {};
var sym = Symbol();
obj('hi') = "bye";
obj(sym) = "a";
Object.getOwnPropertySymbols(obj); // Returns ( Symbol() )
یک هشدار، بسیاری از مردم هنوز بر این باورند که نمادهای JS ویژگی های خصوصی اشیاء را ارائه می دهند، بنابراین مراقب آنچه می خوانید و باور می کنید باشید. روی انجمن ها و Stack Overflow. امیدواریم زمانی که ES6 به جریان اصلی تبدیل شود، تصورات غلط اصلاح شود.
همچنین ممکن است نمونههای زیادی را مشاهده کنید که در آن نماد یک رشته اختیاری ارسال میشود، مانند:
var sym = Symbol("foo");
این توصیف کننده به شدت برای اهداف اشکال زدایی استفاده می شود و بر منحصر به فرد بودن نماد تأثیر نمی گذارد. برای روشن تر شدن این موضوع، مثالی در اینجا آمده است:
Symbol("foo") === Symbol("foo"); // Evaluates to false
var sym = Symbol("foo");
console.log(sym.toString()); // Prints "Symbol(foo)"
دامنه جهانی
مهم است که بدانیم با استفاده از Symbol()
تابع یک نماد جهانی که در محدوده جهانی موجود است ایجاد نمی کند. نماد به شیئی که در آن استفاده می شود خاص باقی می ماند. با این حال، می توانید با استفاده از نمادهای جهانی ایجاد کنید Symbol.for()
و Symbol.keyFor()
برای دریافت و تنظیم نمادها از ثبت جهانی نمادها.
Symbol.for(key)
نمادهای موجود را با کلید داده شده (رشته) جستجو می کند و در صورت یافتن آن را برمی گرداند. اگر نماد پیدا نشد، نماد جدیدی در رجیستری جهانی با کلید داده شده ایجاد می شود و سپس برگردانده می شود.
Symbol.for("foo"); // Creates a new global symbol
var sym = Symbol.for("foo"); // Retrieves the already created symbol
بر خلاف Symbol((description))
، با مشخص کردن کلید در Symbol.for(key)
میکند هر بار همان نماد را برگردانید، بنابراین:
Symbol.for("bar") === Symbol.for("bar"); // Evaluates to true
Symbol("bar") === Symbol("bar"); // Evaluates to false
Symbol.keyFor(sym)
اساساً مخالف است Symbol.for(key)
، به جای پاس دادن کلید برای به دست آوردن نماد، نماد را برای گرفتن یک کلید پاس می دهید.
var sym = Symbol.for("foo"); // Creates new global symbol
console.log(Symbol.keyFor(sym)); // Prints "foo"
نتیجه
اگرچه نمادهای جاوا اسکریپت ایده ای جدید و تا حدودی جالب هستند، اما من در مورد مفید بودن آنها بدون ضمانت خصوصیات خصوصی تردید دارم. برخی از افراد پیشنهاد کردهاند که برای اجتناب از تضادهای نامگذاری خوب هستند، که میتواند مفید باشد، اما من معتقدم که پتانسیل واقعی آنها بدون ارائه داراییهای خصوصی واقعی محقق نخواهد شد. با بهروزرسانیهای آینده، خواهیم دید که اوضاع چگونه پیش میرود.
نظر شما در مورد نمادها چیست؟ از چه راه هایی آنها را مفید دانسته اید؟ در نظرات به ما اطلاع دهید!
(برچسبها برای ترجمه)# توضیح داده شده
منتشر شده در 1403-01-30 20:34:05