관리 메뉴

Daehyunii's Dev-blog

35μž₯ μŠ€ν”„λ ˆλ“œ 문법 λ³Έλ¬Έ

πŸ“š Language & CS knowledge/JavaScript (λͺ¨λ˜μžλ°”μŠ€ν¬λ¦½νŠΈ Deep Dive)

35μž₯ μŠ€ν”„λ ˆλ“œ 문법

Daehyunii 2022. 7. 28. 13:18

  ES6μ—μ„œ λ„μž…λœ μŠ€ν”„λ ˆλ“œ 문법(μ „κ°œ 문법) ...은 ν•˜λ‚˜λ‘œ 뭉쳐 μžˆλŠ” μ—¬λŸ¬ κ°’λ“€μ˜ 집합을 νŽΌμ³μ„œ κ°œλ³„μ μΈ κ°’λ“€μ˜ λͺ©λ‘μœΌλ‘œ λ§Œλ“ λ‹€. μŠ€ν”„λ ˆλ“œ 문법을 μ‚¬μš©ν•  수 μžˆλŠ” λŒ€μƒμ€ for...of 문으둜 μˆœνšŒν•  수 μžˆλŠ” μ΄ν„°λŸ¬λΈ”μ— ν•œμ •λœλ‹€.

// ...[1,2,3]은 [1,2,3]을 κ°œλ³„ μš”μ†Œλ‘œ λΆ„λ¦¬ν•œλ‹€.
console.log(...[1,2,3]); // 1 2 3

// λ¬Έμžμ—΄μ€ μ΄ν„°λŸ¬λΈ”μ΄λ‹€
console.log(...'hello'); // h e l l o

// μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹Œ 일반 κ°μ²΄λŠ” μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ λŒ€μƒμ΄ 될 수 μ—†λ‹€.
console.log(...{a : 1}) // TypeError λ°œμƒ

  μ—¬κΈ°μ„œ μ£Όμ˜ν•΄μ•Ό ν•  점은 μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ κ²°κ³ΌλŠ” 값이 μ•„λ‹ˆλΌ κ°’λ“€μ˜ λͺ©λ‘μ΄λ‹€. μ΄λŠ” μŠ€ν”„λ ˆλ“œ 문법 ...이 ν”Όμ—°μ‚°μžλ₯Ό μ—°μ‚°ν•˜μ—¬ 값을 μƒμ„±ν•˜λŠ” μ—°μ‚°μžκ°€ μ•„λ‹˜μ„ μ˜λ―Έν•œλ‹€. λ”°λΌμ„œ μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ κ²°κ³ΌλŠ” 직접 λ³€μˆ˜μ— ν• λ‹Ήν•  수 μ—†λ‹€.(값이 μ•„λ‹ˆλ―€λ‘œ)

// μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ κ²°κ³ΌλŠ” 값이 μ•„λ‹ˆλ‹€!!
const spread = ...[1,2,3]; // SyntaxError λ°œμƒ

  μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ 결과물은 κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μ—†κ³  μ‰Όν‘œλ‘œ κ΅¬λΆ„ν•œ κ°’μ˜ λͺ©λ‘μ„ μ‚¬μš©ν•˜λŠ” λ¬Έλ§₯μ—μ„œλ§Œ μ‚¬μš©ν•  수 μžˆλ‹€.

1. ν•¨μˆ˜ 호좜문의 인수 λͺ©λ‘μ— ... μ‚¬μš©

2. λ°°μ—΄ λ¦¬ν„°λŸ΄μ˜ μš”μ†Œ λͺ©λ‘μ— ... μ‚¬μš©

3. 객체 λ¦¬ν„°λŸ΄μ˜ ν”„λ‘œνΌν‹° λͺ©λ‘μ— ...μ‚¬μš©

 

35.1 ν•¨μˆ˜ 호좜문의 인수 λͺ©λ‘μ—μ„œ μ‚¬μš©ν•˜λŠ” 경우

  μš”μ†Œλ“€μ˜ 집합인 배열을 νŽΌμ³μ„œ κ°œλ³„μ μΈ κ°’λ“€μ˜ λͺ©λ‘μœΌλ‘œ λ§Œλ“  ν›„, 이λ₯Ό ν•¨μˆ˜μ˜ 인수 λͺ©λ‘μœΌλ‘œ 전달해야 ν•˜λŠ” κ²½μš°κ°€ μžˆλ‹€.

const arr = [1, 2, 3];

