모던 JavaScript 튜토리얼을 따라가면서 정리합니다.
맵은 키가 있는 값이 저장된 컬렉션이다.
주요 메서드와 프로퍼티
new Map([iterable]): 맵을 만든다.[key, value]쌍이 있는iterable(예: 배열)을 선택적으로 넘길 수 있는데, 이때 넘긴 이터러블 객체는 맵 초기화에 사용된다.map.set(key, value): 키를 이용해 값을 저장한다.set을 호출할 때마다 맵 자신이 반환되기 때문에map.set을 체이닝할 수 있다.1 2 3
map.set('1', 'str1') .set(1, 'num1') .set(true, 'bool1');
map.get(key): 키에 해당하는 값을 반환한다.key가 존재하지 않으면undefined를 반환한다.map.has(key): 키가 있으면true, 없으면false를 반환한다.map.delete(key): 키에 해당하는 값을 삭제한다.map.clear(): 맵 안에 모든 요소를 제거한다.map.size: 요소의 개수를 반환한다.map.keys(): 각 요소의 키를 모은 반복 가능한(iterable, 이터러블) 객체를 반환한다.map.values(): 각 요소의 값을 모은 이터러블 객체를 반환한다.map.entries(): 요소의[키, 값]을 한 쌍으로 하는 이터러블 객체를 반환한다. 이 이터러블 객체는for..of반복문의 기초로 쓰인다.forEach(value, key, map)new Map(Object.entries(obj)): 객체를 맵으로 바꾸기Object.fromEntries(map): 맵을 객체로 바꾸기
일반 객체와 차이점
키의 타입에 제약이 없다. 객체도 키가 될 수 있다.
1 2 3 4 5 6 7 8 9
let john = { name: "John" }; let visitsCountMap = new Map(); visitsCountMap.set(john, 123); alert( visitsCountMap.get(john) ); // 123 let visitsCountObj = {}; visitsCountObj[john] = 123; alert( visitsCountObj["object Object"]); // 123
size프로퍼티 등 유용한 메서드나 프로퍼티가 있다.맵은 값이 삽입된 순서대로 순회를 실시한다. 반면 객체는 프로퍼티 순서를 기억하지 못한다.
특징
map.set을
셋
셋은 중복이 없는 값을 저장할 때 쓰이는 컬렉션이다.
주요 메서드와 프로퍼티
new Set([iterable]): 셋을 만든다.iterable객체를 선택적으로 전달받을 수 있는데(대개 배열), 이터러블 객체 안의 요소는 셋을 초기화하는 데 쓰인다.set.add(value): 값을 추가하고 셋 자신을 반환한다. 셋 내에 이미value가 있는 경우 아무런 작업을 하지 않는다.set.delete(value): 값을 제거한다. 호출 시점에 셋 내에 값이 있어서 제거에 성공하면true, 아니면false를 반환한다.set.has(value)set.clear()set.size()set.keys(): 셋 내의 모든 값을 포함하는 이터러블 객체를 반환한다.set.values():set.keys()와 동일한 작업을 한다.맵과의 호환성을 위해 만들어진 메서드다.set.entries(): 요소의[값, 값]을 한 쌍으로 하는 이터러블 객체를 반환한다.맵과의 호환성을 위해 만들어진 메서드다.forEach(value, key, map)new Map(Object.entries(obj)): 객체를 맵으로 바꾸기Object.fromEntries(map): 맵을 객체로 바꾸기
맵과 셋에 반복 작업을 할 땐, 해당 컬렉션에 요소나 값을 추가한 순서대로 반복 작업이 수행된다. 따라서 이 두 컬렉션은 정렬이 되어 있지 않다고 할 수 없다. 그러나 컬렉션 내 요소나 값을 재 정렬하거나 (배열에서 인덱스를 이용해 요소를 가져오는 것처럼) 숫자를 이용해 특정 요소나 값을 가지고 오는 것은 불가능하다.