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.
[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'}对象被回收
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'}由于存在于数组中,并不会被释放
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的键,并不会被释放
WeapMap
在释放键对象的处理上和Map
有着本质上的不同,简单来讲,WeapMap
不会因为对象作为键而阻止垃圾回收。
WeakMap
和Map
的区别可分为三个方面:
WeakMap
只能以对象作为键let weakMap = new WeakMap() let obj = {name:'obj'} weakMap.set(obj,'obj as the key') weakMap.set('str','str as the key')//报错
代码执行结果如下:
可见,当我们使用字符串作为key
时,程序不能正常执行。
也就是说,如果一个对象除了WeakMap
的引用之外没有其他引用,那么这个对象就会被系统回收。
举个例子:
let weakMap = new WeakMap() let obj = {name:'obj'} weakMap.set(obj,'obj as the key') 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)
判断是否存在之所以要限制WeakMap
的数据访问方式,是因为JavaScript
引擎释放对象的时机是无法确定的。
当一个对象失去了所有的引用之后,JavaScript
引擎有可能会立即释放对象占用的空间,也有可能再等一等。
所以,在某一时刻,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 //飞鸟尽 //随即,走狗和良弓都会被释放,也可能不是立刻就释放 //这个故事告诉我们,当走狗没有啥好下场,可能不是立刻就被 //弄死了,但是迟早要弄死
和Set
相比,WeakSet
有以下不同点:
WeakSet
只能添加对象元素WeakSet
不阻止系统对元素的回收WeakSet
支持add()
、has()
、delete()
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) }
WeakMap
和WeakSet
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
et Map
peut être divisée en trois aspects : 🎜WeakMap code >Seuls les objets peuvent être utilisés comme clés
clé
, le programme ne peut pas s'exécuter normalement. 🎜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()
WeakMap
ne peut utiliser que les méthodes suivantes : 🎜weakMap.get(key)
Obtenir des paires clé-valeurweakMap.delete(key)
Supprimer la paire clé-valeur lowMap.has(key)
Déterminer s'il existeWeakMap
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.) 🎜 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
:🎜rrreeeSet
Par rapport à WeakSet
, il existe les différences suivantes : 🎜WeakSet
ne peut ajouter que des éléments d'objetWeakSetN'empêche pas le système de recycler les éléments
WeakSet
supporte add()
, has()
, delete ()WeakSet
ne prend pas en charge l'attribut size
et la méthode keys()
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. 🎜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. WeakMap
只能以对象作为键,当键的所有外部引用丢失后(除了WeakMap
以外没有别的变量引用键对象),WeakMap
不会阻止引擎对键值的回收。一经回收,WeakMap
对应的元素就不存在了。WeakSet
只能存储对象,一旦对象元素丢失外部所有的引用(除了WeakSet
以外,没有别的变量引用元素对象),WeakSet
不会阻止引擎对元素的回收。一经回收,WeakSet
中对应的元素就消失了。clear()
、size
、keys()
、values()
等方法WeakMap
和WeakSet
WeakSet
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.
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!