Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erläuterung der schwachen JavaScript-Zuordnung und des schwachen Sammlungswissens

Detaillierte Erläuterung der schwachen JavaScript-Zuordnung und des schwachen Sammlungswissens

WBOY
WBOYnach vorne
2022-06-20 11:21:381911Durchsuche

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.

Detaillierte Erläuterung der schwachen JavaScript-Zuordnung und des schwachen Sammlungswissens

[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

WeakMapMap的区别可分为三个方面:

  1. WeakMap只能以对象作为键
let weakMap = new WeakMap()
let obj = {name:'obj'}
weakMap.set(obj,'obj as the key')
weakMap.set('str','str as the key')//报错

代码执行结果如下:

Detaillierte Erläuterung der schwachen JavaScript-Zuordnung und des schwachen Sammlungswissens

可见,当我们使用字符串作为key时,程序不能正常执行。

  1. 不阻止引擎对键(对象)的回收

也就是说,如果一个对象除了WeakMap的引用之外没有其他引用,那么这个对象就会被系统回收。

举个例子:

let weakMap = new WeakMap()
let obj = {name:'obj'}
weakMap.set(obj,'obj as the key')
obj = null	//将变量obj置空
//此时,对象{name:'obj'}就会被回收
  1. 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的应用场景通常是存储一个“属于”对象的数据,当这个对象不存在时,“属于”这个对象的数据也应该随之释放。

有一个非常适合使用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	//飞鸟尽
//随即,走狗和良弓都会被释放,也可能不是立刻就释放
//这个故事告诉我们,当走狗没有啥好下场,可能不是立刻就被
//弄死了,但是迟早要弄死

WeakSet

Set相比,WeakSet有以下不同点:

  1. WeakSet只能添加对象元素
  2. WeakSet不阻止系统对元素的回收
  3. WeakSet支持add()has()delete()
  4. 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)
}

WeakMapWeakSet

Schlüsselobjekte in 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

🎜Der Unterschied zwischen WeakMap und Map kann in drei Aspekte unterteilt werden: 🎜
  1. WeakMap Code >Nur Objekte können als Schlüssel verwendet werden
rrreee🎜Die Ergebnisse der Codeausführung sind wie folgt:🎜🎜Bildbeschreibung hier einfügen🎜🎜Es ist ersichtlich, dass das Programm nicht normal ausgeführt werden kann, wenn wir Zeichenfolgen als Schlüssel verwenden. 🎜
  1. Verhindert nicht, dass die Engine Schlüssel (Objekte) recycelt
🎜Das heißt, wenn ein Objekt keine andere Referenz als 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
  • WeakMapIteration wird nicht unterstützt
  • WeakMap wird nicht unterstützt, keys()
  • WeakMap wird nicht unterstützt unterstützt values()
  • WeakMap unterstützt nicht entires()
🎜Also, Wir verwenden keine Methode, um alle Schlüssel-Wert-Paare abzurufen. 🎜🎜WeakMap kann nur die folgenden Methoden verwenden: 🎜
  • weakMap.get(key)Get key-valuepairs
  • schwachMap.set(key,val)
Schlüssel-Wert-Paar festlegen
  • weakMap.delete(key)Schlüssel-Wert-Paar löschen
  • schwachMap.has(key)Bestimmen Sie, ob es existiert
  • 🎜Der Grund, warum wir die Datenzugriffsmethode von WeakMap 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.) 🎜

    WeakMap-Anwendungsfall

    🎜 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:🎜rrreee

    WeakSet

    🎜 und Setverwenden > Im Vergleich zu WeakSet gibt es folgende Unterschiede: 🎜
    1. WeakSet kann nur Objektelemente hinzufügen
    2. WeakSetVerhindert nicht, dass das System Elemente recycelt
    3. WeakSet unterstützt add(), has(), delete ()
    4. WeakSet unterstützt das Attribut size und die Methode keys() nicht
    5. ol>🎜Wir können WeakMap verwenden, um einige Existenzinformationen zu überprüfen oder einen Status wie „Ja/Nein“ zu überprüfen. Beispielsweise können wir WeakMapverwenden > 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. 🎜

      Zusammenfassung

      1. 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.
      2. WeakMap只能以对象作为键,当键的所有外部引用丢失后(除了WeakMap以外没有别的变量引用键对象),WeakMap不会阻止引擎对键值的回收。一经回收,WeakMap对应的元素就不存在了。
      3. WeakSet只能存储对象,一旦对象元素丢失外部所有的引用(除了WeakSet以外,没有别的变量引用元素对象),WeakSet不会阻止引擎对元素的回收。一经回收,WeakSet中对应的元素就消失了。
      4. 它们共同的优点是,可以在合适的场景中降低对象对内存的占用。
      5. 不支持clear()sizekeys()values()等方法

      WeakMapWeakSetWeakSet 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.

      Ihr gemeinsamer Vorteil besteht darin, dass sie den Speicherbedarf von Objekten in geeigneten Szenarien reduzieren können.

      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!

    Stellungnahme:
    Dieser Artikel ist reproduziert unter:csdn.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen