سؤال

لدي هذا الرمز:

for(var i in this.units)
 {
 if(this.units[i].x==att.x && this.units[i].y==att.y){}
 //... some more code
 }

وأحيانا، عشوائيا، أحصل على خطأ في هذا الأمر.

أي شخص حصل على أي فكرة كيف يمكن ذلك؟

هل كانت مفيدة؟

المحلول

مدبب لمست لفترة وجيزة على السبب المحتمل للقضية في إجابته وهذا هو ذلك this.units[i] يمكن أن تكون فارغة. إذا حاولت الوصول إلى الخاصية وإمكانية الوصول إليها في قيمة فارغة، فستحصل على خطأ "NULL أو غير كائن". في مثالك يتم إلقاء ذلك بواسطة محاولة الوصول إليها this.units[i].x في بيان إذا. الشيء الأكثر أمانا القيام به هو التحقق ومعرفة ما إذا كانت قيمة فارغة أولا:

for(var i in this.units) 
{ 
    if (this.units[i] === null)
        continue;

    if(this.units[i].x==att.x && this.units[i].y==att.y){} 
    //... some more code 
}

يجب عليك أيضا التحقق من النقاط الأخرى في إجابته، والأهم من ذلك ذلك for...in الحلقات ليست مثالية للمصفوفات.

نصائح أخرى

تدوين حلقة

for (var i in this.units)

يمنحك السمات التي يتم تعريفها في كائن "الوحدات". قد لا يكون لدى بعض هؤلاء قيمة، على سبيل المثال إذا كان هناك شيء ما فعله:

this.units.balloon = null;

تكرار من خلال خصائص كائن مع "في" حلقات محفوفة بالمخاطر، ما لم تكن حقا تعرف ما يحدث مع الكائنات الخاصة بك. إذا كان جسمك هو في الواقع صفيف، فأنت بالتأكيد لا ترغب في القيام بذلك - يجب عليك استخدام فهارس رقمية وحلقة عادية بمتغير رقمي. (حتى بعد ذلك، قد يكون هناك إدخالات فارغة!)

سيء: اعتقدت أن هذا السؤال كان في بيثون!

ربما تفعل شيئا مثل:

del this.units[i]

في مكان ما في التعليمات البرمجية الخاصة بك أو تغيير مجموعتك بطريقة ما. هذا ليس بدون تكرار.

بادئ ذي بدء، إذا كان تكرارك أكثر من كائن، فلا تستخدم "أنا" متغير التكرار، استخدم الدعامة أو المفتاح للتأكد من أنك تكرار الخصائص، وليس الفهارس.

ثانيا، يبدو أنه يمكنك ببساطة تصحيح واكتشف العنصر في كائنك فارغا. بدون رمز كامل، من الصعب مساعدتك. أعتقد أن المشكلة هي أنك تحذفها

obj.myProp = null;

مما يعني أن A في حلقة ستظل تكرر أكثر من هذه الممتلكات. ومع ذلك، إذا كنت تستخدم

delete obj.myProp;

لن يتم تكرار MyProp في حلقة.

for(var i = 0; i < this.units.length; i++){
    if(this.units[i].x==att.x && this.units[i].y==att.y){}
}

أنت تحاول الفهرس this.units باستخدام عنصر من this.units. وبعد استخدم a لحلقة (موضحة أعلاه) بدلا من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top