الرمز

الرموز جديدة نسبيًا الذي تم طرحه في 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 لإنشاء رمز؟

لا
نعم

أي مما يلي يصف الرموز "المعروفة جيدًا"؟

مفاتيح خصائص فريدة للوصول إلى لغة JavaScript وتعديلها الأساليب المضمنة
الخصائص الثابتة لكائن `Symbol`
الرموز التي تستخدمها كثيرًا