الرموز جديدة نسبيًا الذي تم طرحه في ES6. يمثل الرمز البدائي قيمة فريدة لا يتعارض مع أي قيمة أخرى، بما في ذلك قيم مبادئ الرموز الأخرى. يتم تقييم اثنين من بدايات السلسلة المكونة من أحرف متطابقة على أنها يساوي:
String() === String()
> true
String( "My string." ) === String( "My string." );
> true
ومع ذلك، لا يمكن مطلقًا إنشاء أي رمزين تم إنشاؤهما باستخدام الدالة Symbol()
يساوي تمامًا:
Symbol() === Symbol()
> false
وتتيح لك هذه السمة استخدام الرموز كمفاتيح خصائص فريدة في الكائن، مما يمنع والاصطدامات مع المفاتيح التي قد يضيفها أي رمز آخر إلى هذا الكائن.
const mySymbol = Symbol( "Desc" );
const myObject = {
}
myObject
> Object { Symbol("Desc"): "propSymbol" }
هناك ثلاثة أنواع من الرموز:
- رموز تم إنشاؤها باستخدام
Symbol()
- الرموز المشتركة التي يتم تعيينها واستردادها من سجل الرموز العالمي باستخدام
Symbol.for()
- "الرموز المعروفة" بوصفها خصائص ثابتة في كائن الرمز. تحتوي هذه الرموز على طرق داخلية لا يمكن استبدالها عن طريق الخطأ.
تقبل Symbol()
الوصف (أو "اسم الرمز") كوسيطة اختيارية.
هذه الأوصاف هي تسميات يمكن للإنسان قراءتها لأغراض تصحيح الأخطاء،
لا تؤثر على تفرد النتيجة. تعرض أي مكالمة إلى "Symbol
"
رمز فريد تمامًا، حتى إذا كانت المكالمات المتعددة متطابقة
الأوصاف:
Symbol( "My symbol." ) === Symbol( "My symbol." );
> false
كما هو الحال مع أنواع البيانات الأساسية الأخرى، تكتسب الرموز الطرق والخصائص من النموذج الأوّلي. على سبيل المثال، يمكنك الوصول إلى وصف على أنّه خاصية موروثة للرمز الذي تم إنشاؤه:
let mySymbol = Symbol( "My symbol." );
mySymbol.description
> "My symbol."
ولكن لا يمكنك إنشاء رمز باستخدام الكلمة الرئيسية new
:
let mySymbol = new Symbol();
> Uncaught TypeError: Symbol is not a constructor
الرموز غير قابلة للتعداد، ما يعني عدم توفُّر خصائص رمزية.
عند استخدام طرق قياسية لتكرارها. getOwnPropertySymbols()
إلى خصائص رموز الكائن.
الرموز المشترَكة
تحاول الطريقة Symbol.for()
البحث عن أي رموز حالية في
سجل الرموز العالمي على مستوى وقت التشغيل مع سلسلة محددة كمفتاح، ويعيد
بالرمز المطابق إذا تم العثور على واحد. وإذا لم يعثر على أي منها، فإنه ينشئ رمزًا
بالمفتاح المحدد وإضافته إلى السجل العالمي:
let sharedSymbol = Symbol.for( "My key." );
sharedSymbol === Symbol.for( "My key." )
> true
لا تشارك هذه المفاتيح أي تداخل وظيفي مع الأوصاف المخصصة إلى
قواعد Symbol
التي أنشأها المؤلف للوصول إلى رمز في سجل الرموز،
يجب أولاً إنشاؤه باستخدام for()
:
Symbol( "String" ) === Symbol( "String" );
> false
Symbol( "String" ) === Symbol().for( "String" );
> false
Symbol().for( "String" ) === Symbol().for( "String" );
> true
لاسترداد المفتاح لأي رمز من سجل الرموز، استخدم
Symbol.keyFor()
:
let mySymbol = Symbol.for( "Key." );
Symbol.keyFor( mySymbol ) ;
> "Key."
"معروف" الرموز
الرموز المعروفة هي خصائص ثابتة للكائن Symbol
، ولكل سمة منها
هو رمز في حد ذاته. توفر الرموز المعروفة مفاتيح ملكية فريدة
الوصول إلى طرق JavaScript المضمنة وتعديلها، مع منع الواجهات الأساسية
السلوك من الكتابة فوقه بدون قصد.
Symbol;
> function Symbol()
asyncIterator: Symbol(Symbol.asyncIterator)
for: function for()
hasInstance: Symbol("Symbol.hasInstance")
isConcatSpreadable: Symbol("Symbol.isConcatSpreadable")
iterator: Symbol(Symbol.iterator)
keyFor: function keyFor()
length: 0
match: Symbol("Symbol.match")
matchAll: Symbol("Symbol.matchAll")
name: "Symbol"
prototype: Object { … }
replace: Symbol("Symbol.replace")
search: Symbol("Symbol.search")
species: Symbol("Symbol.species")
split: Symbol("Symbol.split")
toPrimitive: Symbol("Symbol.toPrimitive")
toStringTag: Symbol("Symbol.toStringTag")
unscopables: Symbol("Symbol.unscopables")
<prototype>: function ()
ولأن الرموز هي ميزة خاصة بـ ES6، فإن هذه القيم الرمزية التي تهدف إلى استخدامها كـ "نقاط إضافة" للمطورين الذين يعدلون لغة السلوك دون إدخال مشكلات التوافق مع الإصدارات القديمة.
غالبًا ما يتم تنميط قيم الرموز المشهورة باستخدام
بادئة @@
أو ملفوف في %
إلى
للتمييز بين مفاتيحها عن نماذجها الأوّلية القابلة للتغيير. على سبيل المثال: @@match
(أو %match%
) هي إشارة إلى Symbol.match
غير قابل للتغيير،
String.prototype.match
التحقق من فهمك
هل يمكنك استخدام new
لإنشاء رمز؟
أي مما يلي يصف الرموز "المعروفة جيدًا"؟