이 글은 약한 매핑과 약한 컬렉션과 관련된 문제를 주로 소개하는 javascript에 대한 관련 지식을 함께 살펴보겠습니다.
[관련 권장 사항: javascript 비디오 튜토리얼, web front-end]
간단히 말하면, 변수나 객체가 "접근할 수 없는" 경우 이 변수나 객체가 계속해서 작동할 필요가 없습니다. 메모리에 저장되고 재활용되어야 합니다.
예:
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
的键,如果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
은 간단히 말해서 핵심 개체 해제 처리에 있어서 Map
과 근본적으로 다릅니다. 즉, WeapMap
은 객체를 키로 사용하기 때문에 가비지 수집을 방지하지 않습니다. 🎜WeakMap
과 Map
의 차이점은 세 가지 측면으로 나눌 수 있습니다: 🎜WeakMap code >객체만 키로 사용할 수 있습니다.
키
로 사용하면 프로그램이 정상적으로 실행되지 않는 것을 볼 수 있습니다. 🎜WeakMap 다른 참조가 없으면 시스템에서 객체를 재활용합니다. 🎜🎜예: 🎜rrreee<ol start="3"><li>
<code>WeakMap
은 제한된 메서드를 지원합니다.
WeakMap
반복은 지원되지 않습니다.WeakMap
은 지원되지 않습니다. keys()
WeakMap
은 지원되지 않습니다 지원되는 values()
WeakMap
은 entires()
WeakMap
은 다음 메소드만 사용할 수 있습니다: 🎜weakMap.get(key)
키-값 쌍 가져오기weakMap.delete(key)
키-값 쌍 삭제weakMap.has(key)
존재 여부 확인WeakMap
의 데이터 접근 방식을 제한해야 하는 이유는 다음과 같습니다. JavaScript
엔진 개체를 해제하는 시점을 결정할 수 없습니다. 🎜🎜객체가 모든 참조를 잃으면 JavaScript
엔진은 객체가 차지한 공간을 즉시 해제하거나 잠시 기다릴 수 있습니다. 🎜🎜그래서 특정 순간에 WeakMap
의 요소 수를 확인할 수 없습니다. (객체가 모든 참조를 잃은 후 WeakMap
의 요소를 순회하면 다른 결과를 얻을 수 있다고 상상해 보세요.) 🎜 애플리케이션 시나리오 WeakMap
은 일반적으로 개체에 "속하는" 데이터를 저장하는 데 사용됩니다. 개체가 존재하지 않으면 개체에 "속하는" 데이터도 해제되어야 합니다. 🎜🎜WeakMap`을 사용하기에 매우 적합한 역사적인 이야기가 있습니다. "교활한 토끼가 죽으면 부족한 것이 요리되고 새가 사라지면 좋은 활이 숨겨집니다." 🎜🎜이 스토리를 설명하기 위해 JavaScript
코드를 사용하는 경우 WeakMap
:🎜rrreeeSet
를 사용해야 합니다. > WeakSet
과 비교하면 다음과 같은 차이점이 있습니다. 🎜WeakSet
는 객체 요소만 추가할 수 있습니다.WeakSet시스템이 요소를 재활용하는 것을 막지 않습니다.
WeakSet
는 add()
, has()
를 지원합니다. delete()WeakSet
는 size
속성과 keys()
메서드를 지원하지 않습니다. WeakMap
을 사용하여 일부 존재 정보를 확인하거나 "예/아니요"와 같은 상태를 확인할 수 있습니다. 예를 들어 WeakMap
을 사용할 수 있습니다. > 사용자가 온라인인지 확인하려면: 🎜 rrreee🎜 WeakMap
및 WeakSet
의 제한은 모든 요소를 한 번에 반복하고 얻을 수 없다는 점이며 이는 중요한 요소에 영향을 미치지 않습니다. 매우 중요한 장소에서 역할을 수행합니다. 🎜WeakMap
은 키에 대한 모든 외부 참조가 손실된 경우에만 개체를 사용할 수 있습니다(WeakMap
을 제외한 다른 변수는 키 개체를 참조하지 않음). code >WeakMap은 엔진이 키 값을 재활용하는 것을 방지하지 않습니다. 재활용되면 WeakMap
에 해당하는 요소는 더 이상 존재하지 않습니다. WeakMap
只能以对象作为键,当键的所有外部引用丢失后(除了WeakMap
以外没有别的变量引用键对象),WeakMap
不会阻止引擎对键值的回收。一经回收,WeakMap
对应的元素就不存在了。WeakSet
只能存储对象,一旦对象元素丢失外部所有的引用(除了WeakSet
以外,没有别的变量引用元素对象),WeakSet
不会阻止引擎对元素的回收。一经回收,WeakSet
中对应的元素就消失了。clear()
、size
、keys()
、values()
等方法WeakMap
和WeakSet
WeakSet
는 객체만 저장할 수 있습니다. 객체 요소가 모든 외부 참조를 잃으면(WeakSet
제외, 다른 변수는 요소 객체를 참조하지 않음) WeakSet
는 엔진이 요소를 재활용하는 것을 방지하지 않습니다. 재활용되면 WeakSet
의 해당 요소가 사라집니다.
clear()
, size
, keys()
, values()
및 values()
를 지원하지 않습니다. 다른 방법
WeakMap
및 WeakSet
은 "기본" 개체가 손실되면 "기본" 개체와 관련된 데이터 구조를 저장하는 데 자주 사용됩니다. 그 의미는 해당 연관 데이터 구조가 자연스럽게 삭제된다는 것입니다. 【관련 추천: javascript 비디오 튜토리얼, 🎜web front-end🎜】🎜위 내용은 JavaScript 약한 매핑 및 약한 수집 지식에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!