λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
javascript/πŸ“– study

[7μ£Όμ°¨ μŠ€ν„°λ””]35μž₯-μŠ€ν”„λ ˆλ“œ 문법

by HomieKim 2022. 3. 27.

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

  • es6μ—μ„œ λ„μž…λœ μŠ€ν”„λ ˆλ“œ 문법 (spread syntax)은 ν•˜λ‚˜λ‘œ 뭉쳐 μžˆλŠ” μ—¬λŸ¬ κ°’λ“€μ˜ 집합을 νŽΌμ³μ„œ κ°œλ³„μ μΈ κ°’λ“€μ˜ λͺ©λ‘μœΌλ‘œ λ§Œλ“ λ‹€.
  • μŠ€ν”„λ ˆλ“œ 문법 μ‚¬μš©μ˜ λŒ€μƒμ€ for ... of 문으둜 μˆœνšŒν•  수 μžˆλŠ” μ΄ν„°λŸ¬λΈ”μ— ν•œμ •λœλ‹€.
console.log(...[1,2,3]); // 1 2 3
// μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹Œ 일반 κ°μ²΄λŠ” μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ λŒ€μƒμ΄ 될 수 μ—†λ‹€.
console.log(...{a : 1, b : 2}); // TypeError : Found non-callable @@iterator
  • μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ κ²°κ³ΌλŠ” 값이 μ•„λ‹™λ‹ˆλ‹€. (즉, ... 문법은 μƒˆλ‘œμš΄ 값을 μƒμ„±ν•˜λŠ” μ—°μ‚°μžκ°€ μ•„λ‹™λ‹ˆλ‹€.)
  • λ”°λΌμ„œ μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ κ²°κ³ΌλŠ” λ³€μˆ˜μ— ν• λ‹Ήν•  μˆ˜μ—†λ‹€.

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

  • μŠ€ν”„λ ˆλ“œ 문법 μ‚¬μš© λŒ€μƒ
    • ν•¨μˆ˜ 호좜문의 인수 λͺ©λ‘
    • λ°°μ—΄ λ¦¬ν„°λŸ΄μ˜ μš”μ†Œ λͺ©λ‘
    • 객체 λ¦¬ν„°λŸ΄μ˜ ν”„λ‘œνΌν‹° λͺ©λ‘

ν•¨μˆ˜ 호좜문의 인수 λͺ©λ‘

  • 배열에 μžˆλŠ” λͺ©λ‘μ„ spread syntax둜 μ „κ°œν•΄μ„œ ν•¨μˆ˜ 호좜의 인자둜 전달 ν•  수 μžˆλ‹€.
const arr = [1,2,3];

// Math.max(1,2,3); κ³Ό κ°™μŒ
const max = Math.max(...arr); // 3
  • Rest νŒŒλΌλ―Έν„°μ™€ ν˜•νƒœκ°€ λΉ„μŠ·ν•˜μ—¬ ν˜Όλ™μ„ μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

    Rest νŒŒλΌλ―Έν„°λŠ” μŠ€ν”„λ ˆλ“œ 문법과 λ°˜λŒ€μ˜ κ°œλ…
    Rest νŒŒλΌλ―Έν„°λŠ” μΈμˆ˜λ“€μ˜ λͺ©λ‘μ„ λ°°μ—΄λ‘œ 전달 λ°›λŠ” 것

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

  • μŠ€ν”„λ ˆλ“œ 문법을 μ‚¬μš©ν•˜λ©΄ es5μ—μ„œ μ‚¬μš©ν•˜λ˜ 기쑴의 방식보닀 κ°„κ²°ν•˜κ²Œ ν‘œν˜„ κ°€λŠ₯ν•©λ‹ˆλ‹€.

    concat

  • 2개의 배열을 1개의 λ°°μ—΄λ‘œ κ²°ν•©ν•˜κ³  싢을 경우 concat λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.
// ES5
var arr = [1,2].concat([3,4]);
console.log(arr); // [1,2,3,4]

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

splice

  • λ°°μ—΄μ˜ 쀑간에 λ‹€λ₯Έ λ°°μ—΄μ˜ μš”μ†Œλ“€μ„ μΆ”κ°€ν•˜κ±°λ‚˜ μ œκ±°ν•˜λ €λ©΄ splice λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
  • μ΄λ•Œ, splice λ©”μ„œλ“œμ˜ μ„Έ 번째 인수둜 배열을 μ „λ‹¬ν•˜λ©΄λ°°μ—΄ μžμ²΄κ°€ μΆ”κ°€λœλ‹€.
//ES5
var arr1 = [1,4];
var arr2 = [2,3];

Array.prototype.splice.apply(arr1, [1,0].concat(arr2));
console.log(arr1); // [1,2,3,4]

// ES6
const arr1 = [1,4];
const arr2 = [2,3];

arr1.splice(1,0, ...arr2);
console.log(arr1); // [1,2,3,4]

λ°°μ—΄ 볡사

  • es5μ—μ„œ 배열을 λ³΅μ‚¬ν•˜λ €λ©΄ slice λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.
// ES5
var origin = [1,2];
var copy = origin.slice();

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

// ES6
const origin = [1,2];
const copy = [...origin];

console.log(copy); // [1,2]
console.log(copy === origin) // false
  • μ΄λ•Œ 원본 λ°°μ—΄μ˜ 각 μš”μ†Œλ₯Ό 얕은 볡사(shallow copy)ν•˜μ—¬ 볡사본을 μƒμ„±ν•œλ‹€.

이터블을 λ°°μ—΄λ‘œ λ³€ν™˜

  • es5μ—μ„œ μ΄ν„°λŸ¬λΈ”μ„ λ°°μ—΄λ‘œ λ³€ν™˜ν•˜λ €λ©΄ Function.prototype.apply λ˜λŠ” Function.prototype.call λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ slice λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•΄μ•Όν•œλ‹€.
  • μŠ€ν”„λ ˆλ“œ 문법을 μ‚¬μš©ν•˜λ©΄ κ°„νŽΈν•˜κ²Œ μ΄ν„°λŸ¬λΈ”μ„ λ°°μ—΄λ‘œ λ³€ν™˜ν•  수 μžˆλ‹€.
function sum() {
    return [...arguments].reduce((pre,cur) => pre+cur,0);
}

console.log(sum(1,2,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 }
  • es6μ΄μ „μ—λŠ” Object.assign λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ—¬λŸ¬κ°œμ˜ 객체λ₯Ό λ³‘ν•©ν•˜κ±°λ‚˜ νŠΉμ • ν”„λ‘œνΌν‹°λ₯Ό λ³€κ²½ λ˜λŠ” μΆ”κ°€ν–ˆλ‹€.
    (μŠ€ν”„λ ˆλ“œ ν”„λ‘œνΌν‹°λŠ” Object.assign 문법을 κ°„νŽΈν•˜κ²Œ λŒ€μ²΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€.)
// 객체 병합, νŠΉμ • ν”„λ‘œνΌν‹°κ°€ μ€‘λ³΅λ˜λŠ” 경우 뒀에 μœ„μΉ˜ν•œ ν”„λ‘œνΌν‹°κ°€ μš°μ„ κΆŒμ„ κ°–λŠ”λ‹€.
const merged = {...{x : 1, y : 2}, ...{y : 10, z : 3}};
console.log(merged); // { x : 1, y : 10, z : 3}

// νŠΉμ • ν”„λ‘œνΌν‹° λ³€κ²½
const changed = {...{ x: 1, y : 2}, y : 100};
console.log(changed); // { x : 1, y : 100}

// ν”„λ‘œνΌν‹° μΆ”κ°€
const added = {...{x : 1, y : 2}, z : 0};
console.log(added); // { x : 1, y : 2, z : 0}

λŒ“κΈ€