TIL - 21.07.02 ๐Ÿ‘จโ€๐Ÿ’ป - JS

17546 ๋‹จ์–ด RESTJavaScriptSpreadTILJavaScript

TIL - 21.07.02 ๐Ÿ‘จโ€๐Ÿ’ป

Spread syntax ( ์ „๊ฐœ ๊ตฌ๋ฌธ )


๋ฐฐ์—ด์—์„œ์˜ ์ „๊ฐœ ๊ตฌ๋ฌธ

๋ฐฐ์—ด์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ๋ฐฐ์—ด ๋ช… ์•ž์— ์  ์„ธ๊ฐœ ๋ถ™ํžˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ฌธ์ž์—ด๋กœ ํ˜ธ์ถœํ•œ๋‹ค.
๋ฐฐ์—ด๋ผ๋ฆฌ ํ•ฉ์น˜๊ฑฐ๋‚˜ ๋ฐฐ์—ด๊นŒ์ง€ ๋ณต์‚ฌํ•˜๋Š”๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ํ•ฉ์ณ์ง„ ๋ฐฐ์—ด๋“ค์€ ์–•์€ ๋ณต์‚ฌ๊ฐ€ ๋˜๋ฉฐ ์ „๊ฐœ ๊ตฌ๋ฌธ์€ ์› ๋ฐฐ์—ด์— ์˜ํ–ฅ์ด ๊ฐ€์ง€ ์•Š๋Š” Immutableํ•œ ๋ฌธ๋ฒ•์ด๋‹ค.

  • ๊นŠ์€ ๋ณต์‚ฌ์™€ ์–•์€ ๋ณต์‚ฌ๋Š” ์ฐจํ›„ OiMW๋กœ ์ •๋ฆฌํ•˜๊ฒ ๋‹ค.
// ๋ฐฐ์—ด ํ•ฉ์น˜๊ธฐ ์˜ˆ์ œ 
let a = [1, 2, 3];
let b = [4, 5, 6];

let ab = [...a, ...b]; 
let ba = [...b, ...a];
console.log(ab) // [1, 2, 3, 4, 5, 6]; 
console.log(ba) // [4, 5, 6, 1, 2, 3]; 

// ๋ฐฐ์—ด ๋ณต์‚ฌ ์˜ˆ์ œ
let a = [1 ,2 ,3]
let b = [..a] // a.slice()์™€ ๋น„์Šทํ•˜๋‹ค.

b.pop(); // 3;
console.log(b) // [1, 2]
console.log(a) // [1, 2, 3]; ๋ฐฐ์—ด b์˜ ์š”์†Œ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ ์› ๋ฐฐ์—ด a์˜ ์š”์†Œ๋Š” ๋ณ€ํ•จ์ด ์—†๋‹ค.
// ๋‹ค๋งŒ ์–•์€ ๋ณต์‚ฌ(shallow copy)์ด๊ธฐ์— ๋ฐฐ์—ด์˜ ์š”์†Œ๋กœ ๊ฐ์ฒด, ๋ฐฐ์—ด๋“ฑ์ด ์˜ฌ๋•Œ 
// ๊ทธ ํ•ด๋‹น ์š”์†Œ๋“ค์—๋Š” ํ•ด๋‹น ์š”์†Œ์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋Š” Heap์˜ ์ฃผ์†Œ๋งŒ ์ €์žฅ๋œ๋‹ค.

๊ฐ์ฒด์—์„œ์˜ ์ „๊ฐœ๊ตฌ๋ฌธ

