? JavaScript의 강한 참조: JavaScript에서 개체의 참조는 강력한 참조입니다. 즉,将一个引用对象通过变量或常量保存
변수나 상수가 강한 참조입니다. 객체는 재활용되지 않습니다.
JavaScript의 약한 참조: WeakMap 및 WeakSet은 JavaScript에서 약한 참조를 사용할 수 있는 유일한 방법입니다. WeakMap 또는 WeakSet에将一个对象作为键添加
이러한 객체가 재활용되는 것을 방지할 수 없습니다.
개를 안고 있는 아이 A이고, 그들은 개 사슬로 연결되어 있습니다.
약한 참조는 A가 안고 있는 개를 가리키며 B가 '야, 거기 개가 있는데 B가 개를 가리키지만 둘 사이에 묶인 것은 아무것도 없다'고 말하는 사람이 있다는 것이다.
A가 개 목줄을 놓으면 B가 여전히 가리키고 있는지 여부에 관계없이 개는 도망갈 것입니다(가비지 수집됨).
그러나 B가 더 이상 개를 가리키지 않더라도 개는 여전히 A에 의해 붙잡혀 있으므로 도망가는 데에는 영향을 미치지 않습니다.
let people = {name:'Zhang San',age:25} let people1 = people;
위 코드에서 변수 people에 {name:'张三',age:25}
할당하면 메모리에 이들을 연결하는 선이 생깁니다.
그런 다음 people1 변수를 만들고 people1에 people을 할당합니다. 이는 people1이 이 개체를 참조하는 것과 동일합니다.
ES6에서 새로 도입된 WeakSet 및 WeakMap 유형을 사용하여 참조 값을 저장하면 어떤 일이 발생하는지 살펴보겠습니다.
let people = {이름:'장산',나이:25} people1 = 사람이라고 하자; set = new WeakSet(); set.add(people);
새로운 WeakSet() 인스턴스를 생성하고 add 메소드를 통해 people을 추가했습니다. people에 해당하는 참조 값은 {name:'张三',age:25}
입니다.
설정된 인스턴스의 {name:'张三',age:25}
값이 {name:'张三',age:25}
를 참조하고 있음을 알 수 있습니다(실제 메모리에서는 데이터의 스택을 가리킵니다). 포인터 참조, 스택은 해당 힙의 해당 주소 값을 가리킵니다. 그리고 이 약한 참조의 "라인"이 투명하다는 점에 유의하는 것이 중요합니다. 이들강한 인용과의 차이점은 무엇인가요?
한 문장 요약: 강한 참조는 참조 {name:'张三',age:25}
에 의해 "연결"로 인식되는 반면, 약한 참조는 인식되지 않습니다. 즉, 참조는 자신이 세트 인스턴스에 의해 참조된다는 사실을 알지 못합니다.
이는 가비지 수집이 참조가 설정된 인스턴스에 의해 참조된다는 것을 알지 못한다는 것을 의미합니다. 그런 다음 참조의 모든 강력한 참조 연결이 끊어지면(변수가 null 또는 다른 상황에 할당됨) 설정된 인스턴스가 여전히 참조를 참조하더라도 참조는 가비지로 삭제됩니다.
let people = {이름:'장산',나이:25} people1 = 사람이라고 하자; set = new WeakSet(); set.add(사람); 사람 = null; people1 = null;
모든 강력한 참조를 연결 해제하면 어떻게 되나요?
모든 강력한 참조의 연결이 끊어지기 때문에 가비지 수집에서는 참조 {name:'张三',age:25}
더 이상 필요하지 않다고 간주하여 이를 파기합니다. 그러면 해당 세트 인스턴스가 사용하는 참조는 더 이상 존재하지 않습니다. 비록 세트 인스턴스가 여전히 참조를 사용하고 있더라도 마찬가지입니다.
1. WeakSet의 객체에 대한 참조는 약한 참조입니다. 즉, Weakset이 객체를 "참조"하더라도 가비지 수집에서는 이 참조를 "참조"로 간주하지 않습니다. 다른 곳에 강력한 참조가 없는 한 이 객체는 도달할 수 없으며 언제든지 재활용될 수 있으며 참조 유형을 저장할 수만 있고 열거하거나 지울 수 없습니다.
2. WeakMap은 Map과 유사하지만 열거할 수 없고 지울 수 없으며 키가 참조하는 객체는 약한 참조입니다.
3. WeakSet은 객체 그룹을 임시로 저장하고 객체에 바인딩된 정보를 저장하는 데 적합합니다. 이러한 개체가 외부적으로 사라지는 한 WeakSet의 해당 참조는 자동으로 사라집니다. 위의 특성으로 인해 WeakSet의 구성원은 언제든지 사라지기 때문에 참고용으로 적합하지 않습니다.
4. 강력한 참조는 때때로 역참조를 잊어버리고 메모리를 해제할 수 없게 되어 메모리 누수가 발생할 수 있습니다. 약한 참조는 가비지 수집 메커니즘에 포함되지 않으므로 이 문제는 존재하지 않습니다.