المسارات
/
JavaScript
JavaScript
/
التمارين
/
الأعداد المحظوظة
الأعداد المحظوظة

الأعداد المحظوظة

تمرين تعلّمي

مقدمة

في 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 لتحويل القيمة ضمنيًا.

ويحدث الإكراه إلى قيمة منطقية عادةً في:

  • شرط الجملة الشرطية
  • الطرف الأول لعامل الشرط الثلاثي ?
  • طرف عامل النفي المنطقي !
  • طرفَي عاملي AND المنطقي && و 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'. كوجو ليس بارعًا في البرمجة، لذا طلب منك المساعدة.

ستبني دالتين مساعدتين لألعاب أرقام جديدة على موقع كوجو، ودالة ثالثة للتحقق من بعض المدخلات التي يمكن للمستخدم إدخالها.

1. احسب مجموع الأرقام على ماكينة الحظ

إحدى الألعاب على موقع كوجو تشبه ماكينة حظ تعرض مجموعتين من العجلات تحمل كل منها أرقامًا. تمثل كل مجموعة أرقام عددًا. من أجل آليات اللعبة، يحتاج كوجو إلى معرفة مجموع هذين العددين.

اكتب دالة twoSum تقبل مصفوفتين كمعاملات. تتكون كل مصفوفة من عدد أو أكثر من الأعداد بين 0 و9. ينبغي أن تفسّر الدالة كل مصفوفة على أنها عدد وتُرجع مجموع هذين العددين.

twoSum([1, 2, 3], [0, 7]);
//=> 130

// [1, 2, 3] represents 123 and [0, 7] represents 7.
// 123 + 7 = 130

2. تحديد ما إذا كان العدد متناظرًا

لعبة أخرى على الموقع هي اختبار صغير يُسمى "Lucky Numbers". يمكن للمستخدم إدخال عدد ثم يرى ما إذا كان العدد ينتمي إلى متتالية أو نمط سري. تتغير متتالية أو نمط "الأرقام المحظوظة" كل شهر، ولدى كل مستخدم عدد محدود فقط من المحاولات لتخمينها.

من المفترض أن تكون أرقام الحظ لهذا الشهر أعدادًا متناظرة. الأعداد المتناظرة تبقى كما هي عند عكس أرقامها.

نفّذ الدالة الجديدة luckyNumber التي تقبل عددًا كمعامل. ينبغي أن تُرجع الدالة true إذا كان العدد متناظرًا وfalse خلاف ذلك. سيكون العدد المُدخل دائمًا عددًا صحيحًا موجبًا.

luckyNumber(1441);
//=>  true

luckyNumber(123);
//=> false

3. توليد رسالة خطأ لمدخلات المستخدم غير الصالحة

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

إليك مزيدًا من المعلومات حول كيفية توفير قيمة حقل الإدخال.

  • إذا كتب المستخدم شيئًا في حقل، فستكون القيمة المرتبطة سلسلة نصية دائمًا حتى لو كتب أرقامًا فقط.
  • إذا كتب المستخدم شيئًا ثم حذفه، فسيكون المتغير سلسلة نصية فارغة.
  • قبل أن يبدأ المستخدم بالكتابة أصلًا، يمكن أن يكون المتغير 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'
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
JavaScript Exercism

مستعد لبدء الأعداد المحظوظة؟

سجّل في Exercism لتتعلّم وتتقن JavaScript عبر 37 مفهومًا159 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.