Verwenden Sie hasOwnProperty zum Filtern
Zusammenfassung
Wie der in-Operator durchläuft auch die for in-Schleife bei der Suche nach Objekteigenschaften alle Eigenschaften in der Prototypenkette.
// 修改 Object.prototype Object.prototype.bar = 1; var foo = {moo: 2}; for(var i in foo) { console.log(i); // 输出两个属性:bar 和 moo }
Da es unmöglich ist, das Verhalten von for an sich zu ändern, ist es notwendig, die Eigenschaften herauszufiltern, die nicht im Schleifenkörper erscheinen sollen. Dies kann über die Funktion hasOwnProperty erfolgen der Object.prototype-Prototyp.
Hinweis: Die for in-Schleife durchläuft keine Eigenschaften, deren Aufzählungswert auf „false“ gesetzt ist, wie z. B. die Längeneigenschaft eines Arrays.
Verwenden Sie hasOwnProperty zum Filtern
// foo 变量是上例中的 for(var i in foo) { if (foo.hasOwnProperty(i)) { console.log(i); } }
Diese Version des Codes ist die einzig richtige Art, ihn zu schreiben. Da wir hasOwnProperty verwendet haben, wird dieses Mal nur moo ausgegeben. Wenn hasOwnProperty nicht verwendet wird, kann dieser Code beim Erweitern nativer Objektprototypen (z. B. Object.prototype) beschädigt werden.
Eine weit verbreitete Klassenbibliothek Prototype erweitert native JavaScript-Objekte. Wenn diese Klassenbibliothek in die Seite eingebunden wird, kommt es daher unweigerlich zu Problemen in For-In-Schleifen, die keine hasOwnProperty-Filterung verwenden.
Hinweis: Da for in immer die gesamte Prototypenkette durchläuft, wird die Leistung beeinträchtigt, wenn die Vererbungsebene eines Objekts zu tief ist.
Zusammenfassung
Es wird empfohlen, immer hasOwnProperty zu verwenden, keine Annahmen über die Umgebung zu treffen, in der der Code ausgeführt wird, und nicht davon auszugehen, ob das native Objekt erweitert wurde.
Das Obige ist der Inhalt der JavaScript-Fortgeschrittenenserie – für weitere verwandte Inhalte beachten Sie bitte die chinesische PHP-Website (m.sbmmt.com)!