맵은 키가 있는 데이터를 저장한다는 점에서 객체
와 유사하다.
맵
은 키에 다양한 자료형을 허용한다는 점에서 차이가 있다.
new Map()
: 맵을 만든다.
map.set(key, value)
: key
를 이용해 value
를 저장
map.get(key)
: key
에 해당하는 값을 반환. key
가 존재하지 않으면 undefined
를 반환.
map.has(key)
– key
가 존재하면 true
, 존재하지 않으면 false
를 반환.
map.delete(key)
– key
에 해당하는 값을 삭제.
map.clear()
– 맵 안의 모든 요소를 제거.
map.size
– 요소의 개수를 반환.
let map = new Map();
map.set('1', 'str1'); // 문자형 키
map.set(1, 'num1'); // 숫자형 키
map.set(true, 'bool1'); // 불린형 키
alert( map.get(1) ); // 'num1'
alert( map.get('1') ); // 'str1'
alert( map.size ); // 3
객체는 키를 문자형으로 변환하지만, 맵은 키의 타입을 변환시키지 않고 그대로 유지한다.
let john = { name: "John" };
// 고객의 가게 방문 횟수를 세본다고 가정해 봅시다.
let visitsCountMap = new Map();
// john을 맵의 키로 사용하겠습니다.
visitsCountMap.set(john, 123);
alert( visitsCountMap.get(john) ); // 123
객체
를 키
로 사용할 수 있는 점은 맵
의 중요한 기능 중 하나다.
객체
에는 문자열 키를 사용할 수 있다. 하지만 객체 키는 사용할 수 없다.
셋(set)
에 키가 없는 값이 저장이 된다.new Set(iterable)
– 셋을 만들고, 이터러블 객체를 전달받으면(대개 배열을 전달받음) 그 안의 값을 복사해 셋에 넣어준다.
set.add(value)
– 값을 추가하고 셋 자신을 반환.
set.delete(value)
– 값을 제거. 호출 시점에 셋 내에 값이 있어서 제거에 성공하면 true
, 아니면 false
를 반환.
set.has(value)
– 셋 내에 값이 존재하면 true
, 아니면 false
를 반환.
set.clear()
– 셋을 비운다.
set.size
– 셋에 몇 개의 값이 있는지 세준다.
셋 내에 동일한 값(value)이 있다면 set.add(value)을 아무리 많이 호출하더라도 아무런 반응이 없을것이다. 셋 내의 값에 중복이 없는 이유가 바로 이 때문이다.
한 방문자가 여러번 방문해도 방문자를 중복해서 기록하지 않겠다고 하는 상황과 유사하다.
즉 한 방문자는 '단 한번만 기록'이 되어야 한다.
셋
에도 맵
과 마찬가지로 반복 작업을 위한 메서드가 있습니다.
맵
은 키가 있는 값이 저장된 컬렉션입니다.
new Map([iterable]) – 맵을 만든다.
map.set(key, value) – 키
를 이용해 값을 저장.
map.get(key) – 키
에 해당하는 값을 반환합니다. key가 존재하지 않으면 undefined를 반환.
map.has(key) – 키
가 있으면 true
, 없으면 false
를 반환.
map.delete(key) – 키
에 해당하는 값을 삭제.
map.clear() – 맵 안의 모든 요소를 제거.
map.size – 요소의 개수를 반환.
키의 타입에 제약이 없다.
객체도 키가 될 수 있다.
size 프로퍼티 등의 유용한 메서드나 프로퍼티가 있다.
셋은 중복이 없는 값을 저장할 때 쓰이는 컬렉션.
new Set([iterable]) – 셋(set)
을 만든다.
set.add(value) – 값을 추가하고 셋
자신을 반환.
셋 내에 이미 value가 있는 경우 아무런 작업을 하지 않는다.
set.delete(value) – 값을 제거.
true
, 아니면 false
를 반환.set.has(value) – 셋 내에 값이 존재하면 true
, 아니면 false
를 반환.
set.clear() – 셋을 비운다.
set.size – 셋에 몇 개의 값이 있는지 세줍니다.
따라서 이 두 컬렉션(Map, Set)은 정렬이 되어있지 않다고 할 수 없다.
그렇지만 컬렉션 내 요소나 값을 재 정렬하거나 (배열에서 인덱스를 이용해 요소를 가져오는 것처럼) 숫자를 이용해 특정 요소나 값을 가지고 오는 것은 불가능하다.