يمثّل الرمز الأساسي قيمة فريدة لا تتعارض أبدًا مع أي قيمة أخرى، بما في ذلك قيمة الرموز الأساسية الأخرى. يتم تقييم سلسلتَين أساسيتَين مكونتَين من أحرف متطابقة على أنّهما متساويتان تمامًا:
String() === String()
> true
String( "My string." ) === String( "My string." );
> true
ومع ذلك، لا يمكن أن يكون أي رمزَين تم إنشاؤهما باستخدام الدالة Symbol()
متطابقَين تمامًا:
Symbol() === Symbol()
> false
تتيح لك هذه السمة استخدام الرموز كمفاتيح خاصة للسمات في عنصر معيّن، ما يمنع حدوث تداخل مع مفاتيح قد يضيفها أي رمز آخر إلى هذا العنصر.
const mySymbol = Symbol( "Desc" );
const myObject = {};
myObject[mySymbol] = "propSymbol";
myObject
> Object { Symbol("Desc"): "propSymbol" }
هناك ثلاثة أنواع من الرموز:
- الرموز التي تم إنشاؤها باستخدام
Symbol()
- الرموز المشترَكة التي يتم ضبطها واستردادها من قاعدة بيانات عالمية للرموز باستخدام
Symbol.for()
- "الرموز المعروفة" التي تم تعريفها كسمات ثابتة في عنصر Symbol تحتوي هذه الرموز على طرق داخلية لا يمكن استبدالها عن طريق الخطأ.
يقبل 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، فإنّه من المقصود استخدام هذه القيم الرمزية كـ "نقاط إضافة" للمطوّرين الذين يعدّلون سلوك JavaScript بدون التسبب في مشاكل التوافق مع الإصدارات القديمة.
غالبًا ما يتم وضع أسلوب على قيم الرموز المعروفة باستخدام بادئة
@@
أو يتم لفّها في %
لتمييز مفاتيحها عن النماذج الأولية القابلة للتغيير. على سبيل المثال، @@match
(أو %match%
) هو إشارة إلى العنصر الثابت Symbol.match
، وليس
String.prototype.match
.
التحقّق من فهمك
هل يمكنك استخدام new
لإنشاء رمز؟
أي مما يلي يصف الرموز "المعروفة"؟