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

السؤال

نشر (معدل)

اقوم بجلب الداتا من api واريد استخدام الشفرة التالية arrData?.users[0]?.address لكن تاتى مشكلة هنا وهى 

 

TypeError: undefined is not an object (evaluating 'arrData.users[0]')

 

انا وضعت علامة الاستفهام للتحقق ولحل المشكلة ولكن المشكلة لم تحل .. هل اقوم باستخدام هذه العلامة بشكل خاطئ ؟

تم التعديل في بواسطة Wael Aljamal
توضيح السؤال

Recommended Posts

  • 0
نشر

يتم استعمال هاته العلامة في سياق الجافاسكربت بما يعرف بالمعامل الثلاثي ternary operator وهو بمفهومه البسيط ليس الا كتابة مختصرة لشرط if else المعروف.

فشرط مثل: 

if(i == 1){
   console.log('i is equal to one')
}else{
   console.log('i is not equal to one')
}

يصبح:

i == 1 ?
   console.log('i is equal to one')
:
   console.log('i is not equal to one');

في المثال لديك، أظن انك تحاول قراءة الخاصية users من الكائن arrData في حالة توفره. ثم  الخاصية addres في حالة توفر الفهرس 0. يترجم هذا الى: 

if(arrData){
   if(arrData.users[0]){
       console.log(arrData.users[0].address)
   }
}

ويختصر الى: 

arrData ?
   arrData.users[0] ?
       console.log(arrData.users[0].address)
   : '';
: '';

 

  • 1
نشر

تدعى هذه الخاصية بالتسلسل الاختياري Optional chaining ولطن الخطأ لديك ليس بسببها على ما أظن، تأكد من بنية المتغيرات لديك هل هو كائن صحيح به الخاصيات أم كلا.

الشكل العام للخاصية:

obj.val?.prop
obj.val?.[expr]
obj.arr?.[index]
obj.func?.(args)

تعمل الخاصية على ضمان عدم ظهور خطأ عند طلبي خاصية فرعية من خاصية أخرى ضمن غرض برمجي يمكن لأحد القيم فيه أن تكون null فنتجنب حدوث خطأ.

let user = {}; // تحدث للمستخدم ‫user في حالة كان ليس لديه عنوان

alert(user.address.street); // خطأ!‫  

// بعد القليل من المعالجة المنطقة تصبح:

let user = {}; // إذا كان ‫user لا يملك عنوان

alert( user && user.address && user.address.street ); // undefined (أي ليس خطأً)

// ثم تم إضافة Optional chaining 

let user = {}; // إذا كان ‫user لا يملك عنوان

alert( user?.address?.street ); // undefined (ليس خطأً)

يمكنك قراءة المقالة:

 

 

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

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

زائر
أجب على هذا السؤال...

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...