
簡単に言うと、変数またはオブジェクトが「到達不能」な場合、その変数またはオブジェクトをメモリに格納し続ける必要はなく、リサイクルする必要があります。
例:
let xiaoming = {name:'xiaoming'}//オブジェクトを作成し、変数 xiaoming を使用して参照する xiaoming = null //変数 xiaoming を空白にして、オブジェクト {name:'xiaoming'} を到達不能にする//{ name:'xiaoming'} オブジェクトはリサイクルされるオブジェクトが配列および他のオブジェクトによって参照されている場合、そのオブジェクトを参照する配列とオブジェクトが配列内に存在する限り、そのオブジェクトは到達可能であるとみなされます。
配列内のオブジェクト:
let xiaoming = {name:'xiaoming'}
arr = [シャオミン]にしましょう
xiaoming = null //変数 xiaoming を空白にする //オブジェクト {name:'xiaoming'} は、配列内に存在するため解放されません。同様に、オブジェクトをMapのキーとして使用する場合、 Map存在する場合。の場合、オブジェクトはエンジンによってリサイクルされません。
Mapのキー オブジェクト:
let xiaoming = {name:'xiaoming'}
let map = new Map()
map.set(シャオミン、'少年')
xiaoming = null //変数 xiaoming を空白にする //オブジェクト {name:'xiaoming'} はマップのキーなので解放されませんWeapMapキーオブジェクトを解放する処理がMapとは根本的に異なります。単純に、 WeapMapオブジェクトをキーとして使用するため、ガベージ コレクションを防止しません。
WeakMapとMapの違いは 3 つの側面に分けることができます。
WeakMapオブジェクトをキーとしてのみ使用できます。letweakMap = new WeakMap()
obj = {名前:'obj'} にします
weakMap.set(obj,'obj をキー')
weakMap.set('str','str as the key')//エラーコードの実行結果は以下のとおりです。

文字列をkeyとして使用すると、プログラムが正常に実行できないことがわかります。
つまり、オブジェクトにWeakMap参照以外の参照がない場合、そのオブジェクトはシステムによってリサイクルされます。
例:
letweakMap = new WeakMap()
obj = {名前:'obj'} にします
weakMap.set(obj,'obj をキー')
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)存在するかどうかを判定するJavaScriptエンジンがオブジェクトを解放するタイミングが分からないため、 WeakMapのデータアクセス方法を制限する必要があります。
オブジェクトがすべての参照を失うと、 JavaScriptエンジンはオブジェクトが占有していたスペースをすぐに解放するか、しばらく待つことがあります。
したがって、ある時点では、 WeakMapの要素数が決定できなくなります。 (オブジェクトがすべての参照を失った後にWeakMapの要素を走査すると、異なる結果が得られる可能性があります。)
WeakMapのアプリケーション シナリオは、通常、オブジェクトがオブジェクトに「属していない」データを格納することです。存在する場合、このオブジェクトに「属する」データも解放される必要があります。
WeakMap の使用に非常に適した歴史的な物語があります。「狡猾なウサギは死に、下僕は調理され、鳥はいなくなり、優れた弓は隠される。」
このストーリーをJavaScriptコードで記述する場合は、 WeakMap使用する必要があります:
letweakMap = 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
しれませんが、遅かれ早かれ強制終了されます。Set と比較すると、
WeakSetオブジェクト要素を追加することしかできませんWeakSet add()WeakSet要素をリサイクルすることを妨げません。add() 、 has() 、 delete()WeakSet size属性とkeys()メソッドをサポートしていません。WeakMapWeakMap WeakMapして、いくつかの存在情報を確認したり、「はい/いいえ」などのステータスを確認したりできます。ユーザーがオンラインかどうかを判断するには:
let onlineUser = new WeakMap()
let zhangSan = {名前:'張三'}
let liSi = {name:'李思'}
let wangEr = {name:'王二'}
let maZi = {名前:'Mazi'}
関数ログイン(ユーザー){
……
onlineUser.add(ユーザー)
}
// ユーザーがオンラインかどうかを判断します function isOnline(user){
onlineUser.has(ユーザー)を返す
WeakMap と WeakSet の制限は、すべての要素を一度に反復して取得できないことですが
WeakMap WeakSetは非常に重要な場所での重要な役割には影響しません。
WeakMapキーとしてオブジェクトのみを使用できます。キーへの外部参照がすべて失われている場合 ( WeakMap以外の他の変数がキー オブジェクトを参照していない場合)、 WeakMapエンジンによるキー値のリサイクルを妨げません。リサイクルされると、 WeakMapの対応する要素は存在しなくなります。WeakSetオブジェクトのみを保存できます。オブジェクト要素がすべての外部参照を失うと ( WeakSetを除き、他の変数は要素オブジェクトを参照しません)、 WeakSetエンジンによる要素のリサイクルを妨げません。リサイクルされると、 WeakSet内の対応する要素は消えます。clear() 、 size 、 keys() 、 values()などのメソッドはサポートされていません。WeakMap およびWeakSet WeakMap 「メイン」オブジェクトに関連付けられたデータ構造を保存するためによく使用されます。「メイン」オブジェクトがその意味を失うと、対応するオブジェクトが失われます。関連するデータ構造は自然に削除されます。