>웹 프론트엔드 >JS 튜토리얼 >JS의 WeakMap이란 무엇입니까?

JS의 WeakMap이란 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-27 08:45:10238검색

What are WeakMaps in JS?

JavaScript의 WeakMap은 키가 객체여야 하는 키-값 쌍의 모음입니다. 열쇠는 "약하다". 이는 키 개체에 대한 다른 참조가 없으면 해당 개체가 여전히 WeakMap에 있더라도 가비지 수집될 수 있음을 의미합니다.


주요 기능

  1. 키는 객체여야 합니다:

    • 기본 값(예: 숫자, 문자열 또는 부울)은 키로 사용할 수 없습니다.
    • 객체와 함수만 키로 허용됩니다.
  2. 약한 참조:

    • WeakMap의 주요 객체는 약하게 유지됩니다.
    • 키에 대한 다른 참조가 없으면 키-값 쌍은 WeakMap에서 자동으로 제거됩니다.
  3. 반복 불가능:

    • WeakMap에는 forEach와 같은 메서드가 없으며 for...of 또는 Object.keys()와 같은 구문을 사용하여 반복될 수 없습니다.
    • 이는 가비지 수집 프로세스로 인해 모든 항목을 안정적으로 나열하는 것이 불가능하기 때문입니다.
  4. 개인 데이터에 유용함:

    • WeakMap은 개인 데이터를 노출하지 않고 객체와 연결하는 데 자주 사용됩니다.

구문

const weakMap = new WeakMap();

방법

Method Description
weakMap.set(key, value) Adds a new key-value pair or updates an existing key.
weakMap.get(key) Retrieves the value associated with the key.
weakMap.has(key) Checks if the key exists in the WeakMap.
weakMap.delete(key) Removes the key-value pair associated with the key.

기본 사용법

const weakMap = new WeakMap();

쓰레기 수거

const weakMap = new WeakMap();

const obj1 = { name: "Alice" };
const obj2 = { name: "Bob" };

// Adding key-value pairs
weakMap.set(obj1, "Data for Alice");
weakMap.set(obj2, "Data for Bob");

// Accessing values
console.log(weakMap.get(obj1)); // Output: "Data for Alice"

// Checking existence
console.log(weakMap.has(obj2)); // Output: true

// Removing a key-value pair
weakMap.delete(obj2);
console.log(weakMap.has(obj2)); // Output: false

사용 사례

  1. 개인 데이터 저장소:
    • 개인 데이터를 개체와 연결하여 다른 곳에 노출되거나 액세스할 수 없도록 합니다.
let obj = { key: "value" };
const weakMap = new WeakMap();
weakMap.set(obj, "Some data");

// Remove all references to `obj`
obj = null;

// The `WeakMap` entry for `obj` is automatically removed by garbage collection.
  1. DOM 노드 메타데이터:
    • 가비지 수집을 방지하지 않고 DOM 요소와 관련된 메타데이터를 저장합니다.
const privateData = new WeakMap();

class User {
    constructor(name) {
        privateData.set(this, { name });
    }

    getName() {
        return privateData.get(this).name;
    }
}

const user = new User("Alice");
console.log(user.getName()); // Output: "Alice"

장점

  • 메모리 효율성: 참조되지 않은 키를 자동으로 제거하면 메모리를 효과적으로 관리하는 데 도움이 됩니다.
  • 캡슐화: 데이터를 비공개적이고 안전하게 저장하는 방법을 제공합니다.
  • 메모리 누수 없음: 키의 가비지 수집을 허용하여 우발적인 메모리 누수를 방지합니다.

제한사항

  1. 반복 불가능:
    • 모든 키나 값을 나열할 수는 없습니다.
  2. 개체 키만:
    • 기본 키를 지원하지 않습니다.
  3. 제한된 사용 사례:
    • 열거 또는 저장된 데이터에 대한 전체 액세스가 필요한 시나리오에는 적합하지 않습니다.

요약하자면 WeakMap은 약한 참조와 비공개 연결이 필요한 시나리오를 위해 설계된 전문 컬렉션입니다.

맵과 위크맵의 차이점

JavaScript에서 MapWeakMap의 주요 차이점은 키 처리, 가비지 수집 및 기능에 있습니다. 자세한 비교는 다음과 같습니다.


주요 차이점

