JS Day 9 맵(map)과 셋(set)
05 Jan 2021 | JavascriptJS Day 9 맵(map)과 셋(set)
-
맵(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}
-
셋(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() 메소드 사용 가능.
-
위크맵(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 객체는 메모리에서 삭제된다
-
위크셋(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 객체는 메모리와 위크셋에서 삭제된다