
نوع 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.hasInstanceSymbol.iteratorSymbol.toPrimitive. سنقدم هذه المتغيرات الفريدة تدريجيًا لاحقًا.
Symbol فريدة من نوعها؛Symbol الكائن في السجل العام من خلال التسمية؛Symbol كمفتاح للكائن for … in ؛Symbol كائن Symbol العام؛ومع ذلك، لا يتم إخفاء Symbol بالكامل، يمكننا الحصول على جميع Symbol الكائن من خلال Object.getOwnPropertySymbols(obj) ، أو الحصول على جميع مفاتيح الكائن من خلال Reflect.ownKeys(obj) .