๋ฐฐ์—ด์—์„œ์˜ ๊ฒฝ์šฐ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๊ฑฐ๋‚˜ ๋ณต์ˆ˜์˜ ๊ฐ์ฒด๋ฅผ ํ•ฉ์น ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
๋‹ค๋งŒ ๋ณต์‚ฌ์˜ ๊ฒฝ์šฐ๋Š” ๋ฐฐ์—ด๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, ๋ณต์‚ฌํ• ๋•Œ๋Š” ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค.
๊ฐ™์€ ํ”„๋กœํผํ‹ฐ ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๋ผ๋ฆฌ ํ•ฉ์น ๋•Œ๊ฐ€ ๋‹ค๋ฅธ๋ฐ, ์ด ๊ฒฝ์šฐ๋Š” ๋Šฆ๊ฒŒ ์ž…๋ ฅํ•œ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ ๋ฐธ๋ฅ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

// ๊ฐ์ฒด ํ•ฉ์น˜๊ธฐ ์˜ˆ์ œ
let a ={
  name: 'sunghoon',
  job: 'officer',
};

let b ={
  job: 'dev'
  age: 26;
};

let c = {...a, ...b};
console.log(c) // { name: 'sunghoon', job: 'dev', age: 26 }
// ํ”„๋กœํผํ‹ฐ ํ‚ค๊ฐ€ job์ธ ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด officer์—์„œ dev๋กœ ๋ฐ”๋€Œ์—ˆ๋‹ค.

// ๊ฐ์ฒด ๋ณต์‚ฌ ์˜ˆ์ œ
let a ={
  name: 'sunghoon',
  job: 'dev',
};

let b = { ...a }

delete b.job;
console.log(b) // { name: 'sunghoon' }
console.log(a) // { name: 'sunghoon', job: 'dev' }
// ๋ณต์‚ฌํ•œ ๊ฐ์ฒด์ธ b์˜ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ ์› ๊ฐ์ฒด์ธ a์˜ ํ”„๋กœํผํ‹ฐ์— ๋ณ€๊ฒฝ์€ ์—†๋‹ค.

Rest ํŒŒ๋ผ๋ฏธํ„ฐ

rest ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ •ํ•ด์ง€์ง€ ์•Š์€ ์ˆ˜์˜ ์š”์†Œ๋ฅผ ๊ฐ€์ง„ ์ธ์ˆ˜๋ฅผ ๋ฐฐ์—ด๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
์‰ฝ๊ฒŒ ๋งํ•ด์„œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ๋ฐ›์•„์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•˜๊ณ  ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๊ฐ€๋ณ€์ ์ผ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
๋‹จ, rest ํŒŒ๋ผ๋ฏธํ„ฐ ์ดํ›„์—๋Š” ๋‹ค๋ฅธ ๋งค๊ฐœ ๋ณ€์ˆ˜๋‚˜ ํŠธ๋ ˆ์ผ๋ง ์ฝค๋งˆ๊ฐ€ ์˜ฌ ์ˆ˜ ์—†๋‹ค.
์ž…๋ ฅ๋œ ์ธ์ž๊ฐ€ ์ ์–ด rest ํŒŒ๋ผ๋ฏธํ„ฐ์— ํ• ๋‹น๋˜์ง€ ๋ชปํ•˜๋ฉด ๋นˆ ๋ฐฐ์—ด์ด ๋ฐ˜ํ™˜๋œ๋‹ค.

const favFruit = function(fruit1, fruit2, ...fruits) {
  console.log('My favorite fruit is ' + fruit1)
  console.log('and I also like ' + fruit2)
  console.log('and there\'s ' + fruits.length + ' more fruits that I like')
  console.log(fruits)
}
             
favFruit('grape', 'melon', 'peach', 'apple', 'pineapple')
  // My favorite fruit is grape;
  // and I also like melon;
  // and there's 3 more fruits that I like
  // ['peach', 'apple', 'pineapple']; // ๋‚˜๋จธ์ง€ ์ธ์ž๋“ค์ด ๋ฐฐ์—ด์˜ ํ˜•ํƒœ๋กœ ํ• ๋‹น๋˜์—ˆ๋‹ค.

๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น

๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์€ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด์˜ ์†์„ฑ์„ ํ•ด์ฒดํ•ด ๊ทธ ๊ฐ’์„ ๊ฐœ๋ณ„ ๋ณ€์ˆ˜์— ๋‹ด์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” JavaScript์˜ ํ‘œํ˜„์‹์ด๋‹ค.
๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ๋ถ„ํ•ดํ• ๋•Œ rest ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

// ๋ฐฐ์—ด์˜ ๊ฒฝ์šฐ
const [a, b, ...c] = [1, 2, 3, 4, 5]

console.log(a) // 1; 
console.log(b) // 2; a,b๋Š” ์ˆซ์ž์—ด์ด๋‹ค.
console.log(c) // [3, 4, 5]

// ๊ฐ์ฒด์˜ ๊ฒฝ์šฐ
const {a, b, ...c} = {a:1, b:2, c:3, d:4, e:5}
console.log(a) // 1; 
console.log(b) // 2; a,b๋Š” ์ˆซ์ž์—ด์ด๋‹ค.
console.log(c) // { c:3, d:4, e:5}

// ํ•จ์ˆ˜ ์‚ฌ์šฉ ์˜ˆ์ œ
function orderBurger({kindOf, sauce, topping,}){
  console.log(`${sauce}์†Œ์Šค์™€ ${topping}์ด/๊ฐ€ ์ถ”๊ฐ€๋œ ${kindOf}๋ฒ„๊ฑฐ๊ฐ€ ์ฃผ๋ฌธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.`)
}
let iWant = {
  kindOf: 'ํ†ต์ƒˆ์šฐ',
  sauce: 'ํ•ซ์ผ€์ฒฉ',
  bread: '์ฐธ๊นจ๋นต',
  topping: '์น˜์ฆˆ',
}
orderBurger(iWant);
// ํ•ซ์ผ€์ฒฉ์†Œ์Šค์™€ ์น˜์ฆˆ์ด/๊ฐ€ ์ถ”๊ฐ€๋œ ํ†ต์ƒˆ์šฐ๋ฒ„๊ฑฐ๊ฐ€ ์ฃผ๋ฌธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.; 
// ๊ฐ์ฒด(iWant)์˜ ํ”„๋กœํผํ‹ฐ์ค‘ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ ๊ฐ์ฒด์— ์žˆ๋Š” ๋ณ€์ˆ˜์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๊ฒŒ ์žˆ์œผ๋ฉด
// ๊ทธ๋ƒฅ ๋ฌด์‹œํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ๋“ค๋งŒ ์ฐพ์•„์„œ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

Shorthand notation ( ๋‹จ์ถ• ํ‘œ๊ธฐ๋ฒ• )

๋‹จ์ถ• ํ‘œ๊ธฐ๋ฒ•์€ ์ „์—ญ์— ์„ ์–ธ๋˜๊ณ  ํ• ๋‹น๋œ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์ƒํƒœ์—์„œ ๊ฐ์ฒด๋ฆฌํ„ฐ๋Ÿด์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ํ‚ค๋กœ ์žˆ์œผ๋ฉด ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ฒจ๋ฅ˜์‚ผ๋Š” ๊ฒƒ์ด๋‹ค.

let name = 'sunghoon'

let planet = {
  name,
  age: 26,
}

console.log(planet) // { name: 'sunghoon', age: 26 }

Koans ํ’€๋ฉฐ ์•Œ์•„๋‚ธ ๊ฒƒ

  • ์‚ฌ์น™์—ฐ์‚ฐ ์ค‘ + ๋ฅผ ์ œ์™ธํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ฐ’์„ ํ•ญ์ƒ ์ˆซ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ๋ถˆ๋ฆฌ์–ธ ํƒ€์ž…๊ณผ ์ˆซ์ž์—ด์„ ๊ณ„์‚ฐํ•˜๋ฉด true๋Š” 1, false๋Š” 0์œผ๋กœ ๋”ํ•ด์ง„๋‹ค.
  • ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ๋‚ด ์ž์‹ ์˜ this๊ฐ€ ์—†๊ธฐ์— ํ•จ์ˆ˜ ๋ฐ”๋กœ ๋ฐ–์—์„œ this๋ฅผ ์ฐพ๋Š”๋‹ค.
  • ๊ฐ์ฒด๋ผ๋ฆฌ ํ•ฉ์น ๋• Object.assign(obj1, obj2)๋ฅผ ์ด์šฉํ•˜์ž.

