المعلمات الافتراضية للدوال في JavaScript: من الفوضى إلى الأناقة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

معامل بدون هدية؟ نفهم المعاملات الافتراضية في JavaScript

\n\n

تخيل أنك طلبت بيتزا. تتصل بخدمة التوصيل وتقول: «من فضلك، بيتزا». يسأل الموظف: «أي نوع؟» — «المعتادة، بالجبن والنقانق». أنت لا تفكر حتى في أن البيتزا لها معاملات افتراضية.

\n\n

نفس الشيء في JavaScript: غالبًا ما تُستدعى الدوال بدون جميع الوسائط. وإذا لم يقم المبرمج بتوفير set a default parameter value for a JavaScript function، فقد يتعطل الكود أو يتصرف بشكل غير متوقع. في هذه المقالة، سنشرح جميع الطرق لتعيين قيمة افتراضية لمعامل دالة في JS — من الحلول القديمة الجيدة إلى الصياغة الحديثة في ES6. هيا بنا!

\n\n

لماذا هذا مهم أصلاً؟

\n\n

لنفترض أن لدينا دالة ترحب بالمستخدم:

\n\n
function greet(name) {\n    console.log('مرحبًا، ' + name + '!');\n}\n\ngreet(); // ستطبع: "مرحبًا، undefined!" — محرج، أليس كذلك؟
\n\n

بدون default parameters javascript، تصبح الوسيطة غير المُرسلة undefined. وإذا حاولنا استدعاء دالة على undefined — سنحصل على خطأ. لذلك، المعاملات الافتراضية js ليست مجرد راحة، بل حماية من الأخطاء.

\n\n

الطريقة 1: الكلاسيكية — العامل الثلاثي (أو if)

\n\n

قبل ظهور ES6، كان المطورون يستخدمون العامل الثلاثي في javascript أو فحصًا بسيطًا. هذا يعمل، لكنه يبدو ضخمًا:

\n\n
function multiply(a, b) {\n    a = a !== undefined ? a : 1;\n    b = b !== undefined ? b : 2;\n    return a * b;\n}\n\nconsole.log(multiply(5)); // 10 (5 * 2)\nconsole.log(multiply());  // 2 (1 * 2)
\n\n

الإيجابيات: واضح حتى للمبتدئين، متوافق مع المتصفحات القديمة.
\nالسلبيات: الكود يصبح متضخمًا. إذا كان هناك 5-6 معاملات، تقل قابلية القراءة بشكل كبير.

\n\n

حجر العثرة: الفحص على undefined مقابل truthy

\n\n

يكتب العديد من المبتدئين هكذا:

\n\n
function greet(name) {\n    name = name || 'ضيف';\n    console.log('مرحبًا، ' + name);\n}
\n\n

هذا يعمل طالما لم ترسل 0، أو سلسلة فارغة ''، أو false. كل هذه القيم هي falsy، وستستبدلها الدالة بـ 'ضيف'. إذا كنت بحاجة لإرسال 0 كقيمة صالحة — فهذه الطريقة ستفشل. استخدم الفحص الصارم على undefined.

\n\n

الطريقة 2: الكائن السحري arguments

\n\n

داخل كل دالة (باستثناء الدوال السهمية) يوجد كائن ضمني يشبه المصفوفة يسمى arguments javascript. يمكن استخدامه للتحقق من الوسائط المُرسلة:

\n\n
function showInfo(name, age) {\n    name = arguments.length > 0 ? name : 'مجهول';\n    age = arguments.length > 1 ? age : 'غير محدد';\n    return `${name}, العمر: ${age}`;\n}\n\nconsole.log(showInfo()); // مجهول, العمر: غير محدد
\n\n

الإيجابيات: يعطي تحكمًا كاملاً في الوسائط المُرسلة.
\nالسلبيات: الصياغة قديمة، لا تعمل في الدوال السهمية. تُستخدم عادةً فقط لمهام محددة جدًا (مثل عندما يكون عدد المعاملات غير معروف مسبقًا).

\n\n

الطريقة 3: المعيار الحديث — المعاملات الافتراضية في ES6

\n\n

بدءًا من ECMAScript 2015، يمكن تعيين المعاملات الافتراضية js مباشرة في تعريف الدالة. هذه هي أنظف وأفضل طريقة موصى بها:

\n\n
function multiply(a = 1, b = 2) {\n    return a * b;\n}\n\nconsole.log(multiply(5)); // 10\nconsole.log(multiply());  // 2
\n\n

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

\n\n

التفصيل 1: القيم الافتراضية تُحسب عند الاستدعاء

\n\n

هذا يعني أنه إذا أرسلت undefined — فسيتم تفعيل القيمة الافتراضية. إذا أرسلت null — لا:

\n\n
function test(x = 10) {

المدونات

توصيات الكتب