Maison > interface Web > js tutoriel > le corps du texte

Explication détaillée du mappage faible de JavaScript et des connaissances faibles en matière de collection

WBOY
Libérer: 2022-06-20 11:21:38
avant
1979 Les gens l'ont consulté

Cet article vous apporte des connaissances pertinentes sur javascript, qui présente principalement les problèmes liés à la cartographie faible et aux collections faibles. J'espère qu'il sera utile à tout le monde.

Explication détaillée du mappage faible de JavaScript et des connaissances faibles en matière de collection

[Recommandations associées : tutoriel vidéo javascript, front-end web]

En termes simples, si une variable ou un objet est "inaccessible", alors il n'est pas nécessaire que cette variable ou cet objet continue à être sauvegardé en mémoire et doit être recyclé.

Par exemple :

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

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

//{name:'xiaoming'}对象被回收
Copier après la connexion

Si un objet est référencé par un tableau et d'autres objets, tant qu'il fait référence au tableau et que l'objet existe dans le tableau, alors cet objet est également considéré comme accessible.

Objets dans le tableau :

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

De même, si on utilise un objet comme clé de Map, si Map existe, alors l'objet ne sera pas recyclé par le moteur . Map的键,如果Map存在,那么对象就不会被引擎回收。

Map中的键对象:

let xiaoming = {name:'xiaoming'}
let map = new Map()
map.set(xiaoming,'a boy')
xiaoming = null //将变量xiaoming置空
//对象{name:'xiaoming'}由于是map的键,并不会被释放
Copier après la connexion

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')//报错
Copier après la connexion

代码执行结果如下:

Explication détaillée du mappage faible de JavaScript et des connaissances faibles en matière de collection

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

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

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

举个例子:

let weakMap = new WeakMap()
let obj = {name:'obj'}
weakMap.set(obj,'obj as the key')
obj = null	//将变量obj置空
//此时,对象{name:'obj'}就会被回收
Copier après la connexion
  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	//飞鸟尽
//随即,走狗和良弓都会被释放,也可能不是立刻就释放
//这个故事告诉我们,当走狗没有啥好下场,可能不是立刻就被
//弄死了,但是迟早要弄死
Copier après la connexion

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)
}
Copier après la connexion

WeakMapWeakSet

Objets clés dans Map : 🎜rrreee🎜WeapMap est fondamentalement différent de Map dans le traitement de libération des objets clés. en d'autres termes, WeapMap n'empêche pas le garbage collection à cause des objets comme clés. 🎜

WeakMap

🎜La différence entre WeakMap et Map peut être divisée en trois aspects : 🎜
  1. WeakMap code >Seuls les objets peuvent être utilisés comme clés
rrreee🎜Les résultats de l'exécution du code sont les suivants :🎜🎜Insérer la description de l'image ici🎜🎜On peut voir que lorsque nous utilisons des chaînes comme clé, le programme ne peut pas s'exécuter normalement. 🎜
  1. N'empêche pas le moteur de recycler les clés (objets)
🎜C'est à dire si un objet n'a pas de référence autre que WeakMap S'il n'y a pas d'autres références, alors l'objet sera recyclé par le système. 🎜🎜Par exemple : 🎜rrreee<ol start="3"><li> <code>WeakMap prend en charge des méthodes limitées
  • WeakMapL'itération n'est pas prise en charge
  • WeakMap n'est pas prise en charge keys()
  • WeakMap n'est pas prise en charge values()
  • WeakMap pris en charge ne prend pas en charge entires()
🎜Donc, nous n'avons pas de méthode pour obtenir toutes les paires clé-valeur. 🎜🎜WeakMap ne peut utiliser que les méthodes suivantes : 🎜
  • weakMap.get(key)Obtenir des paires clé-valeur
  • lowMap.set(key,val)
