ホームページ >ウェブフロントエンド >jsチュートリアル >JavaScript の弱いマッピングと弱いコレクションの知識の詳細な説明

JavaScript の弱いマッピングと弱いコレクションの知識の詳細な説明

WBOY
WBOY転載
2022-06-20 11:21:382004ブラウズ

この記事では、javascript に関する関連知識を提供します。主に弱いマッピングと弱いコレクションに関連する問題を紹介します。一緒に見てみましょう。皆さんのお役に立てれば幸いです。

JavaScript の弱いマッピングと弱いコレクションの知識の詳細な説明

[関連する推奨事項: JavaScript ビデオ チュートリアル Web フロントエンド ]

簡単に言えば、 a 変数またはオブジェクトが「到達不能」の場合、変数またはオブジェクトをメモリに格納し続ける必要はなく、リサイクルする必要があります。

例:

let xiaoming = {name:'xiaoming'}//创建一个对象,并用变量xiaoming引用

xiaoming = null	//将变量xiaoming置空,从而使对象{name:'xiaoming'}不可达

//{name:'xiaoming'}对象被回收

オブジェクトが配列および他のオブジェクトによって参照されている場合、そのオブジェクトが配列を参照し、オブジェクトが配列内に存在する限り、そのオブジェクトは到達可能であるとみなされます。 。

配列内のオブジェクト:

let xiaoming = {name:'xiaoming'}
let arr = [xiaoming]
xiaoming = null //将变量xiaoming置空
//对象{name:'xiaoming'}由于存在于数组中,并不会被释放

同様に、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 の違いは、次の 3 つの側面に分類できます。 WeakMap

オブジェクトのみをキーとして使用できます
  1. let weakMap = new WeakMap()
    let obj = {name:'obj'}
    weakMap.set(obj,'obj as the key')
    weakMap.set('str','str as the key')//报错
    コードの実行結果は次のとおりです:

文字列を使用すると表示されますas

keyJavaScript の弱いマッピングと弱いコレクションの知識の詳細な説明 を使用するとプログラムが正常に実行できなくなります。

エンジンがキー (オブジェクト) をリサイクルすることを妨げません。

    つまり、オブジェクトに
  1. WeakMap
  2. への参照以外の参照がない場合。の場合、オブジェクトはシステムによってリサイクルされます。

例: <pre class="brush:php;toolbar:false">let weakMap = new WeakMap() let obj = {name:'obj'} weakMap.set(obj,'obj as the key') obj = null //将变量obj置空 //此时,对象{name:'obj'}就会被回收</pre>

WeakMap

サポートされるメソッドは制限されています
  1. ##WeakMap
  2. 反復は次のとおりです。サポートされていません
  • WeakMapサポートされていませんkeys()
  • WeakMapサポートされていませんvalues()
  • WeakMapentires()
  • したがって、すべてのキーと値のペアを取得する方法はありません。
  • 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

には次の違いがあります:

WeakSet はオブジェクト要素のみを追加できます

WeakSet
    システムによる要素のリサイクルを妨げません
  1. WeakSet
  2. サポート
  3. add()has()
  4. delete () WeakSet は、size 属性と keys()
  5. メソッド
  6. をサポートしていません。 WeakMap を使用して、いくつかの存在情報を確認したり、「はい/いいえ」ステータスを確認したりできます。たとえば、WeakMap を使用して、ユーザーがオンラインかどうかを判断できます:
  7. 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 の制限は、すべての要素を一度に反復して取得できないことですが、これは非常に重要な場所での重要な役割には影響しません。

概要

  1. WeakMap はオブジェクトをキーとしてのみ使用できます。キーへのすべての外部参照が失われた場合 (WeakMap## 以外に他の変数参照がない場合) # key object)、WeakMap は、エンジンがキー値をリサイクルすることを妨げません。リサイクルされると、WeakMap に対応する要素は存在しなくなります。
  2. WeakSet はオブジェクトのみを保存できます。オブジェクト要素がすべての外部参照を失うと (WeakSet を除き、他の変数は要素オブジェクトを参照できなくなります)、WeakSet エンジンによるエレメントのリサイクルは妨げられません。リサイクルされると、WeakSet 内の対応する要素が消えます。
  3. これらの共通の利点は、適切なシナリオでオブジェクトのメモリ フットプリントを削減できることです。
  4. clear()sizekeys()values() およびその他のメソッドはサポートされません

WeakMapWeakSet は、「メイン」オブジェクトに関連付けられたデータ構造を保存するためによく使用されます。「メイン」オブジェクトがその意味を失うと、対応する関連データ構造は当然削除されます。

【関連する推奨事項:

JavaScript ビデオ チュートリアル Web フロントエンド ]

以上がJavaScript の弱いマッピングと弱いコレクションの知識の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。