기능
Feature Map WeakMap
Key Types Keys can be any type: objects, primitives. Keys must be objects.
Garbage Collection Does not rely on garbage collection; keys persist. Keys are held weakly and can be garbage-collected.
Iteration Iterable (can use for...of, forEach, etc.). Not iterable (cannot list keys or values).
Size Property Has a size property to get the number of entries. No size property available.
Use Case General-purpose key-value storage. Specialized for associating metadata or private data with objects.
Performance Slightly slower due to strong key references. Faster for memory-sensitive operations due to weak references.
지도 위크맵 키 유형 키는 객체, 프리미티브 등 모든 유형이 될 수 있습니다. 키는 객체여야 합니다. 쓰레기 수집 가비지 수집에 의존하지 않습니다. 키는 지속됩니다. 키는 약하게 보관되며 가비지 수집될 수 있습니다. 반복 반복 가능(for...of, forEach 등을 사용할 수 있음). 반복할 수 없습니다(키나 값을 나열할 수 없음). 크기 속성 항목 수를 가져오는 크기 속성이 있습니다. 사용 가능한 크기 속성이 없습니다. 사용 사례 범용 키-값 저장. 메타데이터 또는 개인 데이터를 개체와 연결하는 데 특화되어 있습니다. 성능 강력한 키 참조로 인해 약간 느려졌습니다. 약한 참조로 인해 메모리에 민감한 작업의 경우 더 빠릅니다.

기능 비교

1. 주요 유형

  • : 객체와 기본 유형(예: 문자열, 숫자, 부울)을 모두 키로 허용합니다.
  • WeakMap: 객체만 키로 허용합니다. 기본 요소는 허용되지 않습니다.
const weakMap = new WeakMap();

2. 쓰레기 수거

  • : 키에 대한 강력한 참조를 유지하여 키가 맵에 존재하는 한 가비지 수집을 방지합니다.
  • WeakMap: 키에 대한 약한 참조를 보유하므로 다른 참조가 없는 경우 가비지 수집이 가능합니다.
const weakMap = new WeakMap();

const obj1 = { name: "Alice" };
const obj2 = { name: "Bob" };

// Adding key-value pairs
weakMap.set(obj1, "Data for Alice");
weakMap.set(obj2, "Data for Bob");

// Accessing values
console.log(weakMap.get(obj1)); // Output: "Data for Alice"

// Checking existence
console.log(weakMap.has(obj2)); // Output: true

// Removing a key-value pair
weakMap.delete(obj2);
console.log(weakMap.has(obj2)); // Output: false

3. 반복

  • : 반복 가능. for...of, .keys(), .values(), .entries() 또는 .forEach()를 사용하여 해당 내용을 반복할 수 있습니다.
  • WeakMap: 반복할 수 없습니다. 모든 키, 값 또는 항목을 검색하는 방법은 없습니다.
let obj = { key: "value" };
const weakMap = new WeakMap();
weakMap.set(obj, "Some data");

// Remove all references to `obj`
obj = null;

// The `WeakMap` entry for `obj` is automatically removed by garbage collection.

4. 크기 속성

  • 지도: 항목 수를 반환하는 크기 속성을 제공합니다.
  • WeakMap: 반복 가능하지 않고 항목이 약하게 참조되므로 크기 속성이 없습니다.
const privateData = new WeakMap();

class User {
    constructor(name) {
        privateData.set(this, { name });
    }

    getName() {
        return privateData.get(this).name;
    }
}

const user = new User("Alice");
console.log(user.getName()); // Output: "Alice"

사용 사례

지도를 사용해야 하는 경우

  • 범용 키-값 저장.
  • 키와 값의 열거 또는 반복이 필요한 시나리오
  • 키는 기본 요소이거나 객체일 수 있습니다.

예:

const metadata = new WeakMap();

function trackElement(element) {
    metadata.set(element, { clicks: 0 });
}

function incrementClicks(element) {
    const data = metadata.get(element);
    if (data) {
        data.clicks++;
    }
}

const button = document.createElement("button");
trackElement(button);
incrementClicks(button);
console.log(metadata.get(button)); // Output: { clicks: 1 }

WeakMap을 사용해야 하는 경우

  • 가비지 수집을 방지하지 않고 메타데이터 또는 개인 데이터를 개체와 연결해야 하는 경우
  • 키의 수명이 관련 값의 수명을 결정해야 하는 경우에 이상적입니다.

예:

const map = new Map();
map.set(1, "value"); // Allowed
map.set("key", "value"); // Allowed
map.set({}, "value"); // Allowed

const weakMap = new WeakMap();
weakMap.set({}, "value"); // Allowed
weakMap.set(1, "value"); // TypeError: Invalid value used as weak map key

요약

기능
Feature Map WeakMap
Flexibility General-purpose, flexible. Specialized, limited use case.
Performance Persistent key references. Memory-efficient with weak references.
Suitability Iteration and long-term storage. Private data and ephemeral relationships.
지도 위크맵 유연성 범용적이고 유연합니다. 특화되고 제한된 사용 사례. 성능 지속적인 키 참조. 약한 참조로 메모리 효율적입니다. 적합성 반복 및 장기 저장. 개인 데이터 및 임시 관계.

위 내용은 JS의 WeakMap이란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.