Gibt es in Javascript eine Möglichkeit, einen "schwachen Verweis" auf ein anderes Objekt zu erstellen? Hier ist die Wiki-Seite, die beschreibt, was eine schwache Referenz ist. Hier ist ein weiterer Artikel, der sie in Java beschreibt. Kann sich jemand eine Möglichkeit vorstellen, dieses Verhalten in Javascript zu implementieren?
javascript
weak-references
Stephen Cagle
quelle
quelle
Antworten:
Es gibt keine Sprachunterstützung für Schwachstellen in JavaScript. Sie können Ihre eigenen mit manueller Referenzzählung rollen, aber nicht besonders reibungslos. Sie können kein Proxy-Wrapper-Objekt erstellen, da Objekte in JavaScript nie wissen, wann sie im Müll gesammelt werden sollen.
So wird Ihre 'schwache Referenz' zu einem Schlüssel (z. B. einer Ganzzahl) in einer einfachen Suche mit einer Methode zum Hinzufügen und Entfernen von Referenzen. Wenn keine manuell verfolgten Referenzen mehr vorhanden sind, kann der Eintrag gelöscht werden, sodass zukünftige Suchvorgänge aktiviert bleiben dieser Schlüssel, um null zurückzugeben.
Dies ist nicht wirklich ein Schwachpunkt, aber es kann einige der gleichen Probleme lösen. Dies wird normalerweise in komplexen Webanwendungen durchgeführt, um Speicherverluste durch Browser (normalerweise IE, insbesondere ältere Versionen) zu verhindern, wenn eine Referenzschleife zwischen einem DOM-Knoten oder einer Ereignisbehandlungsroutine und einem damit verbundenen Objekt wie einem Abschluss besteht. In diesen Fällen ist möglicherweise nicht einmal ein vollständiges Referenzzählschema erforderlich.
quelle
Wenn Sie JS unter NodeJS ausführen, können Sie https://github.com/TooTallNate/node-weak berücksichtigen .
quelle
Update: September 2019
Es ist noch nicht möglich, schwache Referenzen zu verwenden, aber höchstwahrscheinlich wird es bald möglich sein, da WeakRefs in JavaScript in Arbeit sind. Details unten.
Vorschlag
Vorschlag jetzt in Phase 3, was bedeutet, dass es eine vollständige Spezifikation hat und dass eine weitere Verfeinerung Feedback von Implementierungen und Benutzern erfordert.
Der WeakRef- Vorschlag umfasst zwei wichtige neue Funktionen:
Anwendungsfälle
Eine Hauptanwendung für schwache Referenzen ist das Implementieren von Caches oder Zuordnungen, die große Objekte enthalten, wobei gewünscht wird, dass ein großes Objekt nicht nur deshalb am Leben bleibt, weil es in einem Cache oder einer Zuordnung angezeigt wird.
Die Finalisierung ist die Ausführung von Code zur Bereinigung nach einem Objekt, das für die Programmausführung nicht mehr erreichbar ist. Benutzerdefinierte Finalizer ermöglichen mehrere neue Anwendungsfälle und können dazu beitragen, Speicherverluste bei der Verwaltung von Ressourcen zu vermeiden, von denen der Garbage Collector nichts weiß.
Quelle und weiterführende Literatur
https://github.com/tc39/proposal-weakrefs
https://v8.dev/features/weak-references
quelle
Echte schwache Referenzen, nein, noch nicht (aber Browserhersteller schauen sich das Thema an). Aber hier ist eine Idee, wie man schwache Referenzen simuliert.
Sie könnten einen Cache erstellen, durch den Sie Ihre Objekte fahren. Wenn ein Objekt gespeichert wird, sagt der Cache voraus, wie viel Speicher das Objekt belegen wird. Für einige Elemente, wie das Speichern von Bildern, ist dies einfach zu erarbeiten. Für andere wäre dies schwieriger.
Wenn Sie ein Objekt benötigen, fragen Sie den Cache danach. Wenn der Cache das Objekt enthält, wird es zurückgegeben. Wenn es nicht vorhanden ist, wird der Artikel generiert, gespeichert und dann zurückgegeben.
Die schwachen Referenzen werden durch das Entfernen von Elementen im Cache simuliert, wenn die Gesamtmenge des vorhergesagten Speichers ein bestimmtes Niveau erreicht. Es wird vorhergesagt, welche Elemente am wenigsten verwendet werden, basierend darauf, wie oft sie abgerufen werden, gewichtet nach der Zeit, vor der sie herausgenommen wurden. Es können auch Berechnungskosten hinzugefügt werden, wenn der Code, der das Element erstellt, als Abschluss in den Cache übergeben wird. Dies würde es dem Cache ermöglichen, Elemente zu behalten, deren Erstellung oder Generierung sehr teuer ist.
Der Löschalgorithmus ist der Schlüssel, denn wenn Sie dies falsch verstehen, können Sie am Ende die beliebtesten Elemente entfernen. Dies würde eine schreckliche Leistung verursachen.
Solange der Cache das einzige Objekt mit permanenten Verweisen auf die gespeicherten Objekte ist, sollte das obige System als Alternative zu echten schwachen Verweisen ziemlich gut funktionieren.
quelle
Nur als Referenz; JavaScript hat es nicht, aber ActionScript 3 (das auch ECMAScript ist). Überprüfen Sie den Konstruktorparameter für Dictionary .
quelle
Mit Hilfe eines Caching - Mechanismus einen schwachen Bezug zu emulieren, wie JL235 vorgeschlagen oben , ist vernünftig. Wenn schwache Referenzen nativ existieren würden, würden Sie ein Verhalten wie dieses beobachten:
Mit einem Cache würden Sie Folgendes beobachten:
Als Inhaber einer Referenz sollten Sie keine Annahmen darüber treffen, wann sie sich auf einen Wert bezieht. Dies ist bei Verwendung eines Caches nicht anders
quelle
Endlich sind sie da. Noch nicht in Browsern implementiert, wird aber bald verfügbar sein.
https://v8.dev/features/weak-references
quelle
EcmaScript 6 (ES Harmony) verfügt über ein WeakMap- Objekt. Die Browserunterstützung unter modernen Browsern ist ziemlich gut (die letzten 3 Versionen von Firefox, Chrome und sogar eine kommende IE-Version unterstützen dies).
quelle
WeakMap
gibt keine schwachen Verweise auf Objekte an - es sind nicht die Werte , die schwache Verweise in WeakMap sind, sondern die Schlüssel . Die Tatsache, dass schwache Referenzen in der Karte vorhanden sind, ist nur ein Mechanismus zur Verhinderung von Speicherlecks und kann vom Benutzer ansonsten nicht beobachtet werden.weakmap.get(new String('any possible key that has ever existed or ever will exist'))
wird immer seinundefined
. Nicht nützlich. Down-Voting!http://www.jibbering.com/faq/faq_notes/closures.html
ECMAScript verwendet die automatische Speicherbereinigung. Die Spezifikation definiert die Details nicht und überlässt dies den Implementierern, um sie zu sortieren. Es ist bekannt, dass einige Implementierungen ihren Speicherbereinigungsvorgängen eine sehr niedrige Priorität einräumen. Die allgemeine Idee ist jedoch, dass ein Objekt, wenn es nicht mehr referenzierbar ist (da keine verbleibenden Verweise darauf für die Ausführung von Code verfügbar sind), für die Speicherbereinigung verfügbar wird und zu einem späteren Zeitpunkt zerstört wird und alle Ressourcen, die es verbraucht, freigegeben und zurückgegeben werden an das System zur Wiederverwendung.
Dies ist normalerweise beim Verlassen eines Ausführungskontexts der Fall. Die Bereichskettenstruktur, das Aktivierungs- / Variablenobjekt und alle im Ausführungskontext erstellten Objekte, einschließlich Funktionsobjekte, wären nicht mehr zugänglich und würden daher für die Speicherbereinigung verfügbar.
Das heißt, es gibt keine schwachen, nur solche, die nicht mehr verfügbar sind.
quelle