العربية

أتقن معامل السلسلة الاختيارية (?.) في جافاسكريبت لكتابة كود أنظف وأكثر أمانًا وقوة. تعلم كيفية منع الأخطاء والتعامل مع خصائص الكائنات المتداخلة بعمق بكل سهولة.

السلسلة الاختيارية في جافاسكريبت: وصول آمن وأنيق للخصائص

قد يبدو التنقل في الشبكة المعقدة لخصائص الكائنات المتداخلة بعمق في جافاسكريبت في كثير من الأحيان وكأنه اجتياز حقل ألغام. يمكن أن تؤدي خاصية واحدة مفقودة إلى إطلاق الخطأ المروع "Cannot read property 'x' of undefined"، مما يؤدي إلى توقف تطبيقك تمامًا. يمكن أن تؤدي الطرق التقليدية للفحص الدفاعي للقيم الفارغة (null) أو غير المعرفة (undefined) قبل الوصول إلى كل خاصية إلى كود مطول ومرهق. لحسن الحظ، تقدم جافاسكريبت حلاً أكثر أناقة وإيجازًا: السلسلة الاختيارية.

ما هي السلسلة الاختيارية؟

السلسلة الاختيارية، التي يُشار إليها بالمعامل ?.، توفر طريقة للوصول إلى خصائص الكائن التي قد تكون فارغة (null) أو غير معرفة (undefined) دون التسبب في خطأ. بدلاً من إلقاء خطأ عند مواجهة قيمة فارغة (nullish) (null أو undefined) في السلسلة، فإنها ببساطة تُرجع undefined. يتيح لك هذا الوصول الآمن إلى الخصائص المتداخلة بعمق والتعامل مع القيم المفقودة المحتملة برشاقة.

فكر فيها كملاح آمن لهياكل كائناتك. تسمح لك "بالتسلسل" عبر الخصائص، وإذا كانت خاصية ما مفقودة في أي وقت (null أو undefined)، فإن السلسلة تقطع مسارها وتُرجع undefined دون التسبب في خطأ.

كيف تعمل؟

يتم وضع المعامل ?. بعد اسم الخاصية. إذا كانت قيمة الخاصية الموجودة على يسار المعامل هي null أو undefined، يتم تقييم التعبير فورًا إلى undefined. وإلا، يستمر الوصول إلى الخاصية كالمعتاد.

لننظر في هذا المثال:

const user = {
  profile: {
    address: {
      city: "London"
    }
  }
};

// بدون السلسلة الاختيارية، قد يلقي هذا خطأ إذا كان user.profile أو user.profile.address غير معرف
const city = user.profile.address.city; // London

// مع السلسلة الاختيارية، يمكننا الوصول بأمان إلى المدينة حتى لو كان profile أو address مفقودًا
const citySafe = user?.profile?.address?.city; // London

const userWithoutAddress = {
  profile: {},
};

const citySafeUndefined = userWithoutAddress?.profile?.address?.city; // undefined (لا يوجد خطأ)

في المثال الأول، مع وبدون السلسلة الاختيارية، نحصل على "London" لأن جميع الخصائص موجودة.

في المثال الثاني، userWithoutAddress.profile موجود ولكن userWithoutAddress.profile.address غير موجود. بدون السلسلة الاختيارية، سيؤدي الوصول إلى userWithoutAddress.profile.address.city إلى حدوث خطأ. مع السلسلة الاختيارية، نحصل على undefined بدون خطأ.

فوائد استخدام السلسلة الاختيارية

أمثلة عملية وحالات استخدام

1. الوصول إلى بيانات API

عند جلب البيانات من واجهة برمجة التطبيقات (API)، غالبًا لا يكون لديك سيطرة كاملة على بنية البيانات. قد تكون بعض الحقول مفقودة أو لها قيم فارغة. السلسلة الاختيارية لا تقدر بثمن في التعامل مع هذه السيناريوهات برشاقة.

async function fetchData(userId) {
  const response = await fetch(`https://api.example.com/users/${userId}`);
  const data = await response.json();

  // الوصول الآمن إلى بريد المستخدم الإلكتروني، حتى لو كانت خاصية 'email' مفقودة
  const email = data?.profile?.email;
  console.log("Email:", email || "Email not available"); // استخدم الدمج الصفري لتوفير قيمة افتراضية

  // الوصول الآمن إلى مدينة عنوان المستخدم
  const city = data?.address?.city;
  console.log("City: ", city || "City not available");


}

fetchData(123); // مثال للاستخدام

