جافاسكريبت - كيف تتحقق من متغير غير معرف في عامل ثلاثي؟
لدي مشكلة في العملية الثلاثية:
let a = undefined ? "Defined!" : "Definitely Undefined",
b = abc ? "Defined!" : "Definitely Undefined", // ReferenceError
c = (abc !== undefined) ? "Defined!" : "Definitely Undefined", // ReferenceError
d = (typeof abc !== "undefined") ? "Defined!" : "Definitely Undefined"
// results: a = d = "Definitely Undefined",
// while b and c throw ReferenceError when abc is undefined
ما هي أفضل وأقصر طريقة للتحقق مما إذا كان abc undefined قبل الوصول إلى خصائصه وكذلك تعيين كائن فارغ {} إذا كان undefined؟
let a = [[best way to check abc]] ? {[abc.label1]: 2, [abc.label2]: 1} : {}
ملاحظة: أنا حالياً أستخدم (typeof abc !== "undefined") بدلاً من [[أفضل طريقة للتحقق من abc]]
الإجابة رقم 1
بينما يُلقي b و c خطأ مرجعيًا عندما يكون abc غير معرف
لذلك abc ليس مجرد غير معرف، بل هو غير مُصرَّح به. هناك فرق كبير هناك.
إذا كنت بحاجة للتعامل مع عدم إعلان abc، فإن الطريقة الوحيدة الآمنة للقيام بذلك (بدون try/catch) هي باستخدام typeof:
typeof abc === "undefined"
سيكون ذلك صحيحًا، بدون خطأ، إذا كان abc معرفًا غير معلن عنه. سيكون ذلك صحيحًا أيضًا إذا كان abc معلنًا ويحتوي على القيمة undefined.
ما هي الطريقة الأفضل والأقصر للتحقق مما إذا كان
abcغير معرف قبل الوصول إلى خصائصه وكذلك تعيين كائن فارغ{}إذا كان غير معرف؟
من المحتمل استخدام var للتأكد من أنه مُعلن:
var abc = abc || {};
إعلانات var المكررة ليست أخطاء (إعلانات let المكررة هي أخطاء). لذا مع ما سبق، إذا كان abc غير مُعلن، يتم إعلانه بالقيمة الأولية undefined ونقوم بتعيينه إلى {}. إذا كان مُعلنًا، نستبدل قيمته بـ {} إذا كانت قيمته خاطئة (falsy). لكن، إذا كان من الممكن أن يكون مُعلنًا أو لا بـ let أو const، فإن ما سبق سينتج عنه خطأ أيضًا.
لذلك، للتعامل مع الحالة التي قد يتم فيها الإعلان عنها أو لا يتم الإعلان عنها باستخدام let أو const، نحتاج إلى متغير مختلف تمامًا:
let ourabc = typeof abc === "undefined" || !abc ? {} : abc;
هذا يضع ourabc ليصبح {} إذا كان abc غير مُعلن أو إذا كان يحتوي على قيمة كاذبة. بما أن جميع المراجع للكائنات غير null تعتبر صحيحة، وقد قلت أنك تريد الوصول إلى خصائص الكائن، فربما هذه هي الطريقة الأقصر.
الإجابة رقم 2
state = (typeof state !== "undefined") ? state : '';
بهذه الطريقة يمكنك التحقق من المتغير غير المعرفة في عامل الثلاثي.
