๐Ÿง‘๐Ÿป‍๐Ÿ’ป ๊ฐœ๋ฐœ๊ฐœ๋ฐœ/javascript

Spread/Rest ๋ฌธ๋ฒ•, ๊ตฌ์กฐ๋ถ„ํ•ด

Seungjae Lee 2021. 5. 31. 09:15

Spread ๋ฌธ๋ฒ•

์ฃผ๋กœ ๋ฐฐ์—ด์„ ํ’€์–ด์„œ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, ๋ฐฐ์—ด์„ ํ’€์–ด์„œ ๊ฐ๊ฐ์˜ ์š”์†Œ๋กœ ๋„ฃ์„ ๋•Œ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

function sum(x, y, z) {
	return x + y + z; 
} 

const numbers = [1, 2, 3];

sum(...numbers) 

// ์งˆ๋ฌธ: ์–ด๋–ค ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋‚˜์š”? 6

Rest ๋ฌธ๋ฒ•

ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ๋ฐ›์•„์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ€๋ณ€์ ์ผ ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

function sum(...theArgs) {
	return theArgs.reduce((previous, current) => {
		return previous + current;
        }); 
} 

sum(1,2,3) 
// ์งˆ๋ฌธ: ์–ด๋–ค ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋‚˜์š”? 6

sum(1,2,3,4) 
// ์งˆ๋ฌธ: ์–ด๋–ค ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋‚˜์š”? 10

๋ฐฐ์—ด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

Spread ๋ฌธ๋ฒ•์€ ๋ฐฐ์—ด์—์„œ ๊ฐ•๋ ฅํ•œ ํž˜์„ ๋ฐœํœ˜ํ•ฉ๋‹ˆ๋‹ค.

1. ๋ฐฐ์—ด ํ•ฉ์น˜๊ธฐ

let parts = ['shoulders', 'knees'];
let lyrics = ['head', ...parts, 'and', 'toes'];

// ์งˆ๋ฌธ: lyrics์˜ ๊ฐ’์€ ๋ฌด์—‡์ธ๊ฐ€์š”? ["head", "shoulders", "knees", "and", "toes"]


let arr1 = [0, 1, 2];
let arr2 = [3, 4, 5];
arr1 = [...arr1, ...arr2]; 
// ์ฐธ๊ณ : spread ๋ฌธ๋ฒ•์€ ๊ธฐ์กด ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ(immutable),arr1์˜ ๊ฐ’์„ ๋ฐ”๊พธ๋ ค๋ฉด ์ƒˆ๋กญ๊ฒŒ ํ• ๋‹นํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 

// ์งˆ๋ฌธ: arr1์˜ ๊ฐ’์€ ๋ฌด์—‡์ธ๊ฐ€์š”? [0, 1, 2, 3, 4, 5] 

2. ๋ฐฐ์—ด ๋ณต์‚ฌ

let arr = [1, 2, 3];
let arr2 = [...arr]; // arr.slice() ์™€ ์œ ์‚ฌ
arr2.push(4); 
// ์ฐธ๊ณ : spread ๋ฌธ๋ฒ•์€ ๊ธฐ์กด ๋ฐฐ์—ด์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ(immutable), arr2๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค๊ณ , arr์ด ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. 

// ์งˆ๋ฌธ: arr์™€ arr2์˜ ๊ฐ’์€ ๊ฐ๊ฐ ๋ฌด์—‡์ธ๊ฐ€์š”?
	//arr์€ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Œ€๋กœ [1, 2, 3]์ด๊ณ 
	//arr2 ์€ [1, 2, 3, 4] ์ด ๋จ

๊ฐ์ฒด์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ

let obj1 = { foo: 'bar', x: 42 }; 
let obj2 = { foo: 'baz', y: 13 }; 
let clonedObj = { ...obj1 }; 
let mergedObj = { ...obj1, ...obj2 }; 

// ์งˆ๋ฌธ: clonedObj์™€ mergedObj์˜ ๊ฐ’์€ ๊ฐ๊ฐ ๋ฌด์—‡์ธ๊ฐ€์š”?
//clonedObj
//{foo: "bar", x: 42}
//mergedObj
//{foo: "baz", x: 42, y: 13}

ํ•จ์ˆ˜์—์„œ ๋‚˜๋จธ์ง€ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ›์•„์˜ค๊ธฐ

function myFun(a, b, ...manyMoreArgs) { 
	console.log("a", a); 
    console.log("b", b);
    console.log("manyMoreArgs", manyMoreArgs); 
} 

myFun("one", "two", "three", "four", "five", "six"); 

// ์งˆ๋ฌธ: ์ฝ˜์†”์€ ์ˆœ์„œ๋Œ€๋กœ ์–ด๋–ป๊ฒŒ ์ฐํž๊นŒ์š”?
// a one
// b two
// manyMoreArgs ["three", "four", "five", "six"]

 

๊ตฌ์กฐ ๋ถ„ํ•ด (Destructing)

๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์€ Spread ๋ฌธ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ๊ฐ’์„ ํ•ด์ฒดํ•œ ํ›„, ๊ฐœ๋ณ„ ๊ฐ’์„ ๋ณ€์ˆ˜์— ์ƒˆ๋กœ ํ• ๋‹นํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

๋ถ„ํ•ด ํ›„ ์ƒˆ ๋ณ€์ˆ˜์— ํ• ๋‹น

๋ฐฐ์—ด

const [a, b, ...rest] = [10, 20, 30, 40, 50]; 
// ์งˆ๋ฌธ: a, b, rest๋Š” ๊ฐ๊ฐ ์–ด๋–ค ๊ฐ’์ธ๊ฐ€์š”?

//rest
//[30, 40, 50]

๊ฐ์ฒด

const {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40} 

// ์งˆ๋ฌธ: a, b, rest๋Š” ๊ฐ๊ฐ ์–ด๋–ค ๊ฐ’์ธ๊ฐ€์š”?
//rest
//{c: 30, d: 40}
  • ๊ฐ์ฒด์—์„œ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ์„ ์–ธ(const, let, var)๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ ์–ธ์—†์ด ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ, ์ด ์ฝ˜ํ…์ธ ์˜ ํ•˜๋‹จ์žˆ๋Š” ๊ณต์‹๋ฌธ์„œ ๋งํฌ๋ฅผ ํ†ตํ•ด ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ์šฉํ•œ ์˜ˆ์ œ: ํ•จ์ˆ˜์—์„œ ๊ฐ์ฒด ๋ถ„ํ•ด

function whois({displayName: displayName, fullName: {firstName: name}}){
	console.log(displayName + " is " + name);
} 

let user = { 
	id: 42,
    displayName: "jdoe",
    fullName: { 
    	firstName: "John",
        lastName: "Doe"
	} 
}; 

whois(user) 
// ์งˆ๋ฌธ: ์ฝ˜์†”์—์„œ ์–ด๋–ป๊ฒŒ ์ถœ๋ ฅ๋ ๊นŒ์š”?
//jdoe is John