
En pocas palabras, si una variable u objeto es "inalcanzable", entonces no es necesario que la variable u objeto continúe almacenado en la memoria y debe reciclarse.
Por ejemplo:
let xiaoming = {name:'xiaoming'}//Crea un objeto y usa la variable xiaoming para hacer referencia a xiaoming = null //Deja la variable xiaoming en blanco, haciendo que el objeto {name:'xiaoming'} sea inalcanzable//{ nombre: 'xiaoming'} El objeto se recicla Si una matriz y otros objetos hacen referencia a un objeto, siempre que la matriz y el objeto que hace referencia a él existan en la matriz, entonces el objeto se considera accesible.
Objetos en la matriz:
let xiaoming = {name:'xiaoming'}
let arr = [xiaoming]
xiaoming = null //Dejar la variable xiaoming en blanco //El objeto {nombre:'xiaoming'} no se liberará porque existe en la matriz. De manera similar, si usamos un objeto como clave Map , si Map existe
Entonces el objeto no será reciclado por el motor.
Objeto clave en Map :
let xiaoming = {name:'xiaoming'}
dejar mapa = nuevo mapa()
map.set(xiaoming,'un niño')
xiaoming = null // Deje la variable xiaoming en blanco // El objeto {nombre: 'xiaoming'} no se liberará porque es la clave del mapa. WeapMap es fundamentalmente diferente de Map en el procesamiento de liberación de objetos clave. Simplemente, WeapMap no evitará la recolección de basura debido a objetos como claves.
La diferencia entre WeakMap y Map se puede dividir en tres aspectos:
WeakMap solo puede usar objetos como clavesletweakMap = new WeakMap()
let obj = {nombre:'obj'}
débilMap.set(obj,'obj como clave')
débilMap.set('str','str as the key')// Los resultados de la ejecución del código de error son los siguientes:

Se puede ver que cuando usamos cadenas como key , el programa no puede ejecutarse normalmente.
En otras palabras, si un objeto no tiene otras referencias excepto WeakMap , el sistema reciclará el objeto.
Por ejemplo:
let débilMap = nuevo WeakMap()
let obj = {nombre:'obj'}
débilMap.set(obj,'obj como clave')
obj = null //Hacer la variable obj vacía //En este momento, el objeto {nombre:'obj'} será reciclado WeakMap admite métodos limitadosWeakMap no admite iteraciónWeakMap no admite keys()WeakMap no admite values()WeakMap no admite entires(), por lo que no tenemos forma de obtener todos los pares clave-valor.
WeakMap solo puede usar los siguientes métodos:
weakMap.get(key) Obtener el par clave-valorweakMap.setweakMap.set(key,val) Establecer el par clave-valorwelowMap.deleteweakMap.delete(key) Eliminar el par clave-valorweakMap.hasweakMap.has(key) Determinar siexiste El método de acceso a datos de WeakMap debe restringirse porque no se puede determinar el momento en que el motor JavaScript libera el objeto.
Cuando un objeto pierde todas las referencias, JavaScript puede liberar el espacio ocupado por el objeto inmediatamente o puede esperar un tiempo.
Por lo tanto, en un momento determinado, no se puede determinar la cantidad de elementos de WeakMap . (Imagínese, si recorremos los elementos de WeakMap después de que un objeto pierde todas las referencias, podemos obtener resultados diferentes).
El escenario de aplicación de WeakMap generalmente es almacenar datos que "pertenecen" a un objeto cuando el objeto no. Cuando estén presentes, los datos "pertenecientes" a este objeto también deben divulgarse.
Hay una historia histórica que es muy adecuada para usar WeakMap`: "El conejo astuto muere, los lacayos son cocinados; los pájaros se han ido y el buen arco se esconde".
Si describimos esta historia en código JavaScript , deberíamos usar WeakMap :
let débilMap = new WeakMap()
let Rabbit = {name:'rabbit'} //El conejo astuto let runDog = {name:'runDog'} //El perro que corre let flyBird = {name:'flyBird'} //El pájaro volador let goodBow = {name :'goodBow'} //Liang Gong débilMap.set(conejo,runDog)
mapa débil.set(flyBird,goodBow)
conejo = null //El astuto conejo muere flyBird = null //Los pájaros se han ido//Pronto, los lacayos y el arco bueno serán liberados, tal vez no de inmediato //Esta historia nos dice que no hay un buen final para ser un lacayo, tal vez no sea eliminado inmediatamente por //, pero lo será tarde o temprano. En comparación con Set, Set WeakSet siguientes diferencias:
WeakSet solo puede agregar elementos de objetoWeakSet add()WeakSet evita que el sistema recicle elementos.add() , has() , delete()WeakSet no admite size ni el método keys() .WeakMap usar WeakMap para verificar cierta información de existencia o verificar el estado como "sí/no". para determinar si el usuario está en línea:
let onlineUser = new WeakMap()
let zhangSan = {nombre:'Zhang San'}
let liSi = {nombre:'李思'}
let wangEr = {nombre:'王二'}
let maZi = {nombre:'Mazi'}
inicio de sesión de función (usuario) {
... ...
usuario en línea.add(usuario)
}
//Determinar si el usuario está en línea function isOnline(user){
volver en líneaUser.has(usuario)
} La limitación de WeakMap y WeakSet es que no pueden iterar y obtener todos los elementos a la vez, lo que no afecta su importante papel en lugares muy críticos.
WeakMap solo puede usar objetos como claves. Cuando se pierden todas las referencias externas a la clave (ninguna otra variable excepto WeakMap hace referencia al objeto clave), WeakMap no impedirá que el motor recicle el valor de la clave. Una vez reciclados, los elementos correspondientes del WeakMap ya no existen.WeakSet solo puede almacenar objetos Una vez que el elemento del objeto pierde todas las referencias externas (excepto WeakSet , ninguna otra variable se refiere al objeto del elemento), WeakSet no impedirá que el motor recicle el elemento. Una vez reciclados, los elementos correspondientes en WeakSet desaparecen.clear() , size , keys() y values() no son compatibles. WeakMap y WeakSet se utilizan a menudo para almacenar estructuras de datos asociadas con el objeto "principal". Una vez que el objeto "principal" pierde su significado, el correspondiente. La estructura de datos asociada se elimina naturalmente.