๐ 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}