الرمز

Browser Support

  • Chrome: 38.
  • Edge: 12.
  • Firefox: 36.
  • Safari: 9.

Source

يمثّل الرمز الأساسي قيمة فريدة لا تتعارض أبدًا مع أي قيمة أخرى، بما في ذلك قيمة الرموز الأساسية الأخرى. يتم تقييم سلسلتَين أساسيتَين مكونتَين من أحرف متطابقة على أنّهما متساويتان تمامًا:

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 لإنشاء رمز؟

نعم
لا

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

الرموز التي تستخدمها بشكل متكرّر
مفاتيح السمات الفريدة للوصول إلى الطرق المضمّنة في JavaScript وتعديلها
الخصائص الثابتة لكائن Symbol