JavaScript Olası Beklenmedik Yineleme


88

Takip koduna sahibim:

  for (i in awards) {
         if (awards[i] instanceof Array === false) {
               console.log(awards[i]);
                httpFactory.patch(awards[i], {"read": true}, false);
             }
       }

IDE'm yukarıdaki kodla ilgili bu hatayı gösteriyor:

Beklenmeyen (özel / devralınan) üyeler üzerinde olası yineleme, muhtemelen hasOwnProperty denetimi eksik

JavaScript'te filtrelenmemiş giriş döngülerinin tüm örneklerini denetler. Bu yapının kullanılması, miras alınan veya beklenmeyen özelliklerin işlenmesine neden olur. HasOwnProperty () yöntemiyle kendi mülklerini filtrelemeniz gerekir. Doğrulama JavaScript, html veya jsp dosyalarında çalışır.

Bu ifade ile neyin kastedildiğini daha ayrıntılı olarak açıklayabilir misiniz?


2
jQuery hasOwnPropertykontroller gerçekleştirmiyor - Bunun kaç uyarı üreteceğini merak ediyorum ....
Alnitak

Yanıtlar:


151

IDE bir test eklemenizi tavsiye ediyor:

if (awards.hasOwnProperty(i)) {
    ...
}

fordöngünün içinde .

Kişisel olarak bunu yapmamanızı ve mümkünse uyarıyı devre dışı bırakmanızı tavsiye ederim. Çoğu koda gerek yoktur ve hatta bir nesneye numaralandırılamayan özellikleri güvenle ekleyebileceğiniz ES5 koduna daha az ihtiyaç vardır.Object.defineProperty

hasOwnPropertyÇek sen unsafely yeni (enumerable) özelliklerini eklediyseniz gereklidir Object.prototypebasit bir düzeltmedir yüzden, bunu yapma .

jQuery Bu testi yapmaz - onlar açıkça belgelemek durumunda jQuery kıracak Object.prototypeunsafely değiştirilir.


44
IntelliJ 15'te, uyarıyı devre dışı bırakmak için aşağıdakileri gerçekleştirin: Open Preferences -> Editor -> Code Style -> Inspections. Arama kutusuna "hasOwnProperty" yazın. "Döngüde filtrelenmemiş" gösterecektir. Bu kutunun işaretini kaldırın. Değişikliği kabul etmek ve pencereyi kapatmak için Tamam düğmesini tıklayın.
Machtyn

2
IntelliJ'de: CTRL ALT S (kendi CTRL ALT S kısayolu olan Ubuntu'yu kullanmıyorsanız) sadece "hasOwnProperty" araması yapın ve doğrudan soruna gelin, işaretini kaldırın ve bitti!
Olivier Pons

2
WebStorm'da, Dosya ... Ayarlar'a, ardından Düzenleyici -> Denetimler -> "JavaScript ve TypeScript" -> Genel'e gidin ve "Döngü için filtrelenmemiş" seçeneğinin işaretini kaldırın.
mightypile

@Machtyn Bu uyarıyı devre dışı bırakmak için ayarlara gitmeye gerek yoktur. Linux / Windows'ta, imleç uyarının üzerindeyken Alt + Enter tuşlarına basın, açılan bağlam menüsünde ilk seçeneği seçin ve ilk seçeneğin yanındaki alt menüden ayarı devre dışı bırakın.
peterchaula

22

Javascript'teki her nesnenin, kendi özelliklerine (yerel / miras alınan yöntemler / özellikler) ve doğrudan nesnenin kendisine eklenmiş özelliklere sahip bir prototipi vardır.

Bir nesne üzerinde yinelediğinizde, nesnenin kendisinin özelliklerini ve nesnenin prototipinin özelliklerini yineler.

Bu nedenle, prototip üzerinde yinelemeyi önlemek için, yalnızca nesne doğrudan belirtilen özelliğe sahip olduğunda true döndüren hasOwnProperty yönteminin kullanılması önerilir . yani, prototipin içinde değil

Misal

for (var k in object) {
  if (object.hasOwnProperty(k)) {
     // do your computation here.
  }
}

Daha fazla ayrıntı burada bulunabilir


15

Ayrıca döngünüzü şu şekilde yeniden düzenleyebilirsiniz:

const keys = Object.keys(object);
for (const key of keys){
   // do something with object[key];
}

3

Ayrıca, daha okunaklı ve işlevsel bir yaklaşım için forEach döngüsü yazan uyarıdan kurtulabilirsiniz:

Object.keys(object).forEach(key => {
    // Do something with object[key]
});

-3

bu döngünün başına bir koşul daha eklemelisiniz

if (awards.hasOwnProperty(i)) 

15
Bu cevabı reddettim, bu yüzden nedenini söylersem kibar olacağını düşünüyorum. Bu cevap, uyarıdan nasıl kaçınılacağını söyler ancak uyarının ne anlama geldiğini, bunun nasıl önlendiğini veya bu kodun ne yaptığını açıklamaz.
WoodenKitty
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.