const max = Math.max(...arr); 
console.log(max); // 3

  μœ„μ˜ μ½”λ“œμ²˜λŸΌ ν•¨μˆ˜ 호좜문의 인수 λͺ©λ‘μ— λ°°μ—΄μ˜ μš”μ†Œλ“€μ„ ν•˜λ‚˜ ν•˜λ‚˜ κΊΌλ‚΄μ„œ 전달 ν•  ν•„μš”μ—†μ΄ μŠ€ν”„λ ˆλ“œ 문법을 톡해 λ°°μ—΄λ‚΄μ˜ μš”μ†Œλ“€μ˜ λͺ©λ‘μ„ νŽΌμ³μ„œ ν•¨μˆ˜ 호좜문의 인수λͺ©λ‘μ— ν•œ λ²ˆμ— 전달할 수 μžˆλ‹€. 

 

35.2 λ°°μ—΄ λ¦¬ν„°λŸ΄ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•˜λŠ” 경우

  μŠ€ν”„λ ˆλ“œ 문법을 λ°°μ—΄ λ¦¬ν„°λŸ΄μ—μ„œ μ‚¬μš©ν•˜λ©΄ ES5μ—μ„œ μ‚¬μš©ν•˜λ˜ 기쑴의 방식보닀 λ”μš± κ°„κ²°ν•˜κ³  가독성 μ’‹κ²Œ ν‘œν˜„ν•  수 μžˆλ‹€.

 

35.2.1 concat

  ES5μ—μ„œ 2개의 배열을 1개의 λ°°μ—΄λ‘œ κ²°ν•©ν•˜κ³  싢은 경우 λ°°μ—΄ λ¦¬ν„°λŸ΄λ§ŒμœΌλ‘œ ν•΄κ²°ν•  수 μ—†κ³  concat λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.

var arr = [1,2].concat([3,4]);
console.log(arr); // [1, 2, 3, 4]

  ν•˜μ§€λ§Œ μŠ€ν”„λ ˆλ“œ 문법을 μ‚¬μš©ν•˜λ©΄ λ³„λ„μ˜ λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  λ°°μ—΄ λ¦¬ν„°λŸ΄λ§ŒμœΌλ‘œ 2개의 배열을 1개의 λ°°μ—΄λ‘œ κ²°ν•©ν•  수 μžˆλ‹€.

const arr = [...[1,2],...[3,4]];
console.log(arr); // [1, 2, 3, 4]

35.2.3 λ°°μ—΄ 볡사

  ES5μ—μ„œ 배열을 λ³΅μ‚¬ν•˜λ €λ©΄ slice λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

var origin = [1, 2];
var copy = origin.slice();

console.log(copy); // [1, 2]
console.log(copy === origin); // false

  μŠ€ν”„λ ˆλ“œ 문법을 μ‚¬μš©ν•˜λ©΄ λ”μš± κ°„κ²°ν•˜κ³  가독성 μ’‹κ²Œ ν‘œν˜„ν•  수 μžˆλ‹€.

var origin = [1, 2];
var copy = [...origin];

console.log(copy); // [1, 2]
console.log(copy === origin); // false

35.3 객체 λ¦¬ν„°λŸ΄ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•˜λŠ” 경우

  μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ λŒ€μƒμ€ μ΄ν„°λŸ¬λΈ”μ΄μ–΄μ•Ό ν•˜μ§€λ§Œ μŠ€ν”„λ ˆλ“œ ν”„λ‘œνΌν‹° μ œμ•ˆμ€ 일반 객체λ₯Ό λŒ€μƒμœΌλ‘œλ„ μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ μ‚¬μš©μ„ ν—ˆμš©ν•œλ‹€.

// 객체 볡사
const obj = {x : 1, y : 2};
const copy = {...obj};
console.log(copy); // {x: 1, y: 2}
console.log(obj === copy); // false

//객체 병합
const merged = {x : 1, y : 2, ...{a : 3, b : 4}};
console.log(merged); // {x: 1, y: 2, a: 3, b: 4}

  이처럼 μŠ€ν”„λ ˆλ“œ 문법을 ν™œμš©ν•˜λ©΄ 기쑴의 λ©”μ„œλ“œλ₯Ό ν™œμš©ν•˜μ—¬ κ΅¬ν˜„ν•΄μ•Ό ν–ˆλ˜ λ™μž‘λ“€μ„ 가독성 μ’‹κ³  νŽΈλ¦¬ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.