Map ๊ฐ์ฒด๋ ํค์ ๊ฐ์ ์์ผ๋ก ์ด๋ฃจ์ด์ง ์ปฌ๋ ์ ์ด๋ค. Map ๊ฐ์ฒด๋ ๊ฐ์ฒด์ ์ ์ฌํ์ง๋ง ์ฐจ์ด์ ์ด ์๋ค.
| ๊ตฌ๋ถ | ๊ฐ์ฒด | Map ๊ฐ์ฒด |
|---|---|---|
| ํค๋ก ์ฌ์ฉํ ์ ์๋ ๊ฐ | ๋ฌธ์์ด ๋๋ ์ฌ๋ฒ ๊ฐ | ๊ฐ์ฒด๋ฅผ ํฌํจํ ๋ชจ๋ ๊ฐ |
| ์ดํฐ๋ฌ๋ธ | X | O |
| ์์ ๊ฐ์ ํ์ธ | Object.keys(obj).length |
map.size |
37-26
const map = new Map();
console.log(map); // Map(0) {}Map ๊ฐ์ฒด๋ Map ์์ฑ์ ํจ์๋ก ์์ฑํ๋ค.
Map ์์ฑ์ ํจ์์ ์ธ์๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฉด ๋น Map ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
37-27
const map1 = new Map([['key1', 'value1'], ['key2', 'value2']]);
console.log(map1); // Map(2) {"key1" => "value1", "key2" => "value2"}
const map2 = new Map([1, 2]); // TypeError: Iterator value 1 is not an entry objectMap ์์ฑ์ ํจ์๋ ์ดํฐ๋ฌ๋ธ์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ Map ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
์ด๋ ์ธ์๋ก ์ ๋ฌ๋๋ ์ดํฐ๋ฌ๋ธ์ ํค์ ๊ฐ์ ์์ผ๋ก ์ด๋ฃจ์ด์ง ์์๋ก ๊ตฌ์ฑ๋์ด์ผ ํ๋ค.
๐ฉ๐ปโ๐ปโ const map2 ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์์ฑํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
37-28
const map = new Map([['key1', 'value1'], ['key1', 'value2']]);
console.log(map); // Map(1) {"key1" => "value2"}Map ์์ฑ์ ํจ์์ ์ธ์๋ก ์ ๋ฌํ ์ดํฐ๋ฌ๋ธ์ ์ค๋ณต๋ ํค๋ฅผ ๊ฐ๋ ์์๊ฐ ์กด์ฌํ๋ฉด ๊ฐ์ด ๋ฎ์ด์จ์ง๋ค.
๋ฐ๋ผ์ Map ๊ฐ์ฒด์๋ ์ค๋ณต๋ ํค๋ฅผ ๊ฐ๋ ์์๊ฐ ์กด์ฌํ ์ ์๋ค.
37-29
const { size } = new Map([['key1', 'value1'], ['key2', 'value2']]);
console.log(size); // 2Map ๊ฐ์ฒด์ ์์ ๊ฐ์๋ฅผ ํ์ธํ ๋๋ Map.prototype.size ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ๋ค.
37-30
const map = new Map([['key1', 'value1'], ['key2', 'value2']]);
console.log(Object.getOwnPropertyDescriptor(Map.prototype, 'size'));
// {set: undefined, enumerable: false, configurable: true, get: ฦ}
map.size = 10; // ๋ฌด์๋๋ค.
console.log(map.size); // 2size ํ๋กํผํฐ๋ setter ํจ์ ์์ด getter ํจ์๋ง ์กด์ฌํ๋ ์ ๊ทผ์ ํ๋กํผํฐ๋ค.
setter ํจ์๊ฐ ์๊ธฐ ๋๋ฌธ์ size ํ๋กํผํฐ์ ์ซ์๋ฅผ ํ ๋นํ์ฌ Map ๊ฐ์ฒด์ ์์ ๊ฐ์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
getter ํจ์ |
setter ํจ์ |
|---|---|
| ํ๋กํผํฐ์ ์ ๊ทผํ ๋ ํด๋น ๊ฐ์ ๋ฐํํ๋ ํจ์ | ํ๋กํผํฐ์ ๊ฐ์ ํ ๋นํ ๋ ํธ์ถ๋๋ ํจ์ |
37-31
const map = new Map();
console.log(map); // Map(0) {}
map.set('key1', 'value1');
console.log(map); // Map(1) {"key1" => "value1"}Map ๊ฐ์ฒด์ ์์๋ฅผ ์ถ๊ฐํ ๋๋ Map.prototype.set ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
37-32
const map = new Map();
map
.set('key1', 'value1')
.set('key2', 'value2');
console.log(map); // Map(2) {"key1" => "value1", "key2" => "value2"}set ๋ฉ์๋๋ ์๋ก์ด ์์๊ฐ ์ถ๊ฐ๋ Map ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค.
๋ฐ๋ผ์ set ๋ฉ์๋๋ฅผ ํธ์ถํ ํ์ set ๋ฉ์๋๋ฅผ ์ฐ์์ ์ผ๋ก ํธ์ถํ ์ ์๋ค.
37-33
const map = new Map();
map
.set('key1', 'value1')
.set('key1', 'value2');
console.log(map); // Map(1) {"key1" => "value2"}Map ๊ฐ์ฒด์๋ ์ค๋ณต๋ ํค๋ฅผ ๊ฐ๋ ์์๊ฐ ์กด์ฌํ ์ ์๋ค.
์ค๋ณต๋ ํค๋ฅผ ๊ฐ๋ ์์๋ฅผ ์ถ๊ฐํ๋ฉด ๊ฐ์ด ๋ฎ์ด์จ์ง๋ค. ์๋ฌ๋ ์ผ์ด๋์ง ์๋๋ค.
37-34
const map = new Map();
console.log(NaN === NaN); // false
console.log(0 === -0); // true
// NaN๊ณผ NaN์ ๊ฐ๋ค๊ณ ํ๊ฐํ์ฌ ์ค๋ณต ์ถ๊ฐ๋ฅผ ํ์ฉํ์ง ์๋๋ค.
map.set(NaN, 'value1').set(NaN, 'value2');
console.log(map); // Map(1) { NaN => 'value2' }
// +0๊ณผ -0์ ๊ฐ๋ค๊ณ ํ๊ฐํ์ฌ ์ค๋ณต ์ถ๊ฐ๋ฅผ ํ์ฉํ์ง ์๋๋ค.
map.set(0, 'value1').set(-0, 'value2');
console.log(map); // Map(2) { NaN => 'value2', 0 => 'value2' }์ผ์น ๋น๊ต ์ฐ์ฐ์ === ๋ฅผ ์ฌ์ฉํ๋ฉด NaN ๊ณผ NaN ์ ๋ค๋ฅด๋ค๊ณ ํ๊ฐํ๋ค.
ํ์ง๋ง Map ๊ฐ์ฒด๋ NaN ๊ณผ NaN ์ ๊ฐ๋ค๊ณ ํ๊ฐํ์ฌ ์ค๋ณต ์ถ๊ฐ๋ฅผ ํ์ฉํ์ง ์๋๋ค.
+0 ๊ณผ -0์ ์ผ์น ๋น๊ต ์ฐ์ฐ์ === ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ๋ค๊ณ ํ๊ฐํ์ฌ ์ค๋ณต ์ถ๊ฐ๋ฅผ ํ์ฉํ์ง ์๋๋ค.
37-35
const map = new Map();
const lee = { name: 'Lee' };
const kim = { name: 'Kim' };
// ๊ฐ์ฒด๋ ํค๋ก ์ฌ์ฉํ ์ ์๋ค.
map
.set(lee, 'developer')
.set(kim, 'designer');
console.log(map);
// Map(2) { {name: "Lee"} => "developer", {name: "Kim"} => "designer" }์ผ๋ฐ ๊ฐ์ฒด์ Map ๊ฐ์ฒด์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ : ํค ํ์
| ์ผ๋ฐ ๊ฐ์ฒด | Map ๊ฐ์ฒด |
|---|---|
| ๋ฌธ์์ด ๋๋ ์ฌ๋ฒ ๊ฐ๋ง ํค๋ก ์ฌ์ฉ ๊ฐ๋ฅ | ์ ํ ์์ = ๊ฐ์ฒด๋ฅผ ํฌํจํ ๋ชจ๋ ๊ฐ์ ํค๋ก ์ฌ์ฉ ๊ฐ๋ฅ |
37-36
const map = new Map();
const lee = { name: 'Lee' };
const kim = { name: 'Kim' };
map
.set(lee, 'developer')
.set(kim, 'designer');
console.log(map.get(lee)); // developer
console.log(map.get('key')); // undefinedMap ๊ฐ์ฒด์์ ํน์ ์์๋ฅผ ์ทจ๋ํ๋ ค๋ฉด Map.prototype.get ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
get ๋ฉ์๋์ ์ธ์๋ก ํค๋ฅผ ์ ๋ฌํ๋ฉด Map ๊ฐ์ฒด์์ ์ธ์๋ก ์ ๋ฌํ ํค๋ฅผ ๊ฐ๋ ๊ฐ์ ๋ฐํํ๋ค.
map.get ๋ฉ์๋์ ์กด์ฌํ์ง ์๋ ํค๋ฅผ ์ ๋ฌํ๋ฉด, ์ฆ map.get('key')์ ๊ฐ์ด ํธ์ถํ๋ฉด ํด๋น ํค์ ๋ํ ๊ฐ์ด ์กด์ฌํ์ง ์๊ธฐ ๋๋ฌธ์ undefined๊ฐ ๋ฐํ๋ฉ๋๋ค.
Map ๊ฐ์ฒด์์ ์ธ์๋ก ์ ๋ฌํ ํค๋ฅผ ๊ฐ๋ ์์๊ฐ ์กด์ฌํ์ง ์์ ๋์ ๊ธฐ๋ณธ ๋ฐํ๊ฐ์ด๋ค.
37-37
const lee = { name: 'Lee' };
const kim = { name: 'Kim' };
const map = new Map([[lee, 'developer'], [kim, 'designer']]);
console.log(map.has(lee)); // true
console.log(map.has('key')); // falseMap ๊ฐ์ฒด์ ํน์ ์์๊ฐ ์กด์ฌํ๋์ง ํ์ธํ๋ ค๋ฉด Map.prototype.has ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
has ๋ฉ์๋๋ ํน์ ์์์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ฐํํ๋ค.
get ๋ฉ์๋ |
has ๋ฉ์๋ |
|---|---|
| ํน์ ํค์ ํด๋นํ๋ ๊ฐ์ ๋ฐํ | ํน์ ํค์ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธ |
37-38
const lee = { name: 'Lee' };
const kim = { name: 'Kim' };
const map = new Map([[lee, 'developer'], [kim, 'designer']]);
map.delete(kim);
console.log(map); // Map(1) { {name: "Lee"} => "developer" }Map ๊ฐ์ฒด์ ์์๋ฅผ ์ญ์ ํ๋ ค๋ฉด Map.prototype.delete ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
delete ๋ฉ์๋๋ ์ญ์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ฐํํ๋ค.
37-39
const map = new Map([['key1', 'value1']]);
// ์กด์ฌํ์ง ์๋ ํค 'key2'๋ก ์์๋ฅผ ์ญ์ ํ๋ ค ํ๋ฉด ์๋ฌ์์ด ๋ฌด์๋๋ค.
map.delete('key2');
console.log(map); // Map(1) {"key1" => "value1"}์กด์ฌํ์ง ์๋ ํค๋ก Map ๊ฐ์ฒด์ ์์๋ฅผ ์ญ์ ํ๋ ค ํ๋ฉด ์๋ฌ ์์ด ๋ฌด์๋๋ค.
37-40
const lee = { name: 'Lee' };
const kim = { name: 'Kim' };
const map = new Map([[lee, 'developer'], [kim, 'designer']]);
map.delete(lee).delete(kim); // TypeError: map.delete(...).delete is not a functiondelete ๋ฉ์๋๋ ์ญ์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ฐํํ๋ค.
๋ฐ๋ผ์ set ๋ฉ์๋์ ๋ฌ๋ฆฌ ์ฐ์์ ์ผ๋ก ํธ์ถํ ์ ์๋ค.
37-41
const lee = { name: 'Lee' };
const kim = { name: 'Kim' };
const map = new Map([[lee, 'developer'], [kim, 'designer']]);
map.clear();
console.log(map); // Map(0) {}Map ๊ฐ์ฒด์ ์์๋ฅผ ์ผ๊ด ์ญ์ ํ๋ ค๋ฉด Map.prototype.clear ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
clear ๋ฉ์๋๋ ์ธ์ ๋ undefined๋ฅผ ๋ฐํํ๋ค.
37-42
const lee = { name: 'Lee' };
const kim = { name: 'Kim' };
const map = new Map([[lee, 'developer'], [kim, 'designer']]);
map.forEach((v, k, map) => console.log(v, k, map));
/*
developer {name: "Lee"} Map(2) {
{name: "Lee"} => "developer",
{name: "Kim"} => "designer"
}
designer {name: "Kim"} Map(2) {
{name: "Lee"} => "developer",
{name: "Kim"} => "designer"
}
*/Map ๊ฐ์ฒด์ ์์๋ฅผ ์ํํ๋ ค๋ฉด Map.prototype.forEach ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
๋ฐฐ์ด์ forEach ๋ฉ์๋์ ์ ์ฌํ๊ฒ ์ฝ๋ฐฑ ํจ์์ forEach ๋ฉ์๋์ ์ฝ๋ฐฑ ํจ์ ๋ด๋ถ์์ this๋ก ์ฌ์ฉ๋ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌํ๋ค.
์ด ๋ ์ฝ๋ฐฑ ํจ์๋ 3๊ฐ์ ์ธ์๋ฅผ ์ ๋ฌ๋ฐ๋๋ค.
- ์ฒซ ๋ฒ์งธ ์ธ์ : ํ์ฌ ์ํ ์ค์ธ ์์๊ฐ
- ๋ ๋ฒ์งธ ์ธ์ : ํ์ฌ ์ํ ์ค์ธ ์์ํค
- ์ธ ๋ฒ์งธ ์ธ์ : ํ์ฌ ์ํ ์ค์ธ
Map๊ฐ์ฒด ์์ฒด
37-43
const lee = { name: 'Lee' };
const kim = { name: 'Kim' };
const map = new Map([[lee, 'developer'], [kim, 'designer']]);
// Map ๊ฐ์ฒด๋ Map.prototype์ Symbol.iterator ๋ฉ์๋๋ฅผ ์์๋ฐ๋ ์ดํฐ๋ฌ๋ธ์ด๋ค.
console.log(Symbol.iterator in map); // true
// ์ดํฐ๋ฌ๋ธ์ธ Map ๊ฐ์ฒด๋ for...of ๋ฌธ์ผ๋ก ์ํํ ์ ์๋ค.
for (const entry of map) {
console.log(entry); // [{name: "Lee"}, "developer"] [{name: "Kim"}, "designer"]
}
// ์ดํฐ๋ฌ๋ธ์ธ Map ๊ฐ์ฒด๋ ์คํ๋ ๋ ๋ฌธ๋ฒ์ ๋์์ด ๋ ์ ์๋ค.
console.log([...map]);
// [[{name: "Lee"}, "developer"], [{name: "Kim"}, "designer"]]
// ์ดํฐ๋ฌ๋ธ์ธ Map ๊ฐ์ฒด๋ ๋ฐฐ์ด ๋์คํธ๋ญ์ฒ๋ง ํ ๋น์ ๋์์ด ๋ ์ ์๋ค.
const [a, b] = map;
console.log(a, b); // [{name: "Lee"}, "developer"] [{name: "Kim"}, "designer"]Map ๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธ์ด๋ค.
๋ฐ๋ผ์ for...of ๋ฌธ์ผ๋ก ์ํํ ์ ์์ผ๋ฉฐ, ์คํ๋ ๋ ๋ฌธ๋ฒ๊ณผ ๋ฐฐ์ด ๋์คํธ๋ญ์ฒ๋ง ํ ๋น์ ๋์์ด ๋ ์ ์๋ค.
37-44
const lee = { name: 'Lee' };
const kim = { name: 'Kim' };
const map = new Map([[lee, 'developer'], [kim, 'designer']]);
// Map.prototype.keys๋ Map ๊ฐ์ฒด์์ ์์ํค๋ฅผ ๊ฐ์ผ๋ก ๊ฐ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
for (const key of map.keys()) {
console.log(key); // {name: "Lee"} {name: "Kim"}
}
// Map.prototype.values๋ Map ๊ฐ์ฒด์์ ์์๊ฐ์ ๊ฐ์ผ๋ก ๊ฐ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
for (const value of map.values()) {
console.log(value); // developer designer
}
// Map.prototype.entries๋ Map ๊ฐ์ฒด์์ ์์ํค์ ์์๊ฐ์ ๊ฐ์ผ๋ก ๊ฐ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ค.
for (const entry of map.entries()) {
console.log(entry); // [{name: "Lee"}, "developer"] [{name: "Kim"}, "designer"]
}Map ๊ฐ์ฒด๋ Symbol.iterator ์์ฑ์ ํตํด ์ดํฐ๋ฌ๋ธํ๋ฉฐ, ๋์์ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋ ๋ฉ์๋์ธ entries, keys, values ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
Map ๋ฉ์๋ |
์ค๋ช | ์ฌ์ฉ ์์ |
|---|---|---|
Map.prototype.keys |
Map ๊ฐ์ฒด์ ํค๋ค์ ์ํํ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํ, ์ดํฐ๋ ์ดํฐ๋ ํค ๊ฐ๋ง ์์ฐจ์ ์ผ๋ก ๋ฐํ |
map.keys() |
Map.prototype.values |
Map ๊ฐ์ฒด์ ๊ฐ๋ค์ ์ํํ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํ, ์ดํฐ๋ ์ดํฐ๋ ๊ฐ๋ง ์์ฐจ์ ์ผ๋ก ๋ฐํ |
map.values() |
Map.prototype.entries |
Map ๊ฐ์ฒด์ ๊ฐ ํค-๊ฐ ์์ ์ํํ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํ, ์ดํฐ๋ ์ดํฐ๋ [key, value] ํํ์ ๋ฐฐ์ด์ ์์ฐจ์ ์ผ๋ก ๋ฐํ |
map.entries() |
์์์ ์์์ ์๋ฏธ๋ฅผ ๊ฐ์ง ์์ง๋ง ์ํํ๋ฉด ์ถ๊ฐ๋ ์์๋๋ก ๋์จ๋ค. ์ด๋ ๋ค๋ฅธ ์ดํฐ๋ฌ๋ธ์ ์ํ์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํจ์ด๋ค.
- ๊ณตํต์
- ์์ฑ์ ํจ์๋ก ์์ฑ, ์์ฑ์ ํจ์์ ์ธ์ ๋ฏธ์ ๋ฌ์ ๋น ๊ฐ์ฒด๊ฐ ์์ฑ
setter์์ดgetterํจ์๋ง ์กด์ฌํ๋ ์ ๊ทผ์ ํ๋กํผํฐ- ์ค๋ณต๋ ์์ ์กด์ฌ ๋ถ๊ฐ๋ฅ => ์๋ฌ ๋์ฐ์ง ์๊ณ ๋ฌด์
NaN๊ณผNaN์ ๊ฐ๋ค๊ณ ํ๊ฐ- ์ดํฐ๋ฌ๋ธ,
for...of๋ฌธ ์ํใ ก์คํ๋ ๋ ๋ฌธ๋ฒ๊ณผ๋ฐฐ์ด ๋์คํธ๋ญ์ฒ๋งํ ๋น๊ฐ๋ฅ - ์์์ ์์์ ์๋ฏธ๋ฅผ ๊ฐ์ง ์์ง๋ง ์ํ ์ ์ถ๊ฐ๋ ์์๋๋ก ๋์ด = ๋ค๋ฅธ ์ดํฐ๋ฌ๋ธ์ ์ํ์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํจ
- ์ฐจ์ด์
| ๋ฉ์๋ | Set |
Map |
๋น๊ณ |
|---|---|---|---|
| ์์๊ฐ์ํ์ธ | size |
size |
|
| ์์ ์ถ๊ฐ | add |
set |
์ฐ์ํธ์ถ๊ฐ๋ฅ |
| ์กด์ฌ ์ฌ๋ถ ํ์ธ | has |
has |
|
| ์ญ์ | delete |
delete |
Set๋ง ์ฐ์ํธ์ถ๊ฐ๋ฅ |
| ์ทจ๋ | get |
๊ฐ ์์ฒด๋ฅผ ์ ์ฅํ๋ ์๋ฃ๊ตฌ์กฐ, ํน์ ๊ฐ์ ์กฐํํ๋ค. ex) key ์ ๋ง๋ value | |
| ์ผ๊ด์ญ์ | clear |
clear |
์ธ์ ๋ undefined ๋ฅผ ๋ฐํ |
| ์์ ์ํ | forEach |
forEach |