Dieser Artikel bringt Ihnen relevantes Wissen über Javascript, das hauptsächlich Probleme im Zusammenhang mit schwacher Zuordnung und schwachen Sammlungen vorstellt. Ich hoffe, es wird für alle hilfreich sein.
[Verwandte Empfehlungen: Javascript-Video-Tutorial, Web-Frontend]
Einfach ausgedrückt: Wenn eine Variable oder ein Objekt „nicht erreichbar“ ist, besteht keine Notwendigkeit, diese Variable oder dieses Objekt weiterhin zu erreichen werden im Speicher gespeichert und sollten recycelt werden.
Zum Beispiel:
let xiaoming = {name:'xiaoming'}//创建一个对象,并用变量xiaoming引用 xiaoming = null //将变量xiaoming置空,从而使对象{name:'xiaoming'}不可达 //{name:'xiaoming'}对象被回收
Wenn ein Objekt von einem Array und anderen Objekten referenziert wird, gilt dieses Objekt auch als erreichbar, solange es auf das Array verweist und das Objekt im Array existiert.
Objekte im Array:
let xiaoming = {name:'xiaoming'} let arr = [xiaoming] xiaoming = null //将变量xiaoming置空 //对象{name:'xiaoming'}由于存在于数组中,并不会被释放
Wenn wir ein Objekt als Schlüssel von Map
verwenden und Map
vorhanden ist, wird das Objekt nicht von der wiederverwendet Motor . Map
的键,如果Map
存在,那么对象就不会被引擎回收。
Map
中的键对象:
let xiaoming = {name:'xiaoming'} let map = new Map() map.set(xiaoming,'a boy') xiaoming = null //将变量xiaoming置空 //对象{name:'xiaoming'}由于是map的键,并不会被释放
WeapMap
在释放键对象的处理上和Map
有着本质上的不同,简单来讲,WeapMap
不会因为对象作为键而阻止垃圾回收。
WeakMap
和Map
的区别可分为三个方面:
WeakMap
只能以对象作为键let weakMap = new WeakMap() let obj = {name:'obj'} weakMap.set(obj,'obj as the key') weakMap.set('str','str as the key')//报错
代码执行结果如下:
可见,当我们使用字符串作为key
时,程序不能正常执行。
也就是说,如果一个对象除了WeakMap
的引用之外没有其他引用,那么这个对象就会被系统回收。
举个例子:
let weakMap = new WeakMap() let obj = {name:'obj'} weakMap.set(obj,'obj as the key') obj = null //将变量obj置空 //此时,对象{name:'obj'}就会被回收
WeakMap
支持的方法有限WeakMap
不支持迭代WeakMap
不支持keys()
WeakMap
不支持values()
WeakMap
不支持entires()
所以,我们没有办法获得所有的键值对。
WeakMap
只能使用如下方法:
weakMap.get(key)
获取键值对weakMap.set(key,val)
设置键值对weakMap.delete(key)
删除键值对weakMap.has(key)
判断是否存在之所以要限制WeakMap
的数据访问方式,是因为JavaScript
引擎释放对象的时机是无法确定的。
当一个对象失去了所有的引用之后,JavaScript
引擎有可能会立即释放对象占用的空间,也有可能再等一等。
所以,在某一时刻,WeakMap
的元素数量是不能确定的。(试想一下,如果一个对象在失去所有的引用之后,我们遍历WeakMap
的元素,可能会得到不同的结果。)
WeakMap
的应用场景通常是存储一个“属于”对象的数据,当这个对象不存在时,“属于”这个对象的数据也应该随之释放。
有一个非常适合使用WeakMap`的历史故事:“狡兔死,走狗烹;飞鸟尽,良弓藏”。
如果我们用JavaScript
代码描述这个故事,就应该用WeakMap
:
let weakMap = new WeakMap() let rabbit = {name:'rabbit'} //狡兔 let runDog = {name:'runDog'} //走狗 let flyBird = {name:'flyBird'} //飞鸟 let goodBow = {name:'goodBow'} //良弓 weakMap.set(rabbit,runDog) weakMap.set(flyBird,goodBow) rabbit = null //狡兔死 flyBird = null //飞鸟尽 //随即,走狗和良弓都会被释放,也可能不是立刻就释放 //这个故事告诉我们,当走狗没有啥好下场,可能不是立刻就被 //弄死了,但是迟早要弄死
和Set
相比,WeakSet
有以下不同点:
WeakSet
只能添加对象元素WeakSet
不阻止系统对元素的回收WeakSet
支持add()
、has()
、delete()
WeakSet
不支持size
属性和keys()
方法我们可以用WeakMap
来验证一些存在性信息,或者验证"是/否"等状态,例如,我们可以使用WeakMap
判断用户是否在线:
let onlineUser = new WeakMap() let zhangSan = {name:'张三'} let liSi = {name:'李四'} let wangEr = {name:'王二'} let maZi = {name:'麻子'} function login(user){ ... ... onlineUser.add(user) } //判断用户是否在线 function isOnline(user){ return onlineUser.has(user) }
WeakMap
和WeakSet
Map
: 🎜rrreee🎜WeapMap
unterscheidet sich grundlegend von Map
in der Verarbeitung der Freigabe von Schlüsselobjekten Mit anderen Worten: WeapMap
verhindert keine Speicherbereinigung aufgrund von Objekten als Schlüssel. 🎜WeakMap
und Map
kann in drei Aspekte unterteilt werden: 🎜WeakMap Code >Nur Objekte können als Schlüssel verwendet werden
Schlüssel
verwenden. 🎜WeakMap Wenn keine anderen Referenzen vorhanden sind, wird das Objekt vom System recycelt. 🎜🎜Zum Beispiel: 🎜rrreee<ol start="3"><li>
<code>WeakMap
unterstützt begrenzte Methoden
WeakMap
Iteration wird nicht unterstütztWeakMap
wird nicht unterstützt, keys()
WeakMap
wird nicht unterstützt unterstützt values()
WeakMap
unterstützt nicht entires()
WeakMap
kann nur die folgenden Methoden verwenden: 🎜weakMap.get(key)
Get key-valuepairsweakMap.delete(key)
Schlüssel-Wert-Paar löschen schwachMap.has(key)
Bestimmen Sie, ob es existiertWeakMap
einschränken müssen, ist folgender die JavaScript
-Engine Der Zeitpunkt der Freigabe eines Objekts kann nicht bestimmt werden. 🎜🎜Wenn ein Objekt alle Referenzen verliert, gibt die JavaScript
-Engine den vom Objekt belegten Speicherplatz möglicherweise sofort frei oder wartet eine Weile. 🎜🎜Zu einem bestimmten Zeitpunkt kann die Anzahl der Elemente von WeakMap
also nicht bestimmt werden. (Stellen Sie sich vor, wenn wir die Elemente von WeakMap
durchlaufen, nachdem ein Objekt alle Referenzen verloren hat, erhalten wir möglicherweise andere Ergebnisse.) 🎜 Das Anwendungsszenario von WeakMap
dient normalerweise dazu, Daten zu speichern, die zu einem Objekt „gehören“. Wenn das Objekt nicht existiert, sollten auch die Daten freigegeben werden, die zu dem Objekt „gehören“. 🎜🎜Es gibt eine historische Geschichte, die sich sehr gut für die Verwendung von WeakMap eignet: „Wenn der schlaue Hase stirbt, werden die Lakaien gekocht; wenn die Vögel weg sind, wird der gute Bogen versteckt.“ 🎜🎜Wenn wir JavaScript
-Code verwenden, um diese Geschichte zu beschreiben, sollten wir WeakMap
:🎜rrreeeSet
verwenden > Im Vergleich zu WeakSet
gibt es folgende Unterschiede: 🎜WeakSet
kann nur Objektelemente hinzufügenWeakSetVerhindert nicht, dass das System Elemente recycelt
WeakSet
unterstützt add()
, has()
, delete ()WeakSet
unterstützt das Attribut size
und die Methode keys()
nicht WeakMap
verwenden, um einige Existenzinformationen zu überprüfen oder einen Status wie „Ja/Nein“ zu überprüfen. Beispielsweise können wir WeakMap
verwenden > um festzustellen, ob der Benutzer online ist: 🎜 rrreee🎜Die Einschränkung von WeakMap
und WeakSet
besteht darin, dass sie nicht alle Elemente auf einmal iterieren und abrufen können, was sich nicht auf ihre Wichtigkeit auswirkt Rolle an sehr kritischen Stellen. 🎜WeakMap
kann nur Objekte als Schlüssel verwenden. Wenn alle externen Verweise auf den Schlüssel verloren gehen (außer WeakMap
verweisen keine anderen Variablen auf das Schlüsselobjekt), WeakMap verhindert nicht, dass die Engine Schlüsselwerte wiederverwendet. Nach der Wiederverwertung existiert das Element, das WeakMap
entspricht, nicht mehr. WeakMap
只能以对象作为键,当键的所有外部引用丢失后(除了WeakMap
以外没有别的变量引用键对象),WeakMap
不会阻止引擎对键值的回收。一经回收,WeakMap
对应的元素就不存在了。WeakSet
只能存储对象,一旦对象元素丢失外部所有的引用(除了WeakSet
以外,没有别的变量引用元素对象),WeakSet
不会阻止引擎对元素的回收。一经回收,WeakSet
中对应的元素就消失了。clear()
、size
、keys()
、values()
等方法WeakMap
和WeakSet
WeakSet
kann nur Objekte speichern. Sobald das Objektelement alle externen Referenzen verliert (mit Ausnahme von WeakSet
verweisen keine anderen Variablen auf das Elementobjekt), WeakSet
verhindert nicht, dass die Engine Elemente recycelt. Nach dem Recycling verschwinden die entsprechenden Elemente in WeakSet
.
Unterstützt nicht clear()
, size
, keys()
, values()
und Andere Methoden
WeakMap
und WeakSet
werden häufig zum Speichern von Datenstrukturen verwendet, die dem „Haupt“-Objekt zugeordnet sind, sobald das „Haupt“-Objekt verloren geht Seine Bedeutung, die entsprechenden Assoziationen Datenstrukturen werden natürlich gelöscht. 【Verwandte Empfehlungen: Javascript-Video-Tutorial, 🎜Web-Frontend🎜】🎜Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der schwachen JavaScript-Zuordnung und des schwachen Sammlungswissens. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!