Perf ist auch ein Grund. Manchmal müssen Sie möglicherweise die Schlüssel durchlaufen. Es gibt verschiedene Möglichkeiten, dies zu tun
for (let key in object) { ... }
for (let key in object) { if (object.hasOwnProperty(key) { ... } }
for (let key of Object.keys(object)) { ... }
Ich benutze normalerweise, for of Object.keys()
weil es das Richtige tut und relativ knapp ist, ohne den Scheck hinzufügen zu müssen.
Aber es ist viel langsamer .
Nur zu erraten, dass der Grund Object.keys
langsam ist, ist offensichtlich, Object.keys()
muss eine Zuordnung vornehmen. Tatsächlich muss AFAIK seitdem eine Kopie aller Schlüssel zuweisen.
const before = Object.keys(object);
object.newProp = true;
const after = Object.keys(object);
before.join('') !== after.join('')
Es ist möglich, dass die JS-Engine eine Art unveränderliche Schlüsselstruktur verwendet, sodass Object.keys(object)
eine Referenz zurückgegeben wird, die über unveränderliche Schlüssel iteriertobject.newProp
ein völlig neues Objekt für unveränderliche Schlüssel erstellt, aber was auch immer, es ist deutlich langsamer als bis zu 15x
Sogar überprüfen hasOwnProperty
ist bis zu 2x langsamer.
Der Sinn all dessen ist, dass Sie, wenn Sie über einen perfekter Code verfügen und Schlüssel durchlaufen müssen, diese verwenden können möchten, for in
ohne anrufen zu müssenhasOwnProperty
. Sie können dies nur tun, wenn Sie nichts geändert habenObject.prototype
Beachten Sie, dass wenn Sie Object.defineProperty
den Prototyp ändern, wenn die von Ihnen hinzugefügten Elemente nicht aufzählbar sind, sie das Verhalten von JavaScript in den oben genannten Fällen nicht beeinflussen. Zumindest in Chrome 83 beeinträchtigen sie leider die Leistung.
Ich habe 3000 nicht aufzählbare Eigenschaften hinzugefügt, um zu versuchen, das Auftreten von Perf-Problemen zu erzwingen. Mit nur 30 Eigenschaften waren die Tests zu nahe, um festzustellen, ob es Auswirkungen auf die Leistung gab.
https://jsperf.com/does-adding-non-enumerable-properties-affect-perf
Firefox 77 und Safari 13.1 zeigten keinen Unterschied in der Leistung zwischen den Klassen Augmented und Unaugmented. Möglicherweise wird v8 in diesem Bereich behoben, und Sie können die Leistungsprobleme ignorieren.
Aber lassen Sie mich auch hinzufügen, dass es die Geschichte von gibtArray.prototype.smoosh
. Die Kurzversion ist Mootools, eine beliebte Bibliothek, die selbst erstellt wurde Array.prototype.flatten
. Als das Standardkomitee versuchte, einen Eingeborenen hinzuzufügen, stellten Array.prototype.flatten
sie fest, dass dies nicht möglich war, ohne viele Websites zu beschädigen. Die Entwickler, die von der Pause erfuhren, schlugen vor, die es5-Methode smoosh
als Witz zu bezeichnen, aber die Leute flippten aus, ohne zu verstehen, dass es ein Witz war. Sie entschieden sich flat
stattdessen fürflatten
Die Moral der Geschichte ist, dass Sie native Objekte nicht erweitern sollten. Wenn Sie dies tun, könnten Sie auf dasselbe Problem stoßen, bei dem Ihre Inhalte beschädigt werden. Wenn Ihre bestimmte Bibliothek nicht so beliebt ist wie MooTools, ist es unwahrscheinlich, dass die Browser-Anbieter das von Ihnen verursachte Problem umgehen. Wenn Ihre Bibliothek so populär wird, wäre es eine Art Mittel, alle anderen dazu zu zwingen, das von Ihnen verursachte Problem zu umgehen. Bitte erweitern Sie native Objekte nicht