簡単に言うと、変数またはオブジェクトが「到達不能」な場合、その変数またはオブジェクトをメモリに格納し続ける必要はなく、リサイクルする必要があります。
例:
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
「メイン」オブジェクトに関連付けられたデータ構造を保存するためによく使用されます。「メイン」オブジェクトがその意味を失うと、対応するオブジェクトが失われます。関連するデータ構造は自然に削除されます。