Skip to content

Latest commit

ย 

History

History
422 lines (293 loc) ยท 13 KB

File metadata and controls

422 lines (293 loc) ยท 13 KB

37์žฅ Set๊ณผ Map

37.2 Map

Map ๊ฐ์ฒด๋Š” ํ‚ค์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ปฌ๋ ‰์…˜์ด๋‹ค. Map ๊ฐ์ฒด๋Š” ๊ฐ์ฒด์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

๊ตฌ๋ถ„ ๊ฐ์ฒด Map ๊ฐ์ฒด
ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ๋ฌธ์ž์—ด ๋˜๋Š” ์‹ฌ๋ฒŒ ๊ฐ’ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๊ฐ’
์ดํ„ฐ๋Ÿฌ๋ธ” X O
์š”์†Œ ๊ฐœ์ˆ˜ ํ™•์ธ Object.keys(obj).length map.size

37.2.1 Map ๊ฐ์ฒด์˜ ์ƒ์„ฑ

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 object

Map ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์•„ Map ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋•Œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”์€ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ปโ“ const map2 ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

37-28

const map = new Map([['key1', 'value1'], ['key1', 'value2']]);
console.log(map); // Map(1) {"key1" => "value2"}

Map ์ƒ์„ฑ์ž ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ์ดํ„ฐ๋Ÿฌ๋ธ”์— ์ค‘๋ณต๋œ ํ‚ค๋ฅผ ๊ฐ–๋Š” ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๊ฐ’์ด ๋ฎ์–ด์จ์ง„๋‹ค. ๋”ฐ๋ผ์„œ Map ๊ฐ์ฒด์—๋Š” ์ค‘๋ณต๋œ ํ‚ค๋ฅผ ๊ฐ–๋Š” ์š”์†Œ๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์—†๋‹ค.


37.2.2 ์š”์†Œ ๊ฐœ์ˆ˜ ํ™•์ธ

37-29

const { size } = new Map([['key1', 'value1'], ['key2', 'value2']]);
console.log(size); // 2

Map ๊ฐ์ฒด์˜ ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ ํ™•์ธํ•  ๋•Œ๋Š” 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); // 2

size ํ”„๋กœํผํ‹ฐ๋Š” setter ํ•จ์ˆ˜ ์—†์ด getter ํ•จ์ˆ˜๋งŒ ์กด์žฌํ•˜๋Š” ์ ‘๊ทผ์ž ํ”„๋กœํผํ‹ฐ๋‹ค. setter ํ•จ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— size ํ”„๋กœํผํ‹ฐ์— ์ˆซ์ž๋ฅผ ํ• ๋‹นํ•˜์—ฌ Map ๊ฐ์ฒด์˜ ์š”์†Œ ๊ฐœ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

getter ํ•จ์ˆ˜ setter ํ•จ์ˆ˜
ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ๋•Œ ํ•ด๋‹น ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜ ํ”„๋กœํผํ‹ฐ์— ๊ฐ’์„ ํ• ๋‹นํ•  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜

37.2.3 ์š”์†Œ ์ถ”๊ฐ€

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.2.4 ์š”์†Œ ์ทจ๋“

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')); // undefined

Map ๊ฐ์ฒด์—์„œ ํŠน์ • ์š”์†Œ๋ฅผ ์ทจ๋“ํ•˜๋ ค๋ฉด Map.prototype.get ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. get ๋ฉ”์„œ๋“œ์˜ ์ธ์ˆ˜๋กœ ํ‚ค๋ฅผ ์ „๋‹ฌํ•˜๋ฉด Map ๊ฐ์ฒด์—์„œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ํ‚ค๋ฅผ ๊ฐ–๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. map.get ๋ฉ”์„œ๋“œ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํ‚ค๋ฅผ ์ „๋‹ฌํ•˜๋ฉด, ์ฆ‰ map.get('key')์™€ ๊ฐ™์ด ํ˜ธ์ถœํ•˜๋ฉด ํ•ด๋‹น ํ‚ค์— ๋Œ€ํ•œ ๊ฐ’์ด ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— undefined๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. Map ๊ฐ์ฒด์—์„œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ ํ‚ค๋ฅผ ๊ฐ–๋Š” ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ์˜ ๊ธฐ๋ณธ ๋ฐ˜ํ™˜๊ฐ’์ด๋‹ค.


37.2.5 ์š”์†Œ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ

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')); // false

Map ๊ฐ์ฒด์— ํŠน์ • ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด Map.prototype.has ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. has ๋ฉ”์„œ๋“œ๋Š” ํŠน์ • ์š”์†Œ์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

get ๋ฉ”์„œ๋“œ has ๋ฉ”์„œ๋“œ
ํŠน์ • ํ‚ค์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ ๋ฐ˜ํ™˜ ํŠน์ • ํ‚ค์˜ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ํ™•์ธ

37.2.6 ์š”์†Œ ์‚ญ์ œ

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 function

delete ๋ฉ”์„œ๋“œ๋Š” ์‚ญ์ œ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ set ๋ฉ”์„œ๋“œ์™€ ๋‹ฌ๋ฆฌ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์—†๋‹ค.


37.2.7 ์š”์†Œ ์ผ๊ด„ ์‚ญ์ œ

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.2.8 ์š”์†Œ ์ˆœํšŒ

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()

์š”์†Œ์˜ ์ˆœ์„œ์— ์˜๋ฏธ๋ฅผ ๊ฐ–์ง€ ์•Š์ง€๋งŒ ์ˆœํšŒํ•˜๋ฉด ์ถ”๊ฐ€๋œ ์ˆœ์„œ๋Œ€๋กœ ๋‚˜์˜จ๋‹ค. ์ด๋Š” ๋‹ค๋ฅธ ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ ์ˆœํšŒ์™€ ํ˜ธํ™˜์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.


์š”์•ฝ ์ •๋ฆฌ

Set (๋ฐฐ์—ด) ๊ณผ Map (๊ฐ์ฒด)
  • ๊ณตํ†ต์ 
    • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ, ์ƒ์„ฑ์ž ํ•จ์ˆ˜์— ์ธ์ˆ˜ ๋ฏธ์ „๋‹ฌ์‹œ ๋นˆ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ
    • 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