์คํ๋ ๋ ๋ ์คํธ ์ฐ์ฐ์ ( Spread & Rest Operators ) ( ... )
์คํ๋ ๋ ์ฐ์ฐ์(Spread)

Spread( ํผ์น๋ค, ํผ๋จ๋ฆฌ๋ค )๋ผ๋ ๋จ์ด๋ต๊ฒ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด๋ฅผ ํผ์ณ ๋์ต๋๋ค
์๋ฅผ ๋ค์ด oldArray๊ฐ ์๋๋ฐ ์ด oldArray๋ฐฐ์ด์ ์๋ ๋ชจ๋ ์์๋ค์ ์๋ก์ด ๋ฐฐ์ด์ ์ถ๊ฐํ๊ณ
๊ทธ๋ฆฌ๊ณ ๊ฑฐ๊ธฐ์ ์์ 4๋ฅผ ๋ ์ถ๊ฐํ๊ณ ์ถ๋ค๋ฉด, ์๋์ ๊ฐ์ด ์ฌ์ฉํฉ๋๋ค.
// ๋ฐฐ์ด
const numbers = [1, 2, 3];
const newNumbers = [...numbers, 4];
console.log(newNumbers);
//๊ฒฐ๊ณผ
--> [ 1, 2, 3, 4]
์์ฃผ ์ฝ๊ฒ ๋ฐฐ์ด์ ๋ณต์ฌํ๊ฑฐ๋, ์์ ํ๊ฒ ์ด์ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํด์ ์๋์ ๊ฐ์ด ๊ฐ์ฒด์
ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค.๐๐ปโโ๏ธ
// ๊ฐ์ฒด
const person = {
name: 'Max'
};
const newPerson = {
...person,
age: 28
}
console.log(newPerson);
--> [object Object] {
age: 28,
name: "Max"
}
๋ ์คํธ ์ฐ์ฐ์(Rest)
๋ ์คํธ(Rest) ์ฐ์ฐ์๋ ์ฝ๊ฒ ์ค๋ช ํ์๋ฉด ํจ์์ ์ ๋ฌ๋ ๋ฌดํ ๊ฐ์์ ์ธ์๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒฝ์ฐ์ ๋๋ค.
์ธ์๋ฅผ ๋ฐ์๋ค์ฌ ๊ทธ ์ธ์๋ฅผ ์ธ์ํ๋ ํจ์์ ์๋ฅผ ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ , ์ธ์(arguments)๊ฐ ํ๋๋ผ๋ฉด?๐๐ป
const rest = (a) =>{
console.log(a)
}
rest(2)
---> 2
์ด๋ ๊ฒ ์ธ์๊ฐ์ ๋ฐ์ ์ฒ๋ฆฌํ์ฌ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก ์ฝ์์ 2๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ ๋๋ค.
๋๋ฒ์งธ๋ก ์ธ์(arguments)๊ฐ ๋๊ฐ๋ผ๋ฉด?๐๐ป
const rest = (a, b) =>{
console.log(a)
console.log(b)
console.log(a, b)
}
rest(2,5)
---> 2
---> 5
---> 2 5
์ด๋ฐ์์ผ๋ก ์ฒ๋ฆฌ ๋ ๊ฒ์ ๋๋ค.
์ด์ N ๊ฐ์ ์ธ์๋ฅผ ์ฒ๋ฆฌํ๊ณ ์ถ์๋ ์ฌ์ฉํ๋ ๊ฒ์ด Rest ์ฐ์ฐ์์ธ๋ฐ {...}์ ์ฌ์ฉํ์ฌ ์ ๋ฌ๋ ์ ๋ ฅ๊ฐ์ ๋ฐฐ์ด๋ก ๊ทธ๋ฃนํํฉ๋๋ค.
const filter = (...args) => {
return args.filter(el => el ===1);
}
console.log(filter(1,2,3));
--> [1]
console.log(filter(2,3));
--> []
console.log(filter(2,3,1));
--> [1]
์์ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๋ถ๋ถ์ (...args)๋ฅผ ๋ฃ์ด ํํฐ๋ฅผ ํตํด ์ฐ์ฐ์ ์ํํ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณผ ์์์ต๋๋ค.๐ฉ๐ปโ๐ป๐
๋ฐฐ์ด ๋ฉ์๋๋ฅผ filter()์ฒ๋ผ ์ฌ์ฉํ ์ ์๊ณ , filter๋ ๋ฐฐ์ด์์ ์ ๋ฌ๋๋ ๋ชจ๋ ์์๋ค์ ๋ํด ํจ์๋ฅผ ์คํํฉ๋๋ค๊ทธ๋์ ์์๋ฅผ ์ ๋ฌํ๊ณ ํ์ดํ ํจ์๋ฅผ ์ฌ์ฉํด์ ์์๊ฐ 1๊ณผ ๊ฐ์์ง, ์๋์ง๋ฅผtrue๋ false๋ก๋ฐํํฉ๋๋ค
์ธ์์ ํ๋ผ๋ฏธํฐ๊ฐ ํท๊ฐ๋ฆฐ๋ค๋ฉด?!
const rest(a) { // ์ฌ๊ธฐ์ a ๋ ํ๋ผ๋ฏธํฐ
console.log(a); // ์ฌ๊ธฐ์ a ๋ ์ธ์
}
rest('arguments'); // ์ฌ๊ธฐ์ 'hello world' ๋ ์ธ์
Spread์ Rest๋ฅผ ์์ฐ๋ฉด ์๋์ ๊ฐ์ ์์ฉ๋ ํ ์ ์๋ค.
const rest = (...args) => {
return args.filter(el => el === 1);
}
const num = [1, 2, 3, 4, 5, 6];
const result = rest(...num);
console.log(result);
๊ตฌ์กฐ๋ถํดํ ๋น( Destructuring )
์คํ๋ ๋๋ ๋ชจ๋ ์์์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ ธ์์ ์ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด ๋๋ ์ฌ๋ฌ๋ถ์ด ์ฌ์ฉํ๋์ด๋ค ๊ฒ์ ์ ๋ฌํฉ๋๋ค.
ํ์ง๋ง ๊ตฌ์กฐ๋ถํด ํ ๋น์ ์์๋ ํ๋กํผํฐ๋ฅผ ํ๋์ฉ๋ง ๊ฐ์ ธ์์ ๋ณ์์ ์ ์ฅํฉ๋๋ค,
๋ฐฐ์ด๊ณผ ๊ฐ์ฒด๋ฅผ ์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
const numbers = [1,2,3];
[num1, num2] = numbers;
console.log(num1,num2);
--> 1,
2
const numbers = [1,2,3];
[num1, ,num3] = numbers; //[num1, ,num2] = numbers; ๋ณ์์ด๋ฆ์ ์๊ด์์
console.log(num1,num2);
-->1,
3
๊ฐ์ฒด๋ํ ๊ฐ๋ค
cosnt numbers = {a: 42, b: true};
var {a, b} = numbers;
console.log(a); // 42
console.log(b); // true
๋ฐฐ์ด์์ ํน์ ์์๋ ๊ฐ์ฒด์์ ํน์ ์์ฑ์ ์ถ์ถํ๋ ํธํ ๋ฐฉ๋ฒ์ด ์๋ค๋ ๊ฒ์ ์ ๊ธฐ์ตํ์!!
Spread & Rest
์ฐธ์กฐํ ๋ฐ ์์ํ ๋ฐ์ดํฐ ํ์
const number = 1;
const num2 = number;
console.log(num2)
---> 1
๋ง์ฝ ์ด๋ฐ ์์ผ๋ก number๋ฅผ ์์ฑํ๋ค๋ฉด, ์ด๊ฒ์ ๊ธฐ๋ณธํ์ ๋๋ค
์ด ๋ง์ ์ค์ ๋ก number์ ๋ณต์ฌ๋ณธ์ ์์ฑํ๋ค๋ ๊ฒ์ด๊ณ ๊ทธ๊ฒ์ด num2์ ๋๋ค
number, string, boolean ์ด๋ฐ ๊ฒ๋ค์ ๋ชจ๋ ๊ธฐ๋ณธํ ์๋ฃ ํ์ ์ด๊ณ , ์ฌํ ๋นํ๊ฑฐ๋ ๋ณ์๋ฅผ
๋ค๋ฅธ ๋ณ์์ ์ ์ฅํ ๋๋ง๋ค ๊ฐ์ ๋ณต์ฌํฉ๋๋ค,
๊ฐ์ฒด์ ๋ฐฐ์ด์ ์ฐธ์กฐํ ์๋ฃ ํ์ ์ ๋๋ค๋ฌด์จ ๋ป์ธ์ง ํ๋ฒ ๋ณด์ฌ ๋๋ฆด๊ป์
const person = {
name: 'Max'
};
const secondPerson = person;
console.log(secondPerson);
--> [object Object] {
name: "Max"
}
๊ฐ์ฒด person์ ์์ฑํ๊ณ name ํ๋กํผํฐ๋ฅผ ๊ฐ์ต๋๋ค, ๊ทธ๋ฐ ๋ค์ secondPerson์ ์์ฑํ ๋ค์ ๊ฐ์ผ๋ก person์
ํ ๋นํฉ๋๋ค ์ฝ์ ์ถ๋ ฅํจ์์ secondPerson์์ ๋ฌํ๊ณ ์คํํ๋ฉด ์ฒซ ๋ฒ์งธ person๊ณผ ๊ฐ์ ๊ฐ์ ์ถ๋ ฅํ๋๋ฐ,
์ฌ์ค ๊ฐ์ฒด person์ ๋ณต์ฌํ ๊ฒ์ ์๋๊ณ ,
๊ฐ์ฒด person์ ( ๐๐ป { name : 'Max' } ๋ถ๋ถ ) ์ค์ ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋์ด ์๊ณ
์์ person ( ๐๐ป const person = )์๋ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ ํฌ์ธํฐ๋ฅผ ์ ์ฅํฉ๋๋ค
๊ทธ๋์ person์ secondPerson์ ํ ๋นํ๋ฉด ํฌ์ธํฐ๊ฐ ๋ณต์ฌ๋ ๊ฒ์ ๋๋ค.
const person = {
name: 'Max'
};
const secondPerson = person;
person.name = 'Menu';
console.log(secondPerson);
-->[object Object] {
name: "Menu"
}
๋ง์ฝ ๋ณต์ฌ๋ ๊ฒ์ person.name์ Menu๋ก ๋ฐ๊พผ๋ค๋ฉด
์ฌ์ ํMax๊ฐ ์ถ๋ ฅ๋ ๊ฑฐ๋ผ๊ณ ์ฐฉ๊ฐํ๋๋ฐ, person์ ๋ณต์ฌํด์ secondPerson์ ์ ์ฅํ๊ธฐ ๋๋ฌธ์
์ด๋ฆ์ด ๋ฐ๋ ๊ฑฐ๋ผ ์๊ฐํฉ๋๋ค
ํ์ง๋ง ์ฝ๋๋ฅผ ์คํํด ๋ณด๋ฉด name์ Menu๊ฐ
์ถ๋ ฅ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค, ์ฌ์ง์ด ์ ๋ secondPerson์ ์ถ๋ ฅํ๋๋ฐ๋ ๋ง์ด์์,
๊ทธ๋์ secondPerson์ ์ด๋ฆ๋ ๋ฐ๋์๋๋ฐ, ๊ทธ ์ด์ ๋ ๋จ์ง ํฌ์ธํฐ๋ฅผ ๋ณต์ฌํ๊ณ person์ด ๊ฐ๋ฆฌํค๋ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋์ผํ ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์
๋๋ค๐๐ป๐๐ป
๋ง์ฝ ๊ฐ์ฒด๋ ๋ฐฐ์ด์ ์ด๋ ๊ฒ ๋ณต์ฌํ๋ค๋ฉด, ํ ์ฑ์ ์๋ ์ฃผ์์์ ๊ฐ์ฒด๋ฅผ ์กฐ์ํ ์๋ ์๊ธฐ ๋๋ฌธ์ ๋๋ค
๊ทธ๋ฆฌ๊ณ ์ค์๋ก ์ฑ์ ๋ค๋ฅธ ์ฃผ์์ ์๋ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๋ค๋ฅด๊ฒ ์ฌ์ฉํ๋๋ก ์กฐ์ํ ์๋ ์์ต๋๋ค
๊ทธ๋์ "๋ณ๊ฒฝํ ์ ์๋ ๋ฐฉ๋ฒ" ์ผ๋ก ๋ณต์ฌํ๋ ๋ฒ์ ์๋์์ ๋ฐฐ์ฐ๊ฒ ์ต๋๋ค,
์ด ๋ง์ํฌ์ธํฐ๊ฐ ์๋ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ธ๋ฐ ์คํ๋ ๋ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค
const person = {
name: 'Max'
};
const secondPerson = {
...person
};
person.name = 'Menu';
console.log(secondPerson);
-->
[object Object] {
name: "Max"
}// menu๋ก ๋ฐ๊ฟจ๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ
์, ์์ ์ฝ๋์์ ๋ณด๋ฏ ์ด์ ์ฌ๊ธฐ์ person ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ํ๋กํผํฐ( name: 'Max' )๋ฅผ ์คํ๋ ๋(...person) ํ๊ฒ ์ต๋๋ค ๊ทธ๋ฌ๋ฉด person๊ฐ์ฒด๋ก๋ถํฐ ํ๋กํผํฐ์ ํ๋กํผํฐ์ ๊ฐ์ ๊ฐ์ ธ์์ ์๋ก ์์ฑํ ๊ฐ์ฒด์ ์ถ๊ฐํ๋๋ฐ,
์ค๊ดํธ๋ฅผ ์จ์ ์์ฑํ ์ ์์ต๋๋ค const secondPerson = { ...person };
์ด์ ์ฝ์ ์ถ๋ ฅ ํจ์๋ก secondPersond์ ์ถ๋ ฅํด๋ ๊ฐ์ด ๋ฐ๋์ง ์์ต๋๋ค
ํฌ์ธํฐ๊ฐ ์๋ ์ง์ง ๋ณต์ฌ๋ณธ์ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๐ค๐ป๊ฐ์ฒด์ ๋ฐฐ์ด์ด ์ฐธ์กฐํ ์๋ฃ ํ์ ์ด๋ผ๋ ๊ฒ์ ๊ผญ ๊ธฐ์ตํด ๋์ธ์
๋ง์ฝ ์ฌํ ๋นํ๋ค๋ฉด, ๊ฐ์ด ์๋ ํฌ์ธํฐ๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ด๊ณ
๊ทธ๋์ ์ง์ง๋ก ๋ณต์ฌํ๊ณ ์ถ๋ค๋ฉด, ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํด์ ์ ์ฒด ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์ด ์๋๋ผ
ํ๋กํผํฐ๋ฅผ ๋ณต์ฌํด์ผ ํฉ๋๋ค