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

ملاحظة مهمة: هذه إضافة حديثة للغة، لذلك تحتاج بعض المتصفحات القديمة لترقيع هذا النقص لأن ما سنشرحه هو إضافة حديثة للغة.

يوفر عامل الاستبدال اللاغي ?? (Nullish coalescing operator) صيغة قصيرة لاختيار أول متغير معرّف (defined) من القائمة.

نتيجة a ?? b هو:

  • سيُعيد a إذا لم تكن فارغة null أو غير معرّفة undefined،
  • وإلا سيُعيد b.

إذًا x = a ?? b هي اختصار:

x = (a !== null && a !== undefined) ? a : b;

إليك مثال أطول لتوضيح الأمر.

تخيل أن لدينا مستخدم، وهناك متغيرات FirstName وlastName أو nickName لاسمهم الأول واسم العائلة أو اللقب. وويمكن أن تكون جميعها غير معرفة (undefined)، إذا قرر المستخدم عدم إدخال أي قيمة.

نرغب في عرض اسم المستخدم: في حال أدخل أحد هذه المتغيرات الثلاثة، أو إظهار الإسم "مجهول" إذا لم يعيّن أي شيئ.

دعنا نستخدم العامل ؟؟ لتحديد أول متغيّر معرّف:

let firstName = null;
let lastName = null;
let nickName = "Supercoder";

// سيعرض أول قيمة غير فارغة أو غير معرفة
alert(firstName ?? lastName ?? nickName ?? "Anonymous"); // Supercoder

استخدام العامل ||

يمكن استخدام العامل || بنفس طريقة استخدام ??. في الواقع، أي يمكننا استعمال || مكان ؟؟ في الشيفرة أعلاه والحصول على نفس النتيجة، كما شرحناها في مقال العاملات المنطقية في لغة جافاسكربت.

الفرق المهم هو:

  • إن || تُعيد القيمة الحقيقية الأولى.
  • بينما تُعيد ?? أول قيمة معرّفة.

هذا مهم جدًا عندما نرغب في التعامل مع القيم غير المعرفة أو الفارغة (null/undefined) بطريقة مختلفة عن القيمة 0.

فمثلًا، إليك هذا الحالة:

height = height ?? 100;

تعيّن هذه الشيفرة البرمجية المتغير height بالقيمة 100 في حال كان غير معرّف.

دعونا نوازنه بالعامل ||:

let height = 0;

alert(height || 100); // 100
alert(height ?? 100); // 0

هنا، height || 100 يعامل الارتفاع الصفري على أنه غير معرّف، تمامًا مثل القيمة الفارغة null أو غير المعرفة undefined أو أي قيمة خاطئة أخرى. إذًا ستكون النتيجة هي 100.

أما height ?? 100 يُعيد 100 فقط إذا كان المتغيّر height فارغًا null أو غير معرّف undefined. لذلك ستعرضُ الشيفرة السابقة قيمة الارتفاع 0 كما هي.

يعتمد السلوك الأفضل على حالة الاستخدام الّتي نواجهها. عندما يكون الارتفاع صفر تكون القيمة صالحة، فمن الأفضل أن يكون العامل ??.

أولوية العامل ??

إن أولوية العامل ?? منخفضة نوعًا ما: 5 في جدول MDN.

إذًا تقيّم ?? بعد معظم العمليات الأخرى، ولكن قبل = و ?.

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

let height = null;
let width = null;

// هام: استخدم الأقواس
let area = (height ?? 100) * (width ?? 50);

alert(area); // 5000

وإلا إذا حذفنا الأقواس، فإن عملية الضرب * لها أسبقية أعلى عامل ?? وستُنفذ قبلها.

سيكون ذلك مشابه لهذا المثال:

// يمكن أن تكون غير صحيحة
let area = height ?? (100 * width) ?? 50;

هناك أيضًا قيود متعلقة باللغة.

لأسباب تتعلق بالسلامة، يُحظر استخدام العامل ?? مع العاملات && و ||.

لاحظ الخطأ في الصياغة الموجود في الشيفرة أدناه:

let x = 1 && 2 ?? 3; // خطأ في الصياغة

بالتأكيد إن القيد قابل للنقاش، ولكنه أُضيف إلى المواصفات القياسية للغة بغرض تجنب الأخطاء البرمجية، إذ يبدأ الناس في التبديل من || إلى ??.

استخدم الأقواس الصريحة لتجنب الأمر، هكذا:

let x = (1 && 2) ?? 3; // تعمل دون أخطاء

alert(x); // 2

الخلاصة

  • يوفر عامل الاستبدال اللاغي ?? طريقة مختصرة لاختيار قيمة "معرّفة" من القائمة.

    يستخدم لتعيين القيم الافتراضية للمتغيرات:

    // أسند القيمة 100 إلى المتغير ‫height إذا كان هذا الأخير فارغًا أو غير معرًف
    height = height ?? 100;

     

  • عامل ?? له أولوية منخفضة جدًا، وأعلى قليلًا من العاملات ? و=.

  • يحظر استخدامه مع العاملات || أو && بدون أقواس صريحة.

ترجمة -وبتصرف- للفصل Nullish coalescing operator '??'‎ من كتاب The JavaScript language


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

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

لا توجد أية تعليقات بعد



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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.


×
×
  • أضف...