تتيح لنا JavaScript العمل مع العناصر الأولية (السلاسل والأرقام وما إلى ذلك) كما لو كانت كائنات. كما أنها توفر طرقًا للاتصال على هذا النحو. سوف نقوم بدراسة تلك الأشياء قريبًا، ولكن أولًا سنرى كيف تعمل، لأن البدائيات بالطبع ليست كائنات (وهنا سنجعل الأمر أكثر وضوحًا).
دعونا نلقي نظرة على الفروق الرئيسية بين البدائيين والأشياء.
بدائية
هي قيمة من النوع البدائي.
هناك 7 أنواع بدائية: string
، number
، bigint
، boolean
، symbol
، null
undefined
.
كائن
قادر على تخزين قيم متعددة كخصائص.
يمكن إنشاؤه باستخدام {}
، على سبيل المثال: {name: "John", age: 30}
. هناك أنواع أخرى من الكائنات في JavaScript: الوظائف، على سبيل المثال، هي كائنات.
أحد أفضل الأشياء المتعلقة بالكائنات هو أنه يمكننا تخزين دالة كأحد خصائصها.
دع جون = { الاسم: "جون"، قل مرحبا: وظيفة () { تنبيه ("مرحبًا يا صديقي!")؛ } }; john.sayHi(); // مرحبا يا صديقي!
لقد قمنا هنا بإنشاء كائن john
باستخدام الطريقة sayHi
.
العديد من الكائنات المضمنة موجودة بالفعل، مثل تلك التي تعمل مع التواريخ والأخطاء وعناصر HTML وما إلى ذلك. ولها خصائص وأساليب مختلفة.
لكن هذه الميزات لها تكلفة!
الكائنات "أثقل" من البدائيين. أنها تتطلب موارد إضافية لدعم الآلية الداخلية.
إليكم المفارقة التي واجهها منشئ JavaScript:
هناك العديد من الأشياء التي قد يرغب المرء في القيام بها باستخدام عنصر بدائي، مثل سلسلة أو رقم. سيكون من الرائع الوصول إليهم باستخدام الطرق.
يجب أن تكون البدائيات سريعة وخفيفة الوزن قدر الإمكان.
يبدو الحل غريبًا بعض الشيء، ولكن هنا هو:
البدائيون ما زالوا بدائيين. قيمة واحدة، حسب الرغبة.
تسمح اللغة بالوصول إلى أساليب وخصائص السلاسل والأرقام والمنطقيات والرموز.
ولكي ينجح ذلك، يتم إنشاء "غلاف كائن" خاص يوفر الوظائف الإضافية، ثم يتم إتلافه.
تختلف "أغلفة الكائنات" من نوع إلى آخر وتسمى: String
و Number
و Boolean
و Symbol
و BigInt
. وبالتالي، فإنها توفر مجموعات مختلفة من الأساليب.
على سبيل المثال، يوجد أسلوب سلسلة str.toUpperCase() يُرجع str
.
وإليك كيف يعمل:
دع str = "مرحبا"; تنبيه (str.toUpperCase ())؛ // مرحبًا
بسيطة، أليس كذلك؟ إليك ما يحدث بالفعل في str.toUpperCase()
:
السلسلة str
بدائية. لذلك، في لحظة الوصول إلى خاصيتها، يتم إنشاء كائن خاص يعرف قيمة السلسلة، وله توابع مفيدة، مثل toUpperCase()
.
يتم تشغيل هذه الطريقة وإرجاع سلسلة جديدة (كما هو موضح بواسطة alert
).
يتم تدمير الكائن الخاص، وترك str
البدائية وحدها.
لذلك، يمكن أن توفر البدائيات طرقًا، لكنها تظل خفيفة الوزن.
يعمل محرك JavaScript على تحسين هذه العملية بشكل كبير. بل قد يتخطى إنشاء الكائن الإضافي على الإطلاق. ولكن لا يزال يتعين عليها الالتزام بالمواصفات والتصرف كما لو أنها تنشئ واحدة.
يحتوي الرقم على طرق خاصة به، على سبيل المثال، يقوم toFixed(n) بتقريب الرقم إلى الدقة المحددة:
دع ن = 1.23456؛ تنبيه(n.toFixed(2)); // 1.23
سنرى طرقًا أكثر تحديدًا في فصول الأرقام والسلاسل.
String/Number/Boolean
المُنشئين مخصصة للاستخدام الداخلي فقط
تسمح لنا بعض اللغات مثل Java بإنشاء "كائنات مجمعة" بشكل صريح للأوليات باستخدام بناء جملة مثل new Number(1)
أو new Boolean(false)
.
في جافا سكريبت، يكون هذا ممكنًا أيضًا لأسباب تاريخية، ولكن لا يوصى به على الإطلاق. سوف تصبح الأمور مجنونة في عدة أماكن.
على سبيل المثال:
تنبيه (نوع 0)؛ // "رقم" تنبيه (نوع الرقم الجديد (0))؛ // "هدف"!
الكائنات تكون دائمًا صادقة في if
، لذلك سيظهر التنبيه هنا:
دع الصفر = رقم جديد (0)؛ إذا (صفر) {// الصفر صحيح، لأنه كائن تنبيه("الصفر هو الصدق!؟!"); }
من ناحية أخرى، فإن استخدام نفس الوظائف String/Number/Boolean
بدون new
أمر جيد ومفيد تمامًا. يقومون بتحويل القيمة إلى النوع المقابل: إلى سلسلة أو رقم أو قيمة منطقية (بدائية).
على سبيل المثال، هذا صحيح تمامًا:
Let num = Number("123"); // تحويل سلسلة إلى رقم
لا يوجد أي طرق
الأوليات الخاصة null
undefined
هي استثناءات. ليس لديهم "كائنات مجمعة" مقابلة ولا يقدمون أي طرق. بمعنى ما، هم "الأكثر بدائية".
محاولة الوصول إلى خاصية بهذه القيمة ستعطي الخطأ:
تنبيه (null.test)؛ // خطأ
توفر البدائيات باستثناء null
undefined
العديد من الطرق المفيدة. وسوف ندرس تلك في الفصول القادمة.
رسميًا، تعمل هذه التوابع عبر كائنات مؤقتة، لكن محركات JavaScript مضبوطة جيدًا لتحسين ذلك داخليًا، لذا فإن استدعاءها ليس مكلفًا.
الأهمية: 5
خذ بعين الاعتبار الكود التالي:
دع str = "مرحبا"; اختبار str = 5؛ تنبيه (str.test)؛
ما رأيك، هل سينجح؟ ماذا سيتم عرضه؟
حاول تشغيله:
دع str = "مرحبا"; اختبار str = 5؛ // (*) تنبيه (str.test)؛
اعتمادًا على ما إذا كنت use strict
أم لا، قد تكون النتيجة:
undefined
(لا يوجد وضع صارم)
خطأ (الوضع الصارم).
لماذا؟ دعونا نعيد ما حدث في السطر (*)
:
عند الوصول إلى خاصية str
، يتم إنشاء "كائن مجمّع".
في الوضع الصارم، الكتابة فيه خطأ.
بخلاف ذلك، يتم تنفيذ العملية باستخدام الخاصية، ويحصل الكائن على خاصية test
، ولكن بعد ذلك يختفي "كائن الغلاف"، لذلك في str
الأخير لا يوجد أي أثر للخاصية.
يوضح هذا المثال بوضوح أن البدائيين ليسوا كائنات.
لا يمكنهم تخزين بيانات إضافية.