๐ Chapter 2 : ๋ฐฐ์ด๋ก ๋ฐ์ดํฐ ์ปฌ๋ ์ ์ ๊ด๋ฆฌํ๋ผ.
๐ฏ ๋ฐฐ์ด๋ก ์ ์ฐํ ์ปฌ๋ ์ ์ ์์ฑํ๋ผ.โ
- ๋ฐ์ดํฐ ์ปฌ๋ ์
์ ๋ค๋ฃจ๋ ๊ตฌ์กฐ๋ก
Map
,Set
,WeakMap
, ๊ฐ์ฒด, ๋ฐฐ์ด์ ์ฌ์ฉํ ์ ์๋ค. - ๋ฐฐ์ด์ ์ฌ๊ธฐ์ ๊ธฐ ์ด๋์๋ ๋ฑ์ฅํ๋๋ฐ, ๋ฐฐ์ด์ ์ดํฐ๋ฌ๋ธ(iterable) ์ด ๋ด์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. (
Iterator
์Generator
) iterable
์ ๊ฐ๋จํ ๋งํด ์ปฌ๋ ์ ์ ํ์ฌ ์์น๋ฅผ ์๊ณ ์๋ ์ํ์์ ์ปฌ๋ ์ ์ ํญ๋ชฉ์ ํ ๋ฒ์ ํ๋์ฉ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.String
,Array
,TypedArray
,Map
๋ฐSet
์ ๋ชจ๋ ๋ด์ฅ ๋ฐ๋ณต ๊ฐ๋ฅ ๊ฐ์ฒด์ด๋ค. ๊ทธ๋ค์ ํ๋กํ ํ์ ๊ฐ์ฒด๊ฐ ๋ชจ๋Symbol.iterator
๋ฉ์๋๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.- ์ปฌ๋ ์ ๊ฐ๋ ์ ๊ฑฐ์ ๋๋ถ๋ถ์ ๋ฐฐ์ด ํํ๋ก ํํํ ์ ์๋ค. ์ฆ, ๋ฐฐ์ด์ ํน๋ณํ ์ปฌ๋ ์ ์ผ๋ก ์ฝ๊ฒ ๋ณํํ๊ฑฐ๋ ๋ค์ ๋ฐฐ์ด๋ก ๋ง๋ค ์ ์๋ค.
- ํค-๊ฐ ์์ ์ฌ์ฉํด ๋งต ๊ฐ์ฒด์ ๋ฐฐ์ด ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ณํํ ์ ์๋๋ฐ TC39 ์์ํ์์
Object.entries()
๋ฅผ ์ด์ฉํด์ ๊ฐ์ฒด๋ฅผ ํค-๊ฐ ์ ๋ฐฐ์ด๋ก ๋ณํํ๋ ๋ช ์ธ๋ฅผ ํ์ ํ๋ค.(ES2017)
๐ฏ Includes()๋ก ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ผ.โ
includes
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐฐ์ด์ ์๋ ๊ฐ์ ์์น๋ฅผ ํ์ธํ์ง ์๊ณ ๋ ์กด์ฌ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค.- ์๋ ์์ ์ ๊ฐ์ด ํน์ ๋ฌธ์์ด์ ํฌํจํ๊ณ ์๋์ง ํ์ธํ๋ ค๋ฉด ๋ฌธ์์ด์ ์์น๋ฅผ ์ฐพ์์ผ ํ๋ค.
const sections = ['contact','shipping'];
function displayShipping(sections){
return sections.indexOf('shipping') > -1;
}
// true
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ES2016์์ ์ถ๊ฐ๋
includes
๋ฅผ ์ฌ์ฉํ์ฌ ๋ฒ๊ฑฐ๋ก์ด ๋น๊ต ์ ์ฐจ๋ฅผ ์๋ตํ ์ ์๋ค. includes
๋ผ๋ ๋ฐฐ์ด ๋ฉ์๋๋ฅผ ์ด์ฉํ๋ฉด ๊ฐ์ด ๋ฐฐ์ด์ ์กด์ฌํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ธํด์ boolean๊ฐ์ผ๋กtrue
๋๋false
๋ฅผ ๋ฐํํ๋ค.
const sections = ['contact','shipping'];
function displayShipping(sections){
return sections.includes('shipping');
}
// true
๐ฏ ํผ์นจ ์ฐ์ฐ์๋ก ๋ฐฐ์ด์ ๋ณธ๋ ๋ผ.โ
- ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ๋ง์ ์ ์ฐ์ฑ์ ์ ๊ณตํ์ง๋ง ๋ฐฐ์ด์๋ ์๋ง์ ๋ฉ์๋๊ฐ ์์ผ๋ฏ๋ก ํผ๋์ค๋ฝ๊ฑฐ๋ ์กฐ์๊ณผ ๋ถ์ ํจ๊ณผ(side effect)๋ก ์ธํ ๋ฌธ์ ์ ๋ง๋ฅ๋จ๋ฆด ์ ์๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํผ์นจ ์ฐ์ฐ์(Spread syntax)๋ฅผ ์ฌ์ฉํ์ฌ ์ต์ํ์ ์ฝ๋๋ก ๋ฐฐ์ด์ ๋น ๋ฅด๊ฒ ์์ฑํ๊ณ ์กฐ์ํ ์ ์๋ค.
- ํผ์นจ ์ฐ์ฐ์๋ ๋ฐฐ์ด์๋ง ๊ตญํ๋์ง ์๊ณ ๋งต ์ปฌ๋ ์ ์์๋ ์ฌ์ฉ ๊ฐ๋ฅํ๊ณ ํจ์์์๋ ํผ์นจ ์ฐ์ฐ์์ ๋ค๋ฅธ ํํ์ธ ๋๋จธ์ง ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
- ๋ํ, ํผ์นจ ์ฐ์ฐ์๋ ์ ๋๋ ์ดํฐ๋ฅผ ์ด์ฉํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ ํด๋์ค ์์ฑ์๋ ์ฌ์ฉํ ์ ์๋ค.
- ํผ์นจ ์ฐ์ฐ์๋ ๋จ๋ ์ผ๋ก ์ฌ์ฉํ ์๋ ์๋ค. ์ ๋ณด๋ฅผ ์ด๋๋ ํผ์ณ ๋ฃ์ด์ผ ํ๋ค.
const cart = ['My Name is SeungMin', 'Helloooooo'];
...cart // error
const copyCart = [...cart]; // ['My Name is SeungMin', 'Helloooooo']
- ๋ค์ ์์๋ ๋ฐฐ์ด์์ ํญ๋ชฉ์ ์ ๊ฑฐํ๋ ค๊ณ ํ ๋ ๋ฐ๋ณต๋ฌธ๋ง ์ฌ์ฉํ ๊ฒ์ด๋ค.
function removeItem(items, removable){
const updated = [];
for(let i = 0; i < items.length; i++){
if(items[i] !== removable){
updated.push(items[i]);
}
}
return updated;
}
- ์ ์ฝ๋๋ ๋ฐ๋ณต๋ฌธ์ด ๋์ด๋๊ณ ์ด์์ ํด์ง์๋ก ์ฝ๋๋ฅผ ์ฝ๊ณ ์ดํดํ๊ธฐ๊ฐ ์ด๋ ค์์ง๋ค.
splice()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ฑฐํ ์ ์๋ค.
function removeItem(items, removable){
const index = items.indexOf(removable);
items.splice(index, 1);
return items;
}
- ํ์ง๋ง
splice()
๋ฉ์๋๋ ์๋ณธ ๋ฐฐ์ด์ ์กฐ์ํ๋ค. - ์๋ณธ ๋ฐฐ์ด์ ์กฐ์ํ๋ ์์ ์ ์ํํ๋ฐ ํนํ ํจ์์์ ์ฌ์ฉํ ๋ ์ํํ๋ค.
- ํจ์์ ์ ๋ฌํ๋ ์ ๋ณด๊ฐ ๊ทผ๋ณธ์ ์ผ๋ก ๋ฌ๋ผ์ง๋ ๊ฒ์ ์์ธกํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๋ณธ ๋ฐฐ์ด์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ฐฐ์ด์ ์ผ๋ถ๋ฅผ ๋ฐํํ๋
slice()
๋ฅผ ์ฌ์ฉํ๋ค.
function removeItem(items, removable){
const index = items.indexOf(removable);
return items.slice(0, index).concat(items.slice(index + 1));
}
- ์ ๋ฐฉ๋ฒ๋ ๋ฌด์์ด ๋ฐํ๋๋์ง ์ ํํ์ง ์๋ค.
- ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋ณผ ๋
concat()
์ผ๋ก ๋ฐฐ์ด ๋ ๊ฐ๋ฅผ ๋ณํฉํด์ ๋ฐฐ์ด ํ๋๋ฅผ ์์ฑํ๋ค๋ ์ฌ์ค์ ์ดํดํด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค. - ์ด๋ฐ ๊ณณ์์ ํผ์นจ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ
slice()
๋ฉ์๋์ ํจ๊ป ์ฌ์ฉํ๋ฉด ํ์ ๋ฐฐ์ด์ ๋ชฉ๋ก์ผ๋ก ๋ณํํด ๋๊ดํธ ์์ ์์ฑํ ์ ์๋ค.
function removeItem(items, removable){
const index = items.indexOf(removable);
return [...items.slice(0, index), ...items.slice(index + 1)];
}
- ์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์๋ณธ ๋ฐฐ์ด์ ์กฐ์ํ์ง๋ ์๊ณ , ์ฝ๊ธฐ ์ฝ๊ณ ๊ฐ๊ฒฐํ ๋ฟ ์๋๋ผ ์ฌ์ฌ์ฉํ ์ ์์ผ๋ฉฐ ์์ธก ๊ฐ๋ฅํ๋ค.
- ์๋๋ฅผ ๊ฐ์ฅ ์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ ํํ์.
- ํจ์์ ์ธ์ ๋ชฉ๋ก์ ์์ฑํ ๋ ํผ์นจ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
const book = ['์ด๋ฆฐ์์','์ํ
์ฅํ๋ฆฌ',20000];
function formatBook(title, author, price){
return `${title} by ${author} ${price}์`;
}
// ๊ธฐ์กด ์ฌ์ฉ ๋ฐฉ๋ฒ
formatBook(book[0], book[1], book[2]);
// ํผ์นจ ์ฐ์ฐ์ ์ฌ์ฉ
formatBook(...book);
๐ฏ push() ๋ฉ์๋ ๋์ ํผ์นจ ์ฐ์ฐ์๋ก ์๋ณธ ๋ณ๊ฒฝ์ ํผํด๋ผ.โ
- ํผ์นจ ์ฐ์ฐ์๋ก ์๋ก์ด ๋ฐฐ์ด์ ์์ฑํด ๋ฐฐ์ด์ ๋ํ ์กฐ์์ ํผํ์.
push()
๋ฉ์๋๋ ์๋ก์ด ํญ๋ชฉ์ ๋ฐฐ์ด ๋ค์ ์ถ๊ฐํด ์๋ณธ ๋ฐฐ์ด์ ๋ณ๊ฒฝํ๊ธฐ ๋๋ฌธ์ ์ข์ง ๋ชปํ๋ค.
const reward = {
name: 'The Little Prince',
discount: true,
price: 0,
}
function addFreeGift(cart){
if(cart.length > 2){
cart.push(reward);
return cart;
}
return cart;
}
function summarizeCart(cart){
const discountable = cart.filter(item => item.discount);
if(discountable.length > 1){
return {
error: 'ํ ์ธ ์ํ์ ํ๋๋ง ์ฃผ๋ฌธํ ์ ์์ต๋๋ค.',
};
}
const cartWithReward = addFreeGift(cart);
return {
discount: discountable.length,
items: cartWithReward.length,
cart: cartWithReward,
};
}
- ํจ์๋ฅผ ํธ์ถํ ๋๋ ํจ์์ ์ ๋ฌํ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์์ ๊ฒ์ด๋ผ๋ ์ ๋ขฐ๊ฐ ํ์ํ๋ฐ ๋ถ์ ํจ๊ณผ๊ฐ ์๋ ํจ์๋ฅผ ์์ ํจ์(pure function)๋ผ๊ณ ํ๋ค.
- ์ ์ฝ๋์์ ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ๋ค๋ฃฐ ๋ ์๋ณธ ๊ฐ์ด ๋ณ๊ฒฝ๋์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ง ๋ชปํ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํผ์นจ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ค.
// ...
function addFreeGift(cart){
if(cart.length > 2){
return [...cart, reward];
}
return cart;
}
// ...
- ์ถ๊ฐ์ ์ผ๋ก ํผ์นจ ์ฐ์ฐ์๋ก ๋ฐฐ์ด์ ํญ๋ชฉ์ ์ถ๊ฐํ๊ณ ์ฌ๋ณธ์ ๋ง๋๋ ๋ฐฉ๋ฒ
// shift๋ฅผ ์ฌ์ฉํ ์๋ณธ ์กฐ์
const titles = ['Little Prince', 'Javascript'];
titles.shift('React');
// ํผ์นจ ์ฐ์ฐ์
const titles = ['Little Prince', 'Javascript'];
const addTitles = ['React', ...titles];
// slice๋ฅผ ์ฌ์ฉํ ๋ณต์ฌ
const toCopy = ['Little Prince', 'Javascript'];
const copied = toCopy.slice();
// ํผ์นจ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ๋ณต์ฌ
const toCopy = ['Little Prince', 'Javascript'];
const copied = [...toCopy];
๐ฏ ํผ์นจ ์ฐ์ฐ์๋ก ์ ๋ ฌ์ ์ํ ํผ๋์ ํผํ๋ผ.โ
- ํผ์นจ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ์ ๋ ฌํ๋ฉด ์ฌ๋ฌ ๋ฒ ์ ๋ ฌํด๋ ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ํ ์ ์๋ค.
- ์๋์ ๊ฐ์ฒด๊ฐ ๋ด๊ธด ๋ฐฐ์ด์ ์ ๋ ฌํด ๋ณด์.
const family = [
{ name: 'Joe', years: 10 },
{ name: 'Theo', years: 5 },
{ name: 'Dyan', years: 10 },
];
sort()
๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ซ์ ์ ๋ ฌ๊ณผ ๋ฌธ์ ์ ๋ ฌ์ ์ํด ํจ์๋ฅผ ์์ฑํ์.
function sortByYears(a, b){
if(a.years === b.years){
return 0;
}
return a.years - b.years;
}
const sortByName = (a, b) => {
if(a.name === b.name){
return 0;
}
return a.name > b.name ? 1 : -1;
};
- ๋์ด์์ผ๋ก ์ ๋ ฌ์ ์๋์ ๊ฐ๋ค.
family.sort(sortByYears);
// {name: "Theo", years: 5}
// {name: "Joe", years: 10}
// {name: "Dyan", years: 10}
- ์ ๋ ฌ๋
family
๋ฅผ ์ด๋ฆ์์ผ๋ก ์ ๋ ฌํด ๋ณด์.
family.sort(sortByName);
// {name: "Dyan", years: 10}
// {name: "Joe", years: 10}
// {name: "Theo", years: 5}
- ๋ค์ ์ ๋ ฌ๋
family
๋ฅผ ๋์ด์์ผ๋ก ์ ๋ ฌํด ๋ณด๋ฉด ์ฒ์ ๋์ด์์ผ๋ก ์ ๋ ฌํ ๊ฒฐ๊ณผ์ ์ ํ ๋ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋์ค๊ฒ ๋๋ค.
family.sort(sortByYears);
// {name: "Theo", years: 5}
// {name: "Dyan", years: 10}
// {name: "Joe", years: 10}
- ์ด๋ ๋ฏ ๋งค๋ฒ ์์๊ฐ ๋ฐ๋๋ค๋ฉด ์ฌ์ฉ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ขฐํ์ง ๋ชปํ ๊ฒ์ด๊ณ ์ฐ๋ฆฌ๊ฐ ์ํ ๊ฒฐ๊ณผ๋ ์๋๋ค.
- ์ด๋ฐ ๊ฒฝ์ฐ ์๋ณธ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ์ง ์๊ณ ์ฌ๋ณธ์ ์ฌ์ฉํด ์กฐ์ํ๋ฉด ํด๊ฒฐํ ์ ์๋ค.
[...family].sort(sortByYears);
// {name: "Theo", years: 5}
// {name: "Joe", years: 10}
// {name: "Dyan", years: 10}