JavaScript Mögliche Iteration über unerwartet

83

Ich habe folgenden Code:

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

Meine IDE zeigt diesen Fehler in Bezug auf den obigen Code:

Mögliche Iteration über unerwartete (benutzerdefinierte / geerbte) Mitglieder, wahrscheinlich fehlende hasOwnProperty-Prüfung

Überprüft, ob in JavaScript ungefilterte For-In-Schleifen vorhanden sind. Die Verwendung dieses Konstrukts führt zur Verarbeitung geerbter oder unerwarteter Eigenschaften. Sie müssen eigene Eigenschaften mit der Methode hasOwnProperty () filtern. Die Validierung funktioniert in JavaScript-, HTML- oder JSP-Dateien.

Können Sie näher erläutern, was mit dieser Aussage gemeint ist?

Prometheus
quelle
2
jQuery führt keine hasOwnPropertyÜberprüfungen durch - ich frage mich, wie viele Warnungen das erzeugen würde ...
Alnitak

Antworten:

145

Die IDE empfiehlt, einen Test hinzuzufügen:

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

innerhalb der forSchleife.

Ich persönlich empfehle, dies nicht zu tun und die Warnung nach Möglichkeit zu deaktivieren. In den meisten Codes ist dies einfach nicht erforderlich, und in ES5-Code, in dem Sie einem Objekt mithilfe von sicher nicht aufzählbare Eigenschaften hinzufügen können, ist dies noch weniger erforderlichObject.defineProperty

Die hasOwnPropertyÜberprüfung ist nur erforderlich, wenn Sie neue (aufzählbare) Eigenschaften unsicher hinzugefügt haben. Object.prototypeDie einfachste Lösung besteht darin, dies nicht zu tun .

jQuery führt diesen Test nicht durch - sie dokumentieren ausdrücklich, dass jQuery Object.prototypebeschädigt wird, wenn es nicht sicher geändert wird.

Alnitak
quelle
40
Führen Sie in IntelliJ 15 die folgenden Schritte aus, um die Warnung zu deaktivieren: Öffnen Sie die Einstellungen -> Editor -> Codestil -> Inspektionen. Geben Sie im Suchfeld "hasOwnProperty" ein. Es wird "Unfiltered for..in loop" angezeigt. Deaktivieren Sie dieses Kontrollkästchen. Klicken Sie auf OK, um die Änderung zu akzeptieren und das Fenster zu schließen.
Machtyn
2
Suchen Sie in IntelliJ: CTRL ALT S (es sei denn, Sie verwenden Ubuntu mit einer eigenen Verknüpfung zu CTRL ALT S) einfach nach "hasOwnProperty", und Sie gelangen direkt zum Problem. Deaktivieren Sie es und fertig!
Olivier Pons
1
Gehen Sie in WebStorm zu Datei ... Einstellungen, dann zu Editor -> Inspektionen -> "JavaScript und TypeScript" -> Allgemein und deaktivieren Sie "Ungefiltert nach ... in Schleife".
mächtiger
21

Jedes Objekt in Javascript verfügt über einen Prototyp mit eigenen Eigenschaften (native / geerbte Methoden / Eigenschaften) und Eigenschaften, die direkt an das Objekt selbst angehängt sind.

Wenn Sie über ein Objekt iterieren, werden die Eigenschaften des Objekts selbst und die Eigenschaften des Prototyps des Objekts iteriert.

Um zu vermeiden, dass der Prototyp wiederholt wird , wird empfohlen, die Methode hasOwnProperty zu verwenden, die nur dann true zurückgibt , wenn das Objekt direkt über die angegebene Eigenschaft verfügt. dh nicht innerhalb des Prototyps

Beispiel

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

Weitere Details finden Sie hier

Selvaraj MA
quelle
13

Sie können Ihre Schleife auch umgestalten in:

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

Sie können auch die Warnung entfernen, die eine forEach-Schleife schreibt, um einen besser lesbaren und funktionalen Ansatz zu erhalten:

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

Sie sollten am Anfang dieser Schleife eine weitere Bedingung hinzufügen

if (awards.hasOwnProperty(i)) 
bmazurek
quelle
13
Ich habe diese Antwort abgelehnt, daher finde ich es höflich, wenn ich sage, warum. Diese Antwort besagt, wie die Warnung vermieden werden kann, erklärt jedoch nicht, was die Warnung bedeutet, wie dies vermieden wird oder was der Code bewirkt.
WoodenKitty