GOOD ๐Ÿ˜‰

์ „๊ฐœ ๊ตฌ๋ฌธ๊ณผ rest ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ตํ˜”๋‹ค.
ํŽ˜์–ด๋ถ„๊ณผ Koans๋ฅผ ํ’€๋ฉฐ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋ณด๋‹ค ์นœํ•ด์กŒ๋‹ค.

BAD ๐Ÿ˜ฅ

Koans๋ฅผ ํ’€๋ฉฐ ๋ณต์Šต์ด ์ค‘์š”ํ•˜๋‹ค๋Š”๊ฑธ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊นจ๋‹ฌ์•˜๋‹ค.

TO DO ๐Ÿ”ฅ

  • ๊ฐ์ฒด ๊นŠ์€ ๋ณต์‚ฌ, ์–•์€ ๋ณต์‚ฌ
  • DOM ๊ตฌ์กฐ
  • ์ด๋ฒคํŠธ ๊ฐ์ฒด
  • ๊ณ ์ฐจ ํ•จ์ˆ˜
  • React

Retrospect ๐Ÿง

๋ฒŒ์จ ํ•œ ์ฃผ๊ฐ€ ํ›Œ์ฉ ์ง€๋‚ฌ๋‹ค.
์ˆ™์ทจ ๋•Œ๋ฌธ์— ์ƒํ™œํŒจํ„ด์ด ์™„์ „ํžˆ ๋ง๊ฐ€์ง€๊ณ  ์ •์‹ ์—†์ด ๊ณต๋ถ€ํ•˜๋‹ค ๋ณด๋‹ˆ ๋ฒŒ์จ ๊ธˆ์š”์ผ์ด๋ผ๋‹ˆ.
์—ญ์‹œ ๋ญ”๊ฐ€์— ์ง‘์ค‘ํ•˜๊ณ  ์žˆ์œผ๋ฉด ์‹œ๊ฐ„์€ ๊ธˆ๋ฐฉ๊ธˆ๋ฐฉ ํ˜๋Ÿฌ๊ฐ€๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

์‹œ์ž‘ํ•œ์ง€ ์–ผ๋งˆ ์•ˆ๋œ ๊ฒƒ ๊ฐ™์€๋ฐ ๋ฒŒ์จ 2์ฃผ ์กฐ๊ธˆ ์•ˆ๋˜๋Š” ์‹œ๊ฐ„ ํ›„์—๋Š” ์ฒซ๋ฒˆ์งธ HA์™€ ๋งž๋ถ™๊ฒŒ ์ƒ๊ฒผ๋‹ค.
๊ฐ•ํ•ด์ ธ์„œ ์‰ฝ๊ฒŒ ๋•Œ๋ ค ๋ˆ•ํž ์ˆ˜ ์žˆ๊ธธ ๊ณ ๋Œ€ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜์€ ๊ธˆ์š”์ผ์ด๊ณ  ๋ญ”๊ฐ€ ๊ทธ๋ƒฅ ๋ณด๋‚ด๊ธฐ ์•„์‰ฌ์šฐ๋‹ˆ ๋งฅ์ฃผ ํ•œ ์ž” ํ•˜๋ฉฐ ๋งˆ์ง€๋ง‰์„ ์žฅ์‹ํ•˜๋Š”๊ฑธ๋กœ.
์™ˆ์™ˆ

Reference ๐Ÿ™‡

https://developer.mozilla.org/

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