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

تعني الكتابة الديناميكية لجافا سكريبت أن شفرتك يمكن أن تكون أبسط قليلاً ، ولكن لا يزال من الممكن ارتكاب الأخطاء. لتجنبها ، من المفيد معرفة كيفية حل JavaScript للقيم بأنواع مختلفة ، لمقارنتها.

يعد فهم تحويل النوع والإكراه في JavaScript أمرًا بالغ الأهمية لكتابة برامج موثوقة وفعالة. كل مفهوم له حالات استخدام محددة وأفضل الممارسات التي يمكن أن تؤثر على سلوك التعليمات البرمجية الخاصة بك.

لماذا يحدث تحويل الكتابة والإكراه في JavaScript؟

لغة جافا سكريبت ديناميكيًا. هذا يعني أنه على عكس اللغات المكتوبة بشكل ثابت ، فإن JavaScript لا يتطلب منك تحديد نوع بيانات المتغير بشكل صريح قبل استخدامه. بدلاً من ذلك ، تحدد JavaScript النوع في وقت التشغيل اعتمادًا على قيمة المتغير.

نظرًا لأن أنواع البيانات لا يتم الإعلان عنها صراحة حتى وقت التشغيل ، عند إجراء عمليات تتطلب بيانات مختلفة الأنواع ، يتحقق JavaScript تلقائيًا من توافقها مع بعضها البعض للعملية التي تريد تنفيذها. إذا كانت متوافقة مع بعضها البعض ، تستمر العملية بشكل طبيعي.

instagram viewer

ومع ذلك ، افترض أنها غير متوافقة مع العملية - على سبيل المثال ، محاولة إضافة سلسلة ورقم. في مثل هذه الحالات ، يقوم JavaScript تلقائيًا "بإجبار" أحد الأنواع ليلائم الآخر لضمان نجاح العملية بدلاً من الخطأ. تُعرف هذه العملية باسم نوع الإكراه أو الإكراه الضمني.

اكتب الإكراه

نوع الإكراه هو التحويل التلقائي لقيمة من نوع بيانات إلى آخر ، يتم إجراؤه بواسطة JavaScript أثناء تشغيل برنامج لضمان تنفيذ العملية بنجاح.

ولكن لا يمكن إجبار جميع أنواع البيانات. السلسلة ، العدد ، والمنطقية هي الوحيدة أنواع بيانات JavaScript أن اللغة ستُجبر على نوع مختلف. عندما تحاول تنفيذ عملية غير متوافقة مع أنواع البيانات التي لا تستطيع JavaScript فرضها ، فسيؤدي ذلك إلى حدوث خطأ.

تقوم JavaScript بفرض الأنواع بناءً على نوع العملية والعامل الذي تستخدمه في العملية.

الإكراه مع عامل التشغيل "+"

في JavaScript ، فإن "+”المشغل له سلوكان مختلفان اعتمادًا على أنواع معاملاته. يمكن أن يؤدي كلا من الجمع الرقمي وسلسلة السلسلة. يمكن أن يؤدي هذا إلى نوع الإكراه عندما لا يكون أحد المعاملات من النوع المتوقع.

إذا كان كلا المعاملين أرقامًا ، فإن "+"يؤدي عامل التشغيل إضافة:

يترك عدد 1 = 42;
يترك عدد 2 = 10;
يترك المجموع = num1 + num2 ؛ // إضافة
وحدة التحكم.log (المجموع) ؛ // 52

إذا كان كلا المعاملين عبارة عن سلاسل ، فإن "+"يقوم عامل التشغيل" بتنفيذ تسلسل السلسلة:

يترك str1 = "مرحبًا";
يترك str2 = "عالم";
يترك النتيجة = str1 + " " + str2 ؛ // سلسلة السلسلة
وحدة التحكم.log (نتيجة) ؛ // "مرحبا بالعالم"

ومع ذلك ، إذا لم يكن أحد المعاملات سلسلة ، فستقوم JavaScript ضمنيًا بإدخالها في سلسلة قبل تنفيذ التسلسل:

// رقم وسلسلة
يترك عدد = 42;
يترك str = "مرحبًا";

// num يتم إجبارها على سلسلة ثم يتم ربطها
يترك result_1 = num + str ؛
وحدة التحكم.log (result_1) ، // "42 مرحبًا"

// سلسلة ومنطقية
يترك منطقي = حقيقي;

// يتم إجبار bool على سلسلة ثم يتم ربطها
يترك result_2 = منطقي + str ؛
وحدة التحكم.log (result_2) ، // "trueHello"

الإكراه مع المشغل "-"

في JavaScript ، فإن "-"عامل التشغيل" يستخدم بشكل أساسي لعمليات الطرح. عندما يكون أحد المعاملين أو كليهما في عملية تتضمن "-”ليس رقمًا ، سيحاول JavaScript إجباره في رقم.

عندما يكون كلا المعاملين أرقامًا ، فإن JavaScript ينفذ عملية الطرح. يتم أيضًا إجراء عملية الطرح عندما يكون أحد المعاملين أو كلاهما عبارة عن سلاسل تمثل رقمًا:

مقدار ثابت عدد 1 = 10;
مقدار ثابت عدد 2 = 20;
مقدار ثابت result_1 = num2 - num1 ؛ // الطرح
وحدة التحكم.log (result_1) ، // 10

مقدار ثابت strNum = "10";
مقدار ثابت strNum2 = "20";
مقدار ثابت النتيجة = strNum2 - strNum ؛ // اكتب الإكراه على الأرقام ، ثم الطرح
وحدة التحكم.log (result_1) ، // 10

عندما لا يكون أي من المعاملين رقمًا أو سلسلة تمثل رقمًا ، ستحاول JavaScript إجبار نوع البيانات على مكافئها العددي. إذا لم يكن لنوع البيانات مكافئ عددي ، فستعود العملية ن (ليس رقمًا):

// true يتم إجبارها على 1 ، ويتم إجبار false على 0
مقدار ثابت boolNum = حقيقي;
مقدار ثابت boolNum2 = خطأ شنيع;
مقدار ثابت result_1 = boolNum - boolNum2 ؛
وحدة التحكم.log (result_1) ، // 1

// المصفوفات الفارغة يتم إجبارها على 0
مقدار ثابت arrNum = [] ،
مقدار ثابت arrNum2 = [] ،
مقدار ثابت result_2 = arrNum - arrNum2 ؛
وحدة التحكم.log (result_2) ، // 0

// يتم إجبار الأشياء الفارغة على NaN
مقدار ثابت objNum = {} ،
مقدار ثابت result_3 = arrNum - objNum ؛
وحدة التحكم.log (result_3) ، // 0 - NaN = NaN

في هذا المثال ، تقوم JavaScript بإجبار القيم المنطقية حقيقي و خطأ شنيع لقيمها الرقمية المكافئة ، 1 و 0, على التوالى. يتم إجبار المصفوفات الفارغة على ذلك 0, والأشياء الفارغة يتم إجبارها على ذلك ن.

الإكراه بالمساواة (==) / () عوامل التشغيل

في JavaScript ، عوامل المساواة (== و ) مقارنة قيم المساواة. ومع ذلك ، فإنهم يتصرفون بشكل مختلف بسبب نوع الإكراه.

ال "=="(مساواة فضفاضة) يؤدي عامل التشغيل نوع الإكراه ، مما يعني أنه يحاول تحويل المعاملات إلى نفس النوع قبل المقارنة:

"10" == 10; // حقيقي

في هذا المثال ، تقوم JavaScript بإرغام السلسلة "10" على الرقم 10 ، لذلك يتم تقييم التعبير إلى حقيقي.

ومع ذلك ، فإن “"(المساواة التامة) المشغل لا ينفذ نوع الإكراه. يتطلب أن تكون القيمة والنوع متماثلين حتى يتم إرجاع المقارنة حقيقي:

"10"10; // خطأ شنيع

في هذا المثال ، ترجع المقارنة خطأ شنيع لأن المعاملات من أنواع مختلفة (سلسلة ورقم).

يجب عليك عمومًا استخدام ملف (مساواة صارمة) عامل في JavaScript لتجنب نوع السلوك الإجباري غير المتوقع.

يمكن أن يؤدي الإكراه على النوع أو التحويل الضمني إلى سلوك غير متوقع بسبب طبيعته التلقائية. في الحالات التي تحتاج فيها إلى تحويل الأنواع ، يُنصح بتحويل الأنواع صراحةً. تُعرف عملية التحويل الصريح للأنواع باسم تحويل النوع. يشار إليه أيضًا باسم صب النوع وتحويل النوع الصريح.

اكتب التحويل

تحويل النوع ، المعروف أيضًا باسم صب النوع ، هو العملية الصريحة لتحويل قيمة من نوع بيانات إلى آخر في JavaScript باستخدام وظائف مضمنة مثل رقم(), خيط(), منطقية (), parseInt ()، و parseFloat ().

يمكنك إجراء تحويل الكتابة عن طريق تمرير القيمة التي ترغب في تحويلها إلى وظائف التحويل المضمنة كوسيطة. ثم تقوم هذه الوظائف بتحويل القيمة الخاصة بك إلى النوع الذي تريده.

إليك مثال على استخدام رقم() وظيفة:

مقدار ثابت numStr = "123";
مقدار ثابت عدد = رقم(numStr) ؛ // يحول سلسلة إلى رقم
وحدة التحكم.log (الأسطوانات) ؛ // 123

تمرير سلسلة عبارة عن رقم صالح كوسيطة إلى رقم() ستعيد الوظيفة رقمًا. سيعود تمرير سلسلة عبارة عن رقم غير صالح ن.

إليك مثال على استخدام خيط() وظيفة:

مقدار ثابت منطقي = حقيقي;
مقدار ثابت str2 = خيط(منطقي) ؛ // يحول قيمة منطقية إلى سلسلة
وحدة التحكم.log (str2) ؛ // "حقيقي"

تمرير أي نوع بيانات إلى ما عدا رمز إلى ملف خيط() ستعمل الدالة على تحويل نوع البيانات إلى سلسلة.

إليك مثال على استخدام منطقية () وظيفة:

// تحويل سلسلة إلى قيمة منطقية (true: true ، falsy: false)
مقدار ثابت str = "مرحبًا";
مقدار ثابت منطقي = قيمة منطقية(شارع) ؛
وحدة التحكم.log (bool2) ؛ // حقيقي

تمرير القيم الصادقة إلى منطقية () تُرجع الدالة القيمة المنطقية "صواب" أثناء تمرير قيم زائفة لإرجاع القيمة المنطقية "خطأ".

إليك مثال على استخدام ParseInt () و ParseFloat () وظيفة:

// تحويل سلسلة إلى عدد صحيح
مقدار ثابت numStr = "123.00";
مقدار ثابت عدد 1 = التحليل اللغوي(numStr) ؛
وحدة التحكم.log (num1) ؛ // 123

// تحويل سلسلة إلى رقم فاصلة عائمة
مقدار ثابت floatStr = "3.14";
مقدار ثابت عدد 2 = تحليل عائم(floatStr) ؛
وحدة التحكم.log (num2) ؛ // 3.14

ال parseInt () تقوم الدالة بتوزيع وسيطة سلسلة وترجع عددًا صحيحًا. ال parseFloat () تقوم الدالة بتحويل سلسلة إلى رقم فاصلة عائمة.

الاستفادة من الإكراه النوعي والتحويل

من خلال فهم نوع الإكراه والتحويل ، يمكنك اتخاذ قرارات مستنيرة بشأن متى وكيف يمكنك الاستفادة منها بشكل فعال في التعليمات البرمجية الخاصة بك. من المهم تحقيق التوازن الصحيح ، باستخدام نوع الإكراه بحكمة للحصول على تعليمات برمجية موجزة ومريحة والاعتماد على تحويل النوع الصريح للتحويلات النوعية المتعمدة والمتوقعة.