간단히 말해서, 변수나 개체가 "접근할 수 없는" 경우 해당 변수나 개체를 메모리에 계속 저장할 필요가 없으며 재활용해야 합니다.
예:
let Xiaoming = {name:'xiaoming'}//객체를 생성하고 Xiaoming 변수를 사용하여 Xiaoming = null을 참조합니다. //변수 Xiaoming을 비워서 객체 {name:'xiaoming'}에 접근할 수 없게 만듭니다.//{ name:'xiaoming'} 개체가 재활용됩니다.
개체가 배열 및 다른 개체에 의해 참조되는 경우 해당 개체를 참조하는 배열 및 개체가 배열에 존재하는 한 개체는 연결 가능한 것으로 간주됩니다.
배열의 객체:
let Xiaoming = {name:'xiaoming'} arr = [샤오밍]으로 설정 Xiaoming = null //변수 Xiaoming을 비워둡니다. //{name:'xiaoming'} 개체는 배열에 존재하므로 해제되지 않습니다.
마찬가지로 개체를 Map
의 키로 사용하면 Map
존재합니다. , 그러면 객체는 엔진에 의해 재활용되지 않습니다.
Map
의 주요 객체:
let Xiaoming = {name:'xiaoming'} 지도 = 새 지도() map.set(샤오밍,'소년') Xiaoming = null //샤오밍 변수를 공백으로 만듭니다. //{name:'xiaoming'} 개체는 맵의 키이므로 해제되지 않습니다.
WeapMap
키 개체를 해제하는 처리 방식이 Map
과 근본적으로 다릅니다. 단순히, WeapMap
객체를 키로 사용하기 때문에 가비지 수집을 방지하지 않습니다.
WeakMap
과 Map
의 차이점은 세 가지 측면으로 나눌 수 있습니다.
WeakMap
객체를 키로만 사용할 수 있습니다let WeakMap = new WeakMap() let obj = {이름:'obj'} weakMap.set(obj,'obj를 키로') WeakMap.set('str','str as the key')//에러
코드 실행 결과는 다음과 같습니다.
문자열을 key
사용하면 프로그램이 정상적으로 실행될 수 없음을 알 수 있습니다.
즉, 객체에 WeakMap
참조 외에 다른 참조가 없으면 해당 객체는 시스템에 의해 재활용됩니다.
예를 들어,
weakMap = new WeakMap()으로 설정합니다.
let obj = {이름:'obj'} weakMap.set(obj,'obj를 키로') obj = null //변수 obj를 비워 둡니다 //이때 객체 {name:'obj'}는 재활용됩니다.
WeakMap
제한된 메서드를 지원합니다.WeakMap
반복을 지원하지 않습니다.WeakMap
keys()
WeakMap
values()
WeakMap
entires()
지원하지 않으므로모든 키-값 쌍을 얻을 수 있는 방법이 없습니다.
WeakMap
다음 메소드만 사용할 수 있습니다.weakMap.get
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(플라이버드,goodBow) Rabbit = null //교활한 토끼는 죽는다 flyBird = null //새는 없어진다//곧, 부족한 자들과 좋은 활이 풀려날 것이다, 아마도 당장은 아닐 것이다 //이 이야기는 우리에게 토끼가 되는 것에는 좋은 끝이 없다는 것을 말해준다 부족함, //에 의해 즉시 종료되지는 않지만 조만간 종료됩니다.Set과 비교할 때
다음과 같은 WeakSet
이 Set
.
WeakSet
객체 요소만 추가할 수 있습니다WeakSet
add()
지원하는 것을WeakSet
하지 않습니다.add()
, has()
, delete()
WeakSet
size
속성과 keys()
메소드를 지원하지 않습니다.WeakMap
WeakMap
하여 일부 존재 정보를 확인하거나 "yes/no"와 같은 상태를 확인할 수 있습니다. 사용자가 온라인인지 확인하려면:
onlineUser = new WeakMap()을 사용하세요. let zhangSan = {이름:'장산'} let liSi = {이름:'이思'} let wangEr = {이름:'王이'} let maZi = {이름:'Mazi'} 함수 로그인(사용자){ ... ... onlineUser.add(사용자) } //사용자가 온라인 상태인지 확인 function isOnline(user){ onlineUser.has(사용자) 반환 }
WeakMap
및 WeakSet
의 한계는 모든 요소를 한 번에 반복하고 얻을 수 없다는 점이며, 이는 매우 중요한 위치에서 중요한 역할에 영향을 미치지 않습니다.
WeakMap
키에 대한 모든 외부 참조가 손실된 경우( WeakMap
제외한 다른 변수는 키 개체를 참조하지 않음) 개체를 키로만 사용할 수 있습니다. WeakMap
엔진이 키 값을 재활용하는 것을 방지하지 않습니다. 재활용되면 WeakMap
의 해당 요소는 더 이상 존재하지 않습니다.WeakSet
객체만 저장할 수 있습니다. 일단 객체 요소가 모든 외부 참조를 잃으면( WeakSet
제외, 다른 변수는 요소 객체를 참조하지 않음) WeakSet
엔진이 요소를 재활용하는 것을 막지 않습니다. 재활용되면 WeakSet
의 해당 요소가 사라집니다.clear()
, size
, keys()
, values()
와 같은 메서드는 지원되지 않습니다. WeakMap
및 WeakSet
은 "기본" 개체와 관련된 데이터 구조를 저장하는 데 자주 사용됩니다. 연관된 데이터 구조는 자연스럽게 삭제됩니다.