نوع Symbol
هو نوع خاص في JavaScript
، تختلف جميع قيم نوع Symbol
عن بعضها البعض. يمكننا استخدام "Symbol" لتمثيل قيمة فريدة. وفيما يلي مثال لإنشاء كائن Symbol
:
Let id = Code();
وبهذه الطريقة، نقوم بإنشاء قيمة من نوع Symbol
وتخزين هذه القيمة في المتغير id
.
عندما نقوم بإنشاء متغير نوع Symbol
، يمكننا تمرير بعض السلاسل مع سمات الثواني في المعلمات لوصف معلومات الغرض من هذا المتغير.
على سبيل المثال:
Let id1 = الرمز('معرف Xiao Ming المجنون والرائع'); Let id2 = الرمز('معرف Tingting منخفض المفتاح وفاخر ودلالي')؛
تختلف أنواع Symbol
في أي وقت، حتى لو كانت تحتوي على نفس معلومات الوصف، فإن الوصف هو مجرد تسمية وليس له أي غرض آخر، على سبيل المثال:
Let id1 = الرمز('المعرف'); دع id2 = الرمز('id'); console.log(id1==id2);//
أعتقد شخصيًا أن معنى التسمية الخاطئة مرتبط بحقيقة أن Symbol
لا يمكنه رؤية القيمة الداخلية المحددة بشكل حدسي، فمن خلال إضافة معلومات وصفية، يمكننا الحصول على معلومات أكثر سهولة فهم استخدام المتغيرات.
يمكن تحويل معظم الأنواع في JavaScript
مباشرةً إلى نوع سلسلة للإخراج، لذلك لا يمكننا معرفة قيمته بشكل حدسي، على سبيل المثال، يمكننا استخدام alert(123)
مباشرةً لتحويل الرقم 123
تحويل إلى سلسلة منبثقة.
ومع ذلك، فإن نوع Symbol
خاص ولا يمكن تحويله مباشرة، على سبيل المثال:
Let id = الرمز(); تنبيه (معرف)؛ // تقرير خطأ، لا يمكن تحويل نوع الرمز
إلى سلسلة لا يمكن تحويل نوع Symbol
في JavaScript
إلى سلسلة بسبب آلية "حماية اللغة" المتأصلة لمنع ارتباك اللغة، لأن السلاسل Symbol
. مختلف جوهريا هناك فرق ولا ينبغي تحويل أحدهما إلى الآخر.
فقط تخيل أنه إذا كان من الممكن تحويل Symbol
إلى سلسلة، فإنه يصبح دالة تولد سلسلة فريدة، وليست هناك حاجة إلى نوع بيانات مستقل.
إذا أردنا حقًا معرفة قيمة متغير Symbol
، فيمكننا استخدام طريقة .toString()
كما يلي:
Let id = الرمز('هذا هو التعريف'); console.log(id.toString());//Symbol(هذا هو التعريف
أو استخدم سمة .description
للحصول على معلومات الوصف:
Let id = الرمز('هيا، أعطني Oli'); console.log(id.description);// هيا يا أولي”يشبه الرمز
كونه
وفقًا لمواصفات JavaScript
، يمكن استخدام نوعين فقط من القيم كمفاتيح لخصائص الكائن:
يتم استخدام أنواع أخرى، وسيتم تحويلها إلى نوع سلسلة ضمنيًا. تم تقديم مفتاح الكائن بالتفصيل في الفصل السابق ولن يتم تكراره هنا.
هناك Symbol
المثال 1:
Let id = الرمز('id'); دع المستخدم = {}؛ user[id] = 'id value';// أضف مفتاح الرمز console.log(user[id]);//قيمة المعرف
المثال 2:
Let id = الرمز('id'); السماح للمستخدم = { [id]:'id value',//لاحظ الأقواس المربعة هنا }; console.log(user[id]);
توضح الحالتان أعلاه استخدام إدراج نوع Symbol
كمفتاح في الكائن. تجدر الإشارة إلى أنه عند الوصول إلى السمة، تحتاج إلى استخدام obj[id]
بدلاً من obj.id
، لأن obj.id
يمثل obj['id']
.
ماذا سيحدث إذا استخدمنا Symbol
كمفتاح للكائن؟
Symbol
for...in هي أنه إذا كان الكائن يستخدم Symbol
كمفتاح، فلا يمكن الوصول إلى خصائص نوع Symbol
باستخدام عبارة for…in
.
على سبيل المثال:
Let id = الرمز('id'); السماح للمستخدم = { الاسم: "شياومينغ"، [فعلتُ'، }; لـ (السماح بإدخال المستخدم) console.log(user[key]);
نفذ الكود أعلاه واحصل على النتائج التالية:
>
يمكن لـ Xiaoming العثور على قيمة الكائن [id]
غير مطبوعة، مما يشير إلى ذلك في الكائن قائمة السمات، استخدم for … in
سوف يتجاهل تلقائيًا المفاتيح من النوع Symbol
.
وبالمثل، سوف يتجاهل Object.keys(user)
جميع المفاتيح من النوع Symbol
.
يمكن أن توفر هذه الميزة تأثيرات مفيدة جدًا، على سبيل المثال يمكننا إنشاء خصائص لا يمكن لأحد سوانا استخدامها.
على الرغم من أنه ليس لدينا طريقة للحصول على مفتاح Symbol
مباشرة، إلا أن طريقة Object.assign
يمكنها نسخ جميع الخصائص:
Let id = Simplicity(); دع الكائن = { [المعرف] : '123' } Let obj2 = Object.assis({},obj); console.log(obj2[id]);
لا يؤثر هذا على الخصائص المخفية Symbol
، لأن الكائن المنسوخ لا يزال غير قادر على الحصول على مفتاح Symbol
.
نظرًا لأنه لا يمكن تحويل Symbol
مباشرة إلى سلسلة، فليس لدينا طريقة للحصول على قيمته بشكل حدسي، ولا يمكننا الحصول على سمة Symbol
للكائن من خلال for … in
بمعنى آخر، بدون متغير Symbol
نفسه، ليس لدينا طريقة للحصول على الخصائص المقابلة داخل الكائن.
لذلك، من خلال القيمة الرئيسية لنوع Symbol
، يمكننا إخفاء الخصائص، ولا يمكن الوصول إلى هذه الخصائص إلا بواسطتنا، ولا يمكن لأي شخص آخر رؤية خصائصنا.
على سبيل المثال:
أثناء عملية التطوير، نحتاج إلى التعاون مع زميلنا "Zhang San"، وقد أنشأ Zhang San Tool
سهلة الاستخدام للغاية. Tool
هي نوع كائن نريد استخدام Tool
Zhang San مجانًا ، وقم بإضافة بعض العقارات الخاصة بك بناءً على ذلك.
يمكننا إضافة مفتاح نوع Symbol
:
Let tool = {// أداة كتبها Zhang San الاستخدام: "يمكن أن تفعل أي شيء"، } اسمحوا اسم = رمز("أداة بلدي obj"); الأداة [الاسم] = "هذه هي أداتي"; console.log(tool[name]);
يوضح المثال أعلاه كيفية إضافة خصائصك الخاصة إلى كائن كتبه الآخرون، فلماذا تستخدم نوع Symbol
بدلاً من سلسلة عادية؟
الأسباب هي كما يلي:
tool
الكائن عبارة عن تعليمات برمجية كتبها آخرون، من حيث المبدأ، لا ينبغي لنا تعديل التعليمات البرمجية الخاصة بأشخاص آخرين، لأن هذا سيؤدي إلى مخاطرSymbol
، لأن Symbol
مختلفة؛Symbol
، مما يعني أنها لن تتعارض معخطأ الأشخاص الآخرين:
إذا لم نستخدم نوع Symbol
، فمن المحتمل أن يحدث الموقف التالي:
Let tool = {// أداة كتبها Zhang San الاستخدام: "يمكن أن تفعل أي شيء"، } tool.usage = "بوم بوم"; console.log(tool.usage);
يعيد الكود أعلاه استخدام "الاستخدام" وبالتالي يعيد كتابة السمات الأصلية، مما يتسبب في جعل الوظيفة الأصلية للكائن غير طبيعية.
تختلف جميع متغيرات Symbol
، حتى لو كانت تحمل نفس التسمية (الوصف).
في بعض الأحيان، نريد الوصول إلى نفس كائن Symbol
من خلال اسم سلسلة (التسمية)، على سبيل المثال، يمكننا الوصول إلى نفس Symbol
في أماكن مختلفة في الكود.
تحتفظ JavaScript
بسجل Symbol
عالمي. يمكننا الوصول إلى الكائن عن طريق إدراج كائن Symbol
في السجل وإعطاء الكائن اسم سلسلة.
لإدراج كائن Symbol
أو قراءته في السجل، تحتاج إلى استخدام أسلوب Symbol.for(key)
. إذا كان هناك كائن يسمى key
في السجل، فسيتم إرجاع الكائن وإلا سيتم إدراج كائن جديد عاد.
على سبيل المثال:
Let id1 = الرمز.for('id');// لا يوجد رمز مسمى معرف في التسجيل، أنشئ وأرجع Let id2 = الرمز ('id');// يوجد بالفعل رمز مسمى id في السجل بالنسبة للرمز الذي يحتوي على id، قم بإرجاع console.log(id1===id2);//true
من خلال Symbol.for(key)
يمكننا استخدام كائن Symbol
كمتغير عام واستخدام سلسلة ضع علامة على اسم الكائن.
على العكس من ذلك، يمكننا أيضًا استخدام Symbol.keyFor(Symbol)
للحصول على الاسم من الكائن في الاتجاه المعاكس.
على سبيل المثال:
Let id = الرمز.for('id');// لا يوجد رمز مسمى معرف في التسجيل، أنشئ وأرجع Let name = الرمز.keyFor(id); console.log(name);//id
undefined
Symbol.keyFor()
يمكن استخدام الدالة فقط على كائنات Symbol
العامة (الكائنات المُدرجة باستخدام Symbol.for
).
على سبيل المثال:
Let id = الرمز('id');//الرمز المحلي اسمحوا الاسم = رمز.keyFor(id); console.log(name);//
تحتوي JavaScript
على العديد Symbol
النظام، مثل:
Symbol.hasInstance
Symbol.iterator
Symbol.toPrimitive
. سنقدم هذه المتغيرات الفريدة تدريجيًا لاحقًا.
Symbol
فريدة من نوعها؛Symbol
الكائن في السجل العام من خلال التسمية؛Symbol
كمفتاح للكائن for … in
؛Symbol
كائن Symbol
العام؛ومع ذلك، لا يتم إخفاء Symbol
بالكامل، يمكننا الحصول على جميع Symbol
الكائن من خلال Object.getOwnPropertySymbols(obj)
، أو الحصول على جميع مفاتيح الكائن من خلال Reflect.ownKeys(obj)
.