Définir la paire clé-valeur
  • weakMap.delete(key)Supprimer la paire clé-valeur
  • lowMap.has(key)Déterminer s'il existe
  • 🎜La raison pour laquelle nous devons restreindre la méthode d'accès aux données de WeakMap est due à le moteur JavaScript Le moment de la libération d'un objet ne peut pas être déterminé. 🎜🎜Lorsqu'un objet perd toutes ses références, le moteur JavaScript peut libérer immédiatement l'espace occupé par l'objet, ou il peut attendre un moment. 🎜🎜Donc, à un certain moment, le nombre d'éléments de WeakMap ne peut pas être déterminé. (Imaginez, si nous parcourons les éléments de WeakMap après qu'un objet ait perdu toutes ses références, nous pourrions obtenir des résultats différents.) 🎜

    Cas d'utilisation de WeakMap

    🎜 Le scénario d'application de WeakMap consiste généralement à stocker les données "appartenant" à un objet. Lorsque l'objet n'existe pas, les données "appartenant" à l'objet doivent également être libérées. 🎜🎜Il existe une histoire historique qui convient très bien à l'utilisation de WeakMap` : "Quand le lapin rusé meurt, les laquais sont cuits ; quand les oiseaux sont partis, le bon arc est caché." 🎜🎜Si nous utilisons du code JavaScript pour décrire cette histoire, nous devrions utiliser WeakMap:🎜rrreee

    WeakSet

    🎜 et Set Par rapport à WeakSet, il existe les différences suivantes : 🎜
    1. WeakSet ne peut ajouter que des éléments d'objet
    2. WeakSetN'empêche pas le système de recycler les éléments
    3. WeakSet supporte add(), has(), delete ()
    4. WeakSet ne prend pas en charge l'attribut size et la méthode keys()
    5. ol>🎜Nous pouvons utiliser WeakMap pour vérifier certaines informations d'existence, ou vérifier un statut tel que "oui/non". Par exemple, nous pouvons utiliser WeakMap". > pour déterminer si l'utilisateur est en ligne : 🎜 rrreee🎜La limitation de WeakMap et WeakSet est qu'ils ne peuvent pas itérer et obtenir tous les éléments à la fois, ce qui n'affecte pas leur importance rôle dans des endroits très critiques. 🎜

      Résumé

      1. WeakMap ne peut utiliser que des objets comme clés. Lorsque toutes les références externes à la clé sont perdues (aucune autre variable à l'exception de WeakMap ne fait référence à l'objet clé), WeakMap n'empêche pas le moteur de recycler les valeurs clés. Une fois recyclé, l'élément correspondant à WeakMap n'existe plus.
      2. WeakMap只能以对象作为键,当键的所有外部引用丢失后(除了WeakMap以外没有别的变量引用键对象),WeakMap不会阻止引擎对键值的回收。一经回收,WeakMap对应的元素就不存在了。
      3. WeakSet只能存储对象,一旦对象元素丢失外部所有的引用(除了WeakSet以外,没有别的变量引用元素对象),WeakSet不会阻止引擎对元素的回收。一经回收,WeakSet中对应的元素就消失了。
      4. 它们共同的优点是,可以在合适的场景中降低对象对内存的占用。
      5. 不支持clear()sizekeys()values()等方法

      WeakMapWeakSetWeakSet ne peut stocker que des objets. Une fois que l'élément objet perd toutes les références externes (à l'exception de WeakSet, aucune autre variable ne fait référence à l'objet élément), WeakSet. > WeakSet n'empêche pas le moteur de recycler les éléments. Une fois recyclés, les éléments correspondants dans WeakSet disparaissent.

      Leur avantage commun est qu'ils peuvent réduire l'empreinte mémoire des objets dans des scénarios appropriés.

      Ne prend pas en charge clear(), size, keys(), values() et d'autres méthodes

    WeakMap et WeakSet sont souvent utilisées pour stocker les structures de données associées à l'objet "principal" une fois que l'objet "principal" est perdu. sa signification, l'association correspondante Les structures de données sont supprimées naturellement. 【Recommandations associées : tutoriel vidéo javascript, 🎜front-end web🎜】🎜

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Étiquettes associées:
    source:csdn.net
    Déclaration de ce site Web
    Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
    Tutoriels populaires
    Plus>
    Derniers téléchargements
    Plus>
    effets Web
    Code source du site Web
    Matériel du site Web
    Modèle frontal