كيف تبدأ بسرعة مع VUE3.0: تعرف على
الرمز (الرمز) هو نوع بيانات جديد في ES6. الرموز هي قيم أولية (نوع البيانات الأساسي)، ومثيلات الرمز فريدة وغير قابلة للتغيير. يتم إنشاؤه لأنه يتم استخدامه لوضع علامة فريدة ثم استخدامه كسمات كائن في نموذج غير سلسلة. وذلك للتأكد من أن سمات الكائن تستخدم معرفات فريدة ولا يوجد خطر من تعارض السمات.
يجب تهيئة رموز الاستخدام الأساسية باستخدام وظيفة الرمز (). نظرًا لأن الرموز نفسها هي أنواع بدائية، فإن عامل التشغيل typeof يُرجع رمزًا للرموز.
دع سيم = الرمز ()؛ console.log(typeofsym); //
يمكن أن تتلقى وظيفة الرمز () معلمة سلسلة لوصفها، ثم يمكنك استخدام هذه السلسلة لتصحيح التعليمات البرمجية. ولكن تجدر الإشارة إلى أنه حتى لو كانت وظائف الرمز () المتعددة تقبل نفس المعلمات، فإن قيمها ليست متساوية.
دع genericSymbol = الرمز(); دعotherGenericSymbol = الرمز ()؛ دع fooSymbol = الرمز("foo"); دعotherFooSymbol = رمز("foo"); console.log(genericSymbol ==otherGenericSymbol); console.log(fooSymbol ==otherFooSymbol); // false
إذا كنت بحاجة إلى استخدام نفس مثيل الرمز في أماكن متعددة في الكود، فيمكنك تمرير سلسلة ثم استخدام الرمز. ) لإنشاء رمز قابل لإعادة الاستخدام، مشابه للوضع المفرد عند استخدام الرمز.for() لأول مرة، فإنه سيبحث عالميًا عما إذا كان سيتم استخدام الرمز.for() لإنشائه بناءً على المعلمات التي تم تمريرها. تم تمرير المثال، إذا كان موجودًا، فأعد استخدامه، وإذا لم يكن موجودًا، فأنشئ
واحدًا جديدًا Let fooGlobalSymbol = Simplicity.for("foo"); / إعادة استخدامه موقع console.log(fooGlobalSymbol ===otherFooGlobalSymbol); // صحيح
الفرق بين المثيل الذي تم إنشاؤه بواسطة رمز () والمثيل الذي تم إنشاؤه بواسطة رمز (): المثيل الذي تم إنشاؤه بواسطة رمز () فريد دائمًا و لن تتغير لأن معلمات الإدخال هي نفسها ومتساوية مع المثيلات الأخرى، ولكن المثيلات التي تم إنشاؤها بواسطة رمز.for() ستكون متساوية إذا كانت المعلمات هي نفسها، لأنها ستشارك نفس مثيل الرمز
Let fooSymbol = الرمز("فو"); دعotherFooSymbol = رمز("foo"); console.log(fooSymbol ==otherFooSymbol); Let fooGlobalSymbol = Code.for("foo"); // إنشاء رمز جديد LetotherFooGlobalSymbol = الرمز.for("foo");
تكون السمات الموجودة في الكائنات عمومًا على شكل سلاسل، ولكن في الواقع يمكنك أيضًا استخدام مثيلات الرمز كسمات. وتتمثل ميزة ذلك في أن سماتك الجديدة لن تحل محل أي سمات سابقة
Let s1 = Code (. "فو")، s2 = الرمز("شريط")، s3 = الرمز("باز")، s4 = الرمز("qux"); دع س = { [s1]: "فو فال"، }; // يعمل هذا أيضًا: o[s1] = 'foo val'; console.log(o); // {الرمز (foo): foo val} Object.defineProperty(o, s2, { value: "bar val" }); console.log(o); // {الرمز (foo): foo val، الرمز (bar): bar val} Object.defineProperties(س، { [s3]: { القيمة: "باز فال" }، [s4]: { القيمة: "qux فال" }، }); console.log(o); // {الرمز (foo): foo val، الرمز (bar): شريط val، // الرمز (baz): baz val، الرمز (qux): qux val}
ملاحظة: عند إنشاء مثيل رمز كسمة كائن، إذا قمت بتغيير الرمز دون الإعلان عن متغير لاستلامه في البداية، فيجب عليك اجتيازه لاحقًا جميع رموز خاصية الكائن للعثور على مفتاح الخاصية المقابل:
Let o = {. [الرمز("foo")]: "foo val"، [الرمز("شريط")]: "شريط فال"، }; console.log(o); // {Symbol(foo): "foo val"، الرمز(bar): "bar val"} Let barSymbol = Object.getOwnPropertySymbols(o).find(symbol => الرمز.toString().match(/bar/)); console.log(barSymbol); // الرمز (الشريط)
يقدم ES6 أيضًا عددًا من الرموز المضمنة شائعة الاستخدام (الرموز المعروفة) لكشف السلوك الداخلي للغة، ويمكن للمطورين الوصول إليها مباشرة أو إعادة كتابتها أو محاكاتها السلوكيات. إذا تم تعديل هذه السمات الافتراضية، فيمكن تغيير نتائج التنفيذ النهائية لبعض العمليات. على سبيل المثال، ستستخدم حلقة for-of خاصية الرمز.iterator على الكائن ذي الصلة، بحيث يمكنك تغيير سلوك for-of عند تكرار الكائن عن طريق إعادة تعريف قيمة الرمز.iterator على الكائن المخصص.
هو في الواقع مولد يُرجع وعدًا، يُستخدم بشكل عام مع انتظار
وفقًا لمواصفات ECMAScript، يمثل هذا الرمز كسمة "طريقة تُرجع AsyncIterator الافتراضي للكائن. بواسطة for- انتظر -من البيان باستخدام ". بمعنى آخر، يمثل هذا الرمز وظيفة تقوم بتنفيذ واجهة برمجة تطبيقات التكرار غير المتزامن.
تم تعريف هذه الخاصية في النموذج الأولي للوظيفة. نعلم جميعًا أنه يمكن استخدام عامل التشغيل لتحديد ما إذا كان مثيل الكائن ينتمي إلى مُنشئ معين. المبدأ هو أن عامل التشغيل سيستخدم الدالة الرمز.hasInstance لتحديد وظيفة العلاقة
Foo() {} دع f = new Foo(); console.log(f exampleof Foo); شريط الفئة {} دع ب = شريط جديد ()؛ console.log(bمثيل Bar); // trueإذا
قمت بإعادة تعريف خاصية الرمز.hasInstance للدالة، فيمكنك جعل مثيل الأسلوب يعيد شيئًا غير متوقع
class Bar {} فئة باز تمتد بار { ثابت [Symbol.hasInstance]() { عودة كاذبة. } } Let b = new Baz(); console.log(Bar[Symbol.hasInstance](b)); console.log(bمثيل البار);//صحيح console.log(Baz[Symbol.hasInstance](b)); // false console.log(b exampleof Baz); // false
تم تعريف هذه الخاصية في النموذج الأولي لـ Array
وفقًا لمواصفات ECMAScript، يمثل هذا الرمز كخاصية "قيمة منطقية. إذا كان صحيحًا، فهذا يعني أن يجب أن يستخدم الكائن المصفوفة Prototype.concat() لتسوية عناصر المصفوفة الخاصة به". سيختار الأسلوب Array.prototype.concat() في ES6 كيفية لصق كائن يشبه المصفوفة (مصفوفة زائفة) في مثيل مصفوفة بناءً على نوع الكائن المستلم. لذا فإن تعديل قيمة الرمز.isConcatSpreadable يمكن أن يعدل هذا السلوك.
خطأ: أضف كائنًا كاملاً إلى المصفوفة صحيحًا: أضف زوجًا كاملاً إلى المصفوفة
Let الأولي = ["foo"]; دع المصفوفة = ["شريط"]؛ console.log(array[Symbol.isConcatSpreadable]); // غير محدد console.log(initial.concat(array)); // ['foo', 'bar'] array[Symbol.isConcatSpreadable] = false; console.log(initial.concat(array)); // ['foo', Array(1)] Let arrayLikeObject = { length: 1, 0: "baz" }; console.log(arrayLikeObject[Symbol.isConcatSpreadable]); // غير محدد console.log(initial.concat(arrayLikeObject)); // ['foo', {...}] arrayLikeObject[Symbol.isConcatSpreadable] = true; console.log(initial.concat(arrayLikeObject)); // ['foo', 'baz'] دع OtherObject = new Set().add("qux"); console.log(otherObject[Symbol.isConcatSpreadable]); // غير محدد console.log(initial.concat(otherObject)); // ['foo', Set(1)] OtherObject[Symbol.isConcatSpreadable] = true; console.log(initial.concat(otherObject)); // ['foo']
وفقًا لمواصفات ECMAScript، يمثل هذا الرمز كسمة "طريقة تُرجع المكرر الافتراضي للكائن. يُستخدم بواسطة for- تستخدم عبارة of "
ستعيد هذه السمة وظيفة Generator، وستستدعي for of الطريقة التالية () بدورها. ولهذا السبب يمكن استخدام for of على كائنات معينة.
باعث الطبقة { منشئ (كحد أقصى) { this.max = max; this.idx = 0; } *[Symbol.iterator]() { بينما (this.idx < this.max) { تسفر عن this.idx++; } } } عدد الوظائف () { دع باعث = باعث جديد (5)؛ لـ (const x للباعث) { console.log(x); } } عدد()؛ // 0 // 1 // 2 // 3 // 4
وفقًا لمواصفات ECMAScript، يمثل هذا الرمز كسمة "طريقة تعبير عادية تستخدم تعبيرًا عاديًا لمطابقة سلسلة. تستخدم بواسطة طريقة String.prototype.match()."
تقوم الطريقة String.prototype.match() بتقييم التعبير العادي باستخدام دالة مفتاحها الرمز.match. لذا فإن تغيير سمة الرمز.match للتعبير العادي يسمح لـ String.prototype.match() بالحصول على القيمة التي تريدها
console.log(RegExp.prototype[Symbol.match]); // ƒ [Symbol.match]() { [الرمز الأصلي] } console.log("foobar".match(/bar/)); // ["شريط"، الفهرس: 3، الإدخال: "foobar"، المجموعات: غير محدد] فئة فوماتشر { ثابت [Symbol.match] (الهدف) { العودة target.includes("foo"); } } console.log("foobar".match(FooMatcher)); // صحيح console.log("barbaz".match(FooMatcher)); // خطأ فئة StringMatcher { منشئ (شارع) { this.str = str; } [Symbol.match](الهدف) { العودة target.includes(this.str); } } console.log("foobar".match(new StringMatcher("foo"))); // صحيح console.log("barbaz".match(new StringMatcher("qux"))); // false
يمثل هذا الرمز كسمة "طريقة تعبير عادية تُرجع التعبير العادي المطابق في فهرس السلسلة الصيغة المستخدمة بواسطة طريقة String.prototype.search()"
يمثل هذا الرمز كسمة "قيمة دالة تعمل كمنشئ لإنشاء كائنات مشتقة."
يمثل هذا الرمز كسمة "أسلوب تعبير عادي يقوم بتقسيم سلسلة في موضع الفهرس الذي يطابق التعبير العادي. يُستخدم بواسطة أسلوب String.prototype.split()."
يمثل هذا الرمز كسمة "طريقة تحول كائنًا إلى القيمة الأولية المقابلة. تستخدم بواسطة عملية مجردة ToPrimitive"
يمثل هذا الرمز كسمة "سلسلة يتم استخدام السلسلة لها" إنشاء وصف السلسلة الافتراضية للكائن. يتم استخدامه بواسطة الطريقة المضمنة Object.prototype.toString()."
يمثل هذا الرمز كائنًا كخاصية، وسيتم اشتقاق جميع خصائص الكائن والموروثة من الكائنات المستبعدة المرتبطة بربط البيئة