Archive

JS Day 9 맵(map)과 셋(set)

|

JS Day 9 맵(map)과 셋(set)


  1. 맵(Map)

    • key, value 값을 저장한다는 점에서 객체와 유사하지만 key에 다양한 자료형을 허용.
    /*
    *	new Map()으로 생성
    *	map.set(key,value) - key에 value값 저장
    *	map.get(key) - key에 해당하는 value값 반환, 없으면 undefined 반환
    *	map.has(key) - key가 존재하면 true, 없으면 false
    * 	map.delete(key) - key에 해당하는 값 삭제
    *	map.clear() - 맵 초기화
    * 	map.size - 요소의 개수 반환
    */
       
    let map = new Map();
    // map.set의 체이닝
    map.set(1, 'age') // 숫자형 key
      .set(true, 'isAlive') // boolean형 key
      .set('age', 12); // 문자형 key
       
    map.has(1); // true
    map.get(true); // isAlive
    map.size; // 2
    


    • map은 객체형 key값도 가질 수 있다.
    let fox = { name: 'fox', age: 12 };
    let isAlive = new Map();
    isAlive.set(fox, false);
    console.log(isAlive.get(fox)); // false
    


    • map의 요소 순회하기 (for .. of 반복문)
    /*
    *	map.keys() - key를 모은 iterable 객체 반환
    *	map.values() - value를 모은 iterable 객체 반환
    *	map.entries() - [key,value] 한 쌍으로 iterable 객체 반환
    */
       
    let zoo = new Map([
        ['fox', 12],
        ['mouse', 5],
        ['horse', 10]
    ]);
       
    for(let animal of zoo.keys()){
        console.log(animal);
    } // fox, mouse, horse
       
    for(let age of zoo.values()){
        console.log(age);
    } // 12, 5, 10
       
    zoo.entries();
    // {"fox" => 12, "mouse" => 5, "horse" => 10}
    


  2. 셋(Set)

    • set은 중복을 허용하지 않음.
    • set에는 value값만 저장된다.
    /*
    *	new Set()로 생성
    *	set.add(value) - value 저장 후 자신을 반환
    *	set.delete(value) - value 제거, 성공하면 true, 아니면 false 반환
    *	set.has(value) - value가 존재하면 true, 아니면 false
    *	set.clear() - 셋 초기화
    *	set.size - 요소의 개수 반환
    */
       
    let set = new Set();
    let fox = { age: 3 };
    let mouse = { age: 10 };
    let horse = { age: 8 };
       
    //중복으로 add
    set.add(fox);
    set.add(mouse);
    set.add(fox);
    set.add(horse);
    set.add(horse);
       
    for(let animal of set){
        console.log(animal.age);
    } // 3, 10, 8
    


    • map과 마찬가지로 keys(), values(), entries() 메소드 사용 가능.


  3. 위크맵(WeakMap)

    • map의 key값으로 객체를 받았을때 key 값의 객체의 참조가 끊겨도 key는 가비지 컬렉터의 대상이 되지 않기에 그대로 남아있어 메모리 낭비가 된다.
    • WeakMap의 key 값으로 받은 객체의 참조가 끊기면 해당 객체는 메모리와 위크맵에서 삭제된다.
    • WeakMap의 key 값은 반드시 객체여야한다. 원시자료형 사용 x
    • keys(), values(), entries(), size 메소드 사용 불가.
    let fox = { age: 12 };
    let weakMap = new WeakMap();
    weakMap.set(fox, "2");
       
    fox = null; // 객체의 참조를 끊음
    // fox 객체는 메모리에서 삭제된다
    


  4. 위크셋(WeakSet)

    • 셋과 유사하지만 원시값 저장이 불가능하다. 객체만 저장 가능.
    • keys(), values(), entries(), size 메소드 사용 불가.
    let whoIsVisited = new WeakSet();
       
    let fox = { age: 12 };
    let mouse = { age: 8 };
    let horse = { age: 10 };
       
    //중복으로 add
    whoIsVisited.add(fox);
    whoIsVisited.add(mouse);
    whoIsVisited.add(mouse);
    whoIsVisited.add(fox);
       
    console.log(whoIsVisited.has(fox)); // true
    console.log(whoIsVisited.has(mouse)); // true
    console.log(whoIsVisited.has(horse)); // false
       
    horse = null;
    // horse 객체는 메모리와 위크셋에서 삭제된다
    





참고 자료


JAVASCRIPT.INFO