it-swarm.asia

Javascript "لا يمكن قراءة خاصية 'طول' غير محددة" عند التحقق من طول المتغير

أقوم بإنشاء مكشطة node تستخدم cheerio لتحليل DOM. هذا هو أكثر أو سؤال الفانيلا جافا سكريبت رغم ذلك. في جزء واحد من الكشط الخاص بي ، أقوم بتحميل بعض المحتوى في متغير ، ثم تحقق من المتغير length ، مثل ذلك:

var theHref = $(obj.mainImg_select).attr('href');
if (theHref.length){
   // do stuff
} else {
  // do other stuff
}

يعمل هذا على ما يرام ، حتى صادفت عنوان url الذي لم يكن $(obj.mainImg_select).attr('href') موجودًا فيه. لقد افترضت أن الاختيار theHref.length سيؤدي إلى حساب ذلك والانتقال إلى عبارة else: do other stuff ، لكن بدلاً من ذلك حصلت على:

TypeError: Cannot read property 'length' of undefined

ماذا أفعل الخطأ هنا وكيف يمكنني إصلاح هذا؟

22
JVG

يمكنك التحقق من تحديد theHref بالتحقق من ndefined.

if (undefined !== theHref && theHref.length) {
    // `theHref` is not undefined and has truthy property _length_
    // do stuff
} else {
    // do other stuff
}

إذا كنت تريد أيضًا حماية نفسك ضد القيم الخاطئة مثل null ، فاختر theHref هو صدق ، وهو أقصر قليلاً

if (theHref && theHref.length) {
    // `theHref` is truthy and has truthy property _length_
}
41
Paul S.

لماذا ا؟

لقد سألت لماذا يحدث ، لنرى:

لغة محددة يملي دعوة إلى الداخلية [[GetValue]] طريقة. لديك .attr ترجع غير محدد وتحاول الوصول إلى طوله.

إذا لم يكن النوع (V) هو المرجع ، فارجع V.

هذا صحيح ، لأن غير محدد ليس مرجعًا (إلى جانب القيمة الفارغة والرقم والسلسلة والمنطق المنطقي)

دع الأساس يكون نتيجة استدعاء GetBase (V).

هذا يحصل على undefined جزء من myVar.length.

إذا كان IsUnresolvableReference (V) ، فقم بإلقاء استثناء ReferenceError.

هذا غير صحيح ، لأنه قابل للحل ويحل دون تحديد.

إذا IsPropertyReference (V) ، ثم

يحدث هذا لأنه مرجع خاصية مع . بناء الجملة.

الآن يحاول تحويل undefined إلى دالة والتي ينتج عنها TypeError .

5
Benjamin Gruenbaum

هناك فرق بين سلسلة فارغة "" ومتغير غير محدد. يجب أن تتحقق مما إذا كان TheHref يحتوي على سلسلة محددة أم لا ، بدلاً من طولها:

if(theHref){
   // ---
}

إذا كنت لا تزال تريد التحقق من الطول ، فقم بذلك:

if(theHref && theHref.length){
   // ...
}
4
JCOC611

بالإضافة إلى اقتراحات الآخرين ، هناك خيار آخر للتعامل مع هذه المشكلة.

إذا كان يجب أن يتصرف التطبيق الخاص بك في حالة عدم وجود سمة "href" ، كما في حالة كونه فارغًا ، فاستبدل هذا:

var theHref = $(obj.mainImg_select).attr('href');

مع هذا:

var theHref = $(obj.mainImg_select).attr('href') || '';

والتي سوف تعامل سلسلة فارغة ('') كإعداد افتراضي ، إذا لم يتم العثور على السمة.

لكن ذلك يعتمد حقًا على الطريقة التي تريد بها التعامل مع سمة "href" غير محددة. تفترض هذه الإجابة أنك تريد التعامل معها كما لو كانت سلسلة فارغة.

4
Tadeck

إذا كنت لا تفعل نوعًا من المقارنة الرقمية لخاصية الطول ، فمن الأفضل عدم استخدامه في عبارة if ، فقط قم بما يلي:

if(theHref){
   // do stuff
}else{
  // do other stuff
}

سيتم تقييم سلسلة فارغة (أو غير معرّفة ، كما هي الحال في هذه الحالة) على "خاطئ" (تمامًا مثل طول الصفر.)

1
AlliterativeAlice

كما تمت مناقشته في مكان آخر ، فشل مرجع الخاصية .length لأن theHref غير معرف. ومع ذلك ، كن على علم بأي حل ينطوي على مقارنة theHref بـ undefined ، وهي ليست كلمة رئيسية في JavaScript ويمكن إعادة تعريفها.

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

1
Peter Alfvin