JavaScript mogelijke iteratie over onverwachte

Ik heb de volgende code:

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

Mijn IDE toont deze fout met betrekking tot de bovenstaande code:

Mogelijke herhaling over onverwachte (aangepaste/overgeërfde) leden,
waarschijnlijk ontbreekt hasOwnProperty-controle

Controleert of er ongefilterde for-in-lussen in JavaScript zijn. De
het gebruik van deze constructie resulteert in de verwerking van overgenomen of onverwachte
eigenschappen. U moet eigen eigenschappen filteren met hasOwnProperty()
methode. De validatie werkt in JavaScript-, html- of jsp-bestanden.

Kun je in meer detail uitleggen wat er met deze verklaring wordt bedoeld?


Antwoord 1, autoriteit 100%

De IDE raadt u aan een test toe te voegen:

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

in de for-lus.

Persoonlijk raad ik aan dit niet te doen en de waarschuwing indien mogelijk uit te schakelen. De meeste code is gewoon niet nodig, en nog minder nodig in ES5-code, waar u veilig niet-opsombare eigenschappen aan een object kunt toevoegen met behulp van Object.defineProperty

De hasOwnProperty-controle is alleen nodig als u onveilig nieuwe (opsombare) eigenschappen hebt toegevoegd aan Object.prototype, dus de eenvoudigste oplossing is niet doen dat.

jQuery voert deze test niet uit – ze expliciet documenterendat jQuery zal breken als Object.prototypeis onveilig gewijzigd.


Antwoord 2, autoriteit 16%

Elk object in javascript heeft een prototype met zijn eigen eigenschappen (native/overerfde methoden/eigenschappen) en eigenschappen die direct aan het object zelf zijn gekoppeld.

Als je een object herhaalt, worden de eigenschappen van het object zelf en de eigenschappen van het prototype van het object herhaald.

Dus, om herhaling van het prototype te voorkomen, wordt het aanbevolen om hasOwnPropertymethode die alleen true retourneert als het object de genoemde eigenschap rechtstreeks heeft. d.w.z. niet in prototype

Voorbeeld

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

Meer details zijn te vinden hier


Antwoord 3, autoriteit 14%

Je kunt je loop ook refactoren in:

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

Antwoord 4, autoriteit 9%

Je kunt ook de waarschuwing verwijderen door een forEach-lus te schrijven voor een meer leesbare en functionelere aanpak:

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

Antwoord 5

je moet nog een voorwaarde toevoegen aan het begin van deze lus

if (awards.hasOwnProperty(i)) 

Other episodes