في JavaScript، قد تكون القيم من أنواع مختلفة. ويمكن تغيير نوع متغير عبر تحويل النوع الصريح. وإلى جانب ذلك، تُجري JavaScript أيضًا إكراهًا نوعيًا (تحويلًا ضمنيًا للنوع) عندما يتطلب السياق ذلك.
لا تملك JavaScript بنيةً لتحويل قيمة إلى نوع (مختلف) كما تفعل لغات كثيرة أخرى، لكن يمكن استخدام بعض الأدوات المساعدة المدمجة بدلًا من ذلك.
وأبرزها Boolean وNumber وString، إذ يمكن استخدامها كدوال لتحويل قيمة إلى النوع المقابل.
باستخدام Boolean(value) يمكنك تحويل أي قيمة إلى قيمة منطقية.
وهناك مجموعة ثابتة من القيم، تُسمى القيم الكاذبة، تتحوّل إلى false.
والأهم أن false و0 والسلسلة النصية الفارغة وnull وundefined وNaN كلها قيم كاذبة.
أما جميع القيم الأخرى فتُرجع Boolean لها true.
وتُسمى هذه القيم صادقة.
Boolean(-1);
// => true
Boolean(0);
// => false
Boolean(' ');
// => true
Boolean('');
// => false
لاحظ أنه بفضل القواعد الموصوفة، فإن '0' و'false' و[] و{} قيم صادقة في JavaScript.
يمكن استخدام Number(value) لتحويل قيمة إلى عدد.
تُتجاهل المسافات البيضاء في بداية السلسلة النصية ونهايتها، وتُحوَّل السلسلة النصية الفارغة إلى 0.
وإذا حاولت تحويل قيمة غير أولية أو سلسلة نصية لا تمثّل عددًا، فستكون النتيجة NaN (ليس عددًا).
Number(' -12.34 ');
// => -12.34
Number('1,2');
// => NaN
Number('');
// => 0
Number({ num: 123 });
// => NaN
باستخدام String(value) يمكنك تحويل قيمة إلى سلسلة نصية.
وتكون النتيجة كما تتوقع بالنسبة إلى القيم الأولية.
String(12.34);
// => '12.34'
String(false);
// => 'false'
String(null);
// => 'null'
String(undefined);
// => 'undefined'
أما المصفوفات، فتطبّق دالة String تحويل السلسلة النصية على كل عنصر وتدمج النتائج بفاصلة.
ويمكنك أيضًا تطبيق طريقة join بنفسك، مثلًا لتخصيص الفاصل.
لاحظ أنه في هذه الحالات ستُحوَّل null وundefined إلى سلسلة نصية فارغة.
String([42, null, true, 'abc']);
// => '42,,true,abc'
أما الكائنات، فتُرجع String افتراضيًا نصًا غير مفيد.
String({ key: 'value' });
// => '[object Object]'
في سياقات معينة، تحوّل JavaScript قيمةً تلقائيًا إلى نوع بيانات آخر قبل أن تُقيّم عبارة ما. ويُسمى هذا التحويل الضمني الإكراه النوعي.
عند استخدام قيمة غير منطقية في سياق منطقي، تُطبّق JavaScript القواعد نفسها التي تطبّقها دالة Boolean لتحويل القيمة ضمنيًا.
ويحدث الإكراه إلى قيمة منطقية عادةً في:
?
!
&& و OR المنطقي || (نتيجة التعبير هي أحد الطرفين، وليست بالضرورة قيمة منطقية)const num = 0;
if (num) {
// this block is NOT executed because 0 is falsy
}
إذا استُخدم عامل الجمع + مع قيم أولية وكان أحد الطرفين سلسلة نصية، فسيُحوَّل الطرف الآخر إلى سلسلة نصية أيضًا.
ومنطق التحويل هو نفسه المستخدم في دالة String.
بعد ذلك، تُدمج السلسلتان النصيتان.
let name;
'hello ' + name;
// => 'hello undefined'
تحوّل عوامل كثيرة أطرافها إلى أعداد (عند الحاجة) وفق منطق دالة Number الموضّح أعلاه.
+ (إذا لم تكن هناك سلسلة نصية)، -، *، /، %، **
+، -
>، >=، <، <=
|، &، ^، ~
راجع قائمة العوامل في MDN لمزيد من التفاصيل عن أي من هذه العوامل.
لتجنّب الأخطاء، من الممارسات الجيدة استدعاء Number صراحةً دائمًا قبل تطبيق هذه العوامل.
صديقك كوجو من كبار محبي الأرقام. لديه موقع صغير يُسمى 'fun-with-numbers'. كوجو ليس بارعًا في البرمجة، لذا طلب منك المساعدة.
ستبني دالتين مساعدتين لألعاب أرقام جديدة على موقع كوجو، ودالة ثالثة للتحقق من بعض المدخلات التي يمكن للمستخدم إدخالها.
إحدى الألعاب على موقع كوجو تشبه ماكينة حظ تعرض مجموعتين من العجلات تحمل كل منها أرقامًا. تمثل كل مجموعة أرقام عددًا. من أجل آليات اللعبة، يحتاج كوجو إلى معرفة مجموع هذين العددين.
اكتب دالة twoSum تقبل مصفوفتين كمعاملات.
تتكون كل مصفوفة من عدد أو أكثر من الأعداد بين 0 و9.
ينبغي أن تفسّر الدالة كل مصفوفة على أنها عدد وتُرجع مجموع هذين العددين.
twoSum([1, 2, 3], [0, 7]);
//=> 130
// [1, 2, 3] represents 123 and [0, 7] represents 7.
// 123 + 7 = 130
لعبة أخرى على الموقع هي اختبار صغير يُسمى "Lucky Numbers". يمكن للمستخدم إدخال عدد ثم يرى ما إذا كان العدد ينتمي إلى متتالية أو نمط سري. تتغير متتالية أو نمط "الأرقام المحظوظة" كل شهر، ولدى كل مستخدم عدد محدود فقط من المحاولات لتخمينها.
من المفترض أن تكون أرقام الحظ لهذا الشهر أعدادًا متناظرة. الأعداد المتناظرة تبقى كما هي عند عكس أرقامها.
نفّذ الدالة الجديدة luckyNumber التي تقبل عددًا كمعامل.
ينبغي أن تُرجع الدالة true إذا كان العدد متناظرًا وfalse خلاف ذلك.
سيكون العدد المُدخل دائمًا عددًا صحيحًا موجبًا.
luckyNumber(1441);
//=> true
luckyNumber(123);
//=> false
في مواضع مختلفة على الموقع، توجد حقول إدخال يمكن للمستخدمين إدخال أرقام فيها والنقر على زر لتنفيذ إجراء ما. يريد كوجو تحسين تجربة المستخدم على موقعه. يريد إظهار رسالة خطأ إذا نقر المستخدم على الزر لكن الحقل يحتوي على قيمة إدخال غير صالحة.
إليك مزيدًا من المعلومات حول كيفية توفير قيمة حقل الإدخال.
undefined أو null.اكتب دالة errorMessage تقبل مدخلات المستخدم كمعامل.
إذا لم يقدم المستخدم أي إدخال، فينبغي أن تُرجع errorMessage القيمة 'Required field'.
وإذا لم يمثل الإدخال عددًا غير صفري (وفقًا لقواعد التحويل في JavaScript)، فينبغي إرجاع 'Must be a number besides 0'.
وفي جميع الحالات الأخرى، يمكنك افتراض أن الإدخال صالح، وينبغي أن تكون القيمة المُرجَعة سلسلة نصية فارغة.
errorMessage('123');
// => ''
errorMessage('');
// => 'Required field'
errorMessage('abc');
// => 'Must be a number besides 0'
سجّل في Exercism لتتعلّم وتتقن JavaScript عبر 37 مفهومًا159 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.