10.1 맵 (Map)
객체의 단점
프로토타입 체인 때문에 의도하지 않은 연결이 생길 수 있음
객체 안에 연결된 키와 값이 몇 개나 되는지 쉽게 알아낼 수 있는 방법이 없음
키는 반드시 문자열이나 심볼이어야 하므로 객체를 키로 써서 값과 연결할 수 없음
객체는 프로퍼티 순서를 전혀 보장하지 않음
맵
객체의 결함을 모두 해결했음
키와 값을 연결할 목적이라면 맵이 객체보다 더 나음
// 사용자 객체에 역할 부여
const u1 = { name: 'Cynthia' };
const u2 = { name: 'Jackson' };
const u3 = { name: 'Olive' };
const u4 = { name: 'James' };
// 방법 1
// 맵 생성
const userRoles = new Map();
// 사용자 역할 할당
userRoles.set(u1, 'User');
userRoles.set(u2, 'User');
userRoles.set(u3, 'Admin');
// set() 메서드는 체인으로도 가능
userRoles
.set(u1, 'User')
.set(u2, 'User')
.set(u3, 'Admin');
// 방법 2
// 생성자에 배열의 배열을 넘기는 형태로도 가능
const userRoles2 = new Map([
[u1, 'User'],
[u2, 'User'],
[u3, 'Admin'],
]);
get() 메서드
맵에 존재하는 키의 값을 호출할 때 사용
맵에 존재하지 않는 키에 get을 호출하면 undefined 반환
맵에 키가 존재하는지 확인하려면? has() 메서드 사용
userRoles.get(u2); // "User"
set() 메서드
이미 존재하는 키에 set()을 호출하면 값을 변환할 수 있음
userRoles.get(u1);
console.log("before : " + userRoles.get(u1));
userRoles.set(u1, 'Admin');
console.log("after : " + userRoles.get(u1));
결과
before : User
after : Admin
size 프로퍼티
맵의 요소 숫자를 반환
userRoles.size; // 3
keys() 메서드
맵의 키 반환
values() 메서드
값을 반환
entries() 메서드
첫 번째 요소가 키이고 두 번째 요소가 값인 배열을 반환
for (let u of userRoles.keys())
console.log(u.name);
for (let r of userRoles.values())
console.log(r);
for(let [u, r] of userRoles.entries())
console.log(`${u.name}: ${r}`);
// 위의 entries() 사용한 코드를 단축해서 아래처럼 쓸 수 있음
for (let [u, r] of userRoles)
console.log(`${u.name}: ${r}`);
delete() 메서드
맵의 요소를 지울 때 사용
clear() 메서드
맵의 모든 요소를 지울 때 사용
Last updated