اذهب إلى المحتوى

التحويل بين الأنواع


نور آغا

تُحوِّل الدوال والمعاملات، في أغلب الأحيان، القيم التي تصلها إلى النوع الذي يناسبها وهذا ما يسمى «تحويل النوع». تُحوِّل الدالة alert مثلًا أي قيمة إلى سلسلة نصية تلقائيًا لإظهارها، وتُحوِّل والعمليات الرياضية القيم التي تستعملها إلى أعداد. كما توجد العديد من الحالات التي نكون فيها بحاجة لتحويل قيمة بصريح العبارة إلى النوع المطلوب.

لاحظ أنَّ هذا الفصل لا يتحدث عن الكائنات. سندرس الأنواع الأساسية أولًا، وبعدها ننتقل إلى الكائنات، ثم سنتعلم طريقة تحويل الكائن في فصل التحويل من كائن إلى أساسي.

 

التحويل إلى سلسلة نصية

يحدث التحويل إلى سلسلة نصية عندما نحتاج إلى الشكل النصي لقيمة ما. مثلًا، تُحوِّل الدالة alert(value)‎ القيمة value المُمرَّرة إليها إلى سلسلة نصية لإظهارها. ويمكن أيضًا استدعاء الدالة String(value)‎ لتحويل أي قيمة value إلى سلسلة نصية:

let value=true;
alert(typeof value); // Boolean

value = String(value); // "true" أصبحت الآن سلسلة نصية قيمتها
alert(tyoeof value); // string

يكون ناتج التحويل إلى سلسلة نصية عادةً واضحًا، فالقيمة المنطقية false تصبح "false"، والقيمة الخالية null تصبح "null" وهكذا.

التحويل إلى عدد

يحدث التحويل العددي في الدوال والتعابير الرياضية تلقائيًا. كما في حالة تطبيق عملية القسمة / على قيمتين غير عدديتين:

alert("6"/"2"); // الناتج: 3، إذ تحول السلاسل النصية إلى أعداد

بإمكاننا استخدام الدالة ‎Number(value) لتحويل القيمة value المُمرَّرة إليها بشكل صريح إلى عدد:

let str = "123";
alert(typeof str); // string

let num =  Number(str); // 123 يتحول إلى العدد

alert(typeof num); // number

يكون التحويل الصريح ضروريًّا عندما نقرأ القيمة من مصدر نصي مثل العنصر text في النموذج <form> ويكون المطلوب إدخال عدد.

ويكون ناتج التحويل NaN (اختصارًا للعبارة Not a Number)، إذا كان من غير الممكن تشكيل عدد من السلسلة النصية. إليك مثلًا:

let age = Number("an arbitrary string instead of a number");

alert(age); // NaN, فشلت عملية التحويل

قواعد التحويل العددي:

القيمة ناتج التحويل
Undefined NaN
null 0
false و true 0 و 1
string (سلسلة نصية) يتم إزالة المسافات الفارغة من البداية والنهاية. إذا كانت السلسلة النصية المتبقية فارغة، تكون النتيجة 0، أو تتم قراءة العدد من السلسلة النصية. والخطأ يعطي النتيجة NaN.

أمثلة:

alert (Number("    123    ")); // 123
alert(Number("123z")); // NaN (error reading a number at "z")
alert(Number(true)); // 1
alert(Number(false)); //0

لاحظ أنَّ القيمتين null و undefined لهما خرج مختلف هنا: قيمة null تصبح 0، بينما undefined تصبح NaN.

جمع السلاسل النصية عبر المعامل +

تُحوَّل أغلب العمليات الرياضية القيم إلى أعداد. ولكن هناك استثناء وحيد يحدث عن الجمع عبر المعامل "+" وكون إحدى القيم المطلوب جمعها سلسلة نصية. يجري آنذاك تحويل القيمة الأخرى إلى سلسلة نصية أيضًا ثمَّ تُضاف إلى القيمة الآخرى وتُجمعان معًا في سلسلة نصية واحدة. إليك المثال التالي الذي يوضح ما سبق:

alert(1+'2'); // '12' (سلسلة نصية على اليمين)
alert('1'+2); // '12' (سلسلة نصية على اليسار)

يحدث هذا فقط عندما يكون أحد المعاملات على الأقل سلسلة نصية. أمَّا في الحالات الأخرى، تُحوَّل القيم إلى أعداد.

التحويل إلى قيمة منطقية

التحويل المنطقي وهو الأسهل من بين جميع عمليات التحويل. يحدث في العمليات المنطقية (لاحقًا سنتعرف على التحقق من الشروط وغيرها من العمليات المماثلة)، ولكن من الممكن تطبيقه أيضًا بشكل صريح عن طريق استدعاء Boolean(value)‎.

قاعدة التحويل:

  • القيم التي تكون فارغة، مثل 0، والسلسلة النصية الفارغة، والقيمة undefined، والقيمة NaN تُحوَّل جميعها إلى false.
  • أما ما تبقى، فيُحوَّل إلى القيمة true.

مثلًا:

alert(Boolean(1)); // true
alert(Boolean(0)); // false

alert(Boolean("hello")); // true
alert(Boolean ("")); // false

لاحظ أنَّ السلسلة العددية التي تحتوي على 0 تصبح true. ولكن هناك بعض اللغات البرمجية (مثل PHP) تحول "0" إلى القيمة false. ولكن في لغة JavaScript، تُحوَّل السلسلة النصية الغير فارغة دائمًا إلى القيمة true:

alert(Boolean("0"); // true
alert(Boolean(" "); // true تحول المسافات (وأي سلسلة نصية غير فارغة) إلى

الخلاصة

التحويلات الثلاث الأكثر انتشارًا للأنواع هي التحويل إلى سلسلة نصية، أو عدد، أو قيمة منطقية.

  • التحويل إلى سلسلة نصية: يحدث عندما نريد إظهار خرج معين ويمكن تنفيذه عن طريق String(value). ويكون خرج التحويل إلى سلسلة نصية واضحًا بالنسبة للأنواع الأساسية.
  • التحويل إلى عدد: يحدث في العمليات الرياضية ومن الممكن تنفيذه باستخدام Number(value)‎. ويتبع هذا التحويل القواعد التالية:
    القيمة ناتج التحويل
    Undefined NaN
    null 0
    false و true 0 و 1
    string يتم قراءة السلسلة النصية كما هي، وتجاهل الفراغات من البداية والنهاية. السلسلة النصية الفارغة تصبح 0. وعند وجود خطأ في نتيجة التحويل تكون النتيجة NaN.
  • التحويل إلى قيم منطقية: يحدث في العمليات المنطقية ويمكن تنفيذه باستخدام Boolean(value). ويتبع هذا التحويل القواعد التالية:
    القيمة ناتج التحويل
    0, null, undefined, NaN, "" false
    القيم الأخرى true

معظم هذه القواعد سهلة الفهم والحفظ. ولكن هناك بعض الاستثناءات أو الأخطاء الشائعة مثل:

  • القيمة undefined كعدد هي NaN وليست 0.
  • "0" والسلاسل النصية المحتوي على فراغات فقط مثل " " تُحوَّل إلى القيمة المنطقية true.

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

تمارين

1. تحويلات الأنواع

الأهمية: 5

ما هي نتيجة التعابير التالية؟

""+1+0
""-1+0
true+false
6/"3"
"2"*"3"
4+5+"px"
"$"+4+5
"4"-2
"4px"-2
7/0
"   -9   "+5
"   -9   "-5
null+1
undefined+1

فكر جيدًا، ثم اكتب حلك وقارنه مع الإجابة.

الحل:

  1. الجمع مع سلسلة نصية مثل ‎""+ 1 يحول العدد 1 إلى سلسلة نصية: ‎""+1="1"‎، ثم لدينا "1"+0 التي تنطبق عليها القاعدة نفسها.
  2. الطرح - (مثل معظم العمليات الرياضية) يعمل فقط مع القيم العددية، وبالتالي يحول السلسلة النصية الفارغة "" إلى 0.
  3. الجمع مع سلسلة نصية يضم العدد 5 إلى السلسلة النصية.
  4. تحول عملية الطرح دائمًا القيم إلى أعداد. لذلك يحول القيمة " ‎-9 " إلى ‎-9 ( ويتجاهل الفراغات حولها).
  5. تصبح قيمة null هي 0 بعد تحويلها إلى عدد.
  6. القيمة الغير معرفة undefined تصبح NaN بعد تحويلها إلى عدد.
""+1+0  ="10" // (1)
""-1+0 = -1 //(2)
true+false
6/"3" =2
"2"*"3" = 6
4+5+"px" = "9px"
"$"+4+5 = "$45"
"4"-2 = 2
"4px"-2 = NaN
7/0 = Infinity
"   -9   "+5 = "   -9   5" //(3)
"   -9   "-5 = -14 //(4)
null+1 = 1 //(5)
undefined+1 = NaN //(6)

ترجمة -وبتصرف- للفصل Type conversions من كتاب The JavaScript Language

انظر أيضًا


تفاعل الأعضاء

أفضل التعليقات

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

وشكرا جزيلا على هذا المجهود الجبار.

T

رابط هذا التعليق
شارك على الشبكات الإجتماعية



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...