2. العمل مع تفضيلات المستخدم

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

const userPreferences = {
  theme: {
    color: "dark",
  },
};

// الوصول الآمن إلى حجم خط المستخدم، مع توفير قيمة افتراضية إذا لم يتم تعيينه
const fontSize = userPreferences?.font?.size || 16;
console.log("Font Size:", fontSize); // المخرج: 16 (قيمة افتراضية)

const color = userPreferences?.theme?.color || "light";
console.log("Color Theme:", color); // المخرج: dark

3. التعامل مع مستمعي الأحداث

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

document.getElementById('myButton').addEventListener('click', function(event) {
  // الوصول الآمن إلى معرف العنصر المستهدف
  const targetId = event?.target?.id;
  console.log("Target ID:", targetId);
});

4. التدويل (i18n)

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

const translations = {
  en: {
    greeting: "Hello",
    farewell: "Goodbye"
  },
  fr: {
    greeting: "Bonjour",
    //farewell: "Au Revoir" - تمت إزالته للتوضيح
  }
};

const locale = "fr";

// الوصول الآمن إلى التحية المترجمة
const greeting = translations?.[locale]?.greeting || "Hello";
console.log("Greeting:", greeting); // المخرج: Bonjour

// الوصول الآمن إلى الوداع المترجم
const farewell = translations?.[locale]?.farewell || "Goodbye";
console.log("Farewell:", farewell); // المخرج: Goodbye (يعود إلى القيمة الافتراضية بالإنجليزية)

السلسلة الاختيارية مع استدعاءات الدوال

يمكن أيضًا استخدام السلسلة الاختيارية لاستدعاء الدوال التي قد لا تكون موجودة بأمان. استخدم الصيغة ?.() لهذا الغرض.

const myObject = {
  myMethod: function() {
    console.log("Method called!");
  }
};

// استدعاء الدالة بأمان إذا كانت موجودة
myObject?.myMethod?.(); // المخرج: Method called!

const myObject2 = {};

// استدعاء الدالة بأمان، لكنها غير موجودة
myObject2?.myMethod?.(); // لا يوجد خطأ، لا يحدث شيء

السلسلة الاختيارية مع الوصول للمصفوفات

يمكن استخدام السلسلة الاختيارية مع الوصول للمصفوفات أيضًا، باستخدام الصيغة ?.[index]. هذا مفيد عند العمل مع مصفوفات قد تكون فارغة أو غير ممتلئة بالكامل.

const myArray = ["apple", "banana", "cherry"];

// الوصول الآمن لعنصر في المصفوفة
const firstElement = myArray?.[0]; // "apple"

const myArray2 = [];

// الوصول الآمن لعنصر في المصفوفة، سيكون غير معرف.
const firstElement2 = myArray2?.[0]; // undefined

const secondElement = myArray?.[10]; // undefined (لا يوجد خطأ)

الجمع بين السلسلة الاختيارية والدمج الصفري

غالبًا ما تعمل السلسلة الاختيارية جنبًا إلى جنب مع معامل الدمج الصفري (??). يوفر معامل الدمج الصفري قيمة افتراضية عندما يكون الجانب الأيسر من المعامل هو null أو undefined. يتيح لك هذا توفير قيم بديلة عند فقدان خاصية ما.

const user = {};

// الوصول الآمن إلى اسم المستخدم، مع توفير قيمة افتراضية إذا لم يتم تعيينه
const name = user?.profile?.name ?? "Unknown User";
console.log("Name:", name); // المخرج: Unknown User

في هذا المثال، إذا كانت user.profile أو user.profile.name هي null أو undefined، فسيتم تعيين قيمة "Unknown User" للمتغير name.

التوافق مع المتصفحات

السلسلة الاختيارية هي ميزة جديدة نسبيًا في جافاسكريبت (تم تقديمها في ECMAScript 2020). وهي مدعومة من قبل جميع المتصفحات الحديثة. إذا كنت بحاجة إلى دعم المتصفحات القديمة، فقد تحتاج إلى استخدام مترجم مثل Babel لتحويل الكود الخاص بك إلى إصدار متوافق من جافاسكريبت.

القيود

أفضل الممارسات

الخاتمة

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

تبنَّ السلسلة الاختيارية في مشاريعك واستمتع بفوائد الوصول الآمن والأنيق للخصائص. سيجعل الكود الخاص بك أكثر قابلية للقراءة، وأقل عرضة للأخطاء، وفي النهاية، أسهل في الصيانة. برمجة سعيدة!