모던 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)
: 맵을 객체로 바꾸기
맵과 셋에 반복 작업을 할 땐, 해당 컬렉션에 요소나 값을 추가한 순서대로 반복 작업이 수행된다. 따라서 이 두 컬렉션은 정렬이 되어 있지 않다고 할 수 없다. 그러나 컬렉션 내 요소나 값을 재 정렬하거나 (배열에서 인덱스를 이용해 요소를 가져오는 것처럼) 숫자를 이용해 특정 요소나 값을 가지고 오는 것은 불가능하다.