ES6μ—μ„œ λ„μž…λœ μŠ€ν”„λ ˆλ“œ 문법(spread syntax, μ „κ°œλ¬Έλ²•) … 은 ν•˜λ‚˜λ‘œ 뭉쳐 μžˆλŠ” μ—¬λŸ¬ κ°’λ“€μ˜ 집합을 νŽΌμ³μ„œ(μ „κ°œν•˜μ—¬, λΆ„μ‚°ν•˜μ—¬, spread) κ°œλ³„μ μΈ κ°’λ“€μ˜ λͺ©λ‘μœΌλ‘œ λ§Œλ“ λ‹€.

μŠ€ν”„λ ˆλ“œ 문법을 μ‚¬μš©ν•  수 μžˆλŠ” λŒ€μƒμ€ Array, String, Map, Set, argument, DOMμ»¬λ ‰μ…˜(NodeList, HTMLCollection)와 같이 for … of 문으둜 μˆœνšŒν•  수 μžˆλŠ” μ΄ν„°λŸ¬λΈ”μ— ν•œμ •λœλ‹€.

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

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

// Mapκ³Ό Set은 μ΄ν„°λŸ¬λΈ”μ΄λ‹€.
console.log(...new Map([['a', '1'], ['b', '2']])); // [ 'a', '1' ] [ 'b', '2' ]
console.log(...new Set([1, 2, 3])); // 1 2 3

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

μœ„ μ˜ˆμ œμ—μ„œ 1, 2, 3은 값이 μ•„λ‹ˆλΌ κ°’λ“€μ˜ λͺ©λ‘μ΄λ‹€. 즉, μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ κ²°κ³ΌλŠ” 값이 μ•„λ‹ˆλ‹€. μ΄λŠ” μŠ€ν”„λ ˆλ“œ 문법 … 이 ν”Όμ—°μ‚°μžλ₯Ό μ—°μ‚°ν•˜μ—¬ 값을 μƒμ„±ν•˜λŠ” μ—°μ‚°μžκ°€ μ•„λ‹˜μ„ μ˜λ―Έν•œλ‹€. λ”°λΌμ„œ μŠ€ν”„λ ˆλ“œ λ¬Έλ²•μ˜ κ²°κ³ΌλŠ” λ³€μˆ˜μ— ν• λ‹Ήν•  수 μ—†λ‹€.

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

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

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

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

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

const arr = [1, 2, 3];

// λ°°μ—΄ arr의 μš”μ†Œ μ€‘μ—μ„œ μ΅œλŒ€κ°’μ„ κ΅¬ν•˜κΈ° μœ„ν•΄ Math.maxλ₯Ό μ‚¬μš©ν•œλ‹€.
const max = Math.max(arr); // -> NaN

Math.max λ©”μ„œλ“œμ— μˆ«μžκ°€ μ•„λ‹Œ 배열을 인수둜 μ „λ‹¬ν•˜λ©΄ μ΅œλŒ€κ°’μ„ κ΅¬ν• μˆ˜ μ—†μœΌλ―€λ‘œ NaN을 λ°˜ν™˜ν•œλ‹€. 이 같은 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μŠ€ν”„λ ˆλ“œ 문법을 μ‚¬μš©ν•œλ‹€.

const arr = [1, 2, 3];

// μŠ€ν”„λ ˆλ“œ 문법을 μ‚¬μš©ν•˜μ—¬ λ°°μ—΄ arr을 1, 2, 3으둜 νŽΌμ³μ„œ Math.max에 μ „λ‹¬ν•œλ‹€.
// Math.max(...[1, 2, 3])은 Math.max(1, 2, 3)κ³Ό κ°™λ‹€.
const max = Math.max(...arr); // -> 3

μŠ€ν”„λ ˆλ“œ 문법은 μ•žμ—μ„œ μ‚΄νŽ΄λ³Έ Rest νŒŒλΌλ―Έν„°μ™€ ν˜•νƒœκ°€ λ™μΌν•˜μ—¬ ν˜Όλ™ν•  수 μžˆμœΌλ―€λ‘œ μ£Όμ˜ν•  ν•„μš”κ°€ μžˆλ‹€. Rest νŒŒλΌλ―Έν„°λŠ” ν•¨μˆ˜μ— μ „λ‹¬λœ μΈμˆ˜λ“€μ˜ λͺ©λ‘μ„ λ°°μ—΄λ‘œ 전달받기 μœ„ν•΄ λ§€κ°œλ³€μˆ˜ 이름 μ•žμ— …을 λΆ™μ΄λŠ” 것이닀. μŠ€ν”„λ ˆλ“œ 문법은 μ—¬λŸ¬ 개의 값이 ν•˜λ‚˜λ‘œ 뭉쳐 μžˆλŠ” λ°°μ—΄κ³Ό 같은 μ΄ν„°λŸ¬λΈ”μ„ νŽΌμ³μ„œ κ°œλ³„μ μΈ κ°’λ“€μ˜ λͺ©λ‘μ„ λ§Œλ“œλŠ” 것이닀. λ”°λΌμ„œ Rest νŒŒλΌλ―Έν„°μ™€ μŠ€ν”„λ ˆλ“œ 문법은 μ„œλ‘œ λ°˜λŒ€μ˜ κ°œλ…μ΄λ‹€.

// Rest νŒŒλΌλ―Έν„°λŠ” μΈμˆ˜λ“€μ˜ λͺ©λ‘μ„ λ°°μ—΄λ‘œ μ „λ‹¬λ°›λŠ”λ‹€.
function foo(...rest) {
  console.log(rest); // 1, 2, 3 -> [ 1, 2, 3 ]
}

// μŠ€ν”„λ ˆλ“œ 문법은 λ°°μ—΄κ³Ό 같은 μ΄ν„°λŸ¬λΈ”μ„ νŽΌμ³μ„œ κ°œλ³„μ μΈ κ°’λ“€μ˜ λͺ©λ‘μ„ λ§Œλ“ λ‹€.
// [1, 2, 3] -> 1, 2, 3
foo(...[1, 2, 3]);

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

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

βœ” 35.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]

βœ” 35.2.2 splice

// ES5
var arr1 = [1, 4];
var arr2 = [2, 3];

// μ„Έ 번째 인수 arr2λ₯Ό ν•΄μ²΄ν•˜μ—¬ 전달해야 ν•œλ‹€.
// 그렇지 μ•ŠμœΌλ©΄ arr1에 arr2 λ°°μ—΄ μžμ²΄κ°€ μΆ”κ°€λœλ‹€.
arr1.splice(1, 0, arr2);

// κΈ°λŒ€ν•œ κ²°κ³ΌλŠ” [1, [2, 3], 4]κ°€ μ•„λ‹ˆλΌ [1, 2, 3, 4]λ‹€.
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]

βœ” 35.2.3 λ°°μ—΄ 볡사

// 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

βœ” 35.2.4 μ΄ν„°λŸ¬λΈ”μ„ λ°°μ—΄λ‘œ λ³€ν™˜

// ES5
function sum() {
  // μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ μœ μ‚¬ λ°°μ—΄ 객체인 argumentsλ₯Ό λ°°μ—΄λ‘œ λ³€ν™˜
  var args = Array.prototype.slice.call(arguments);

  return args.reduce(function (pre, cur) {
    return pre + cur;
  }, 0);
}

console.log(sum(1, 2, 3)); // 6

// ES6
function sum() {
  // μ΄ν„°λŸ¬λΈ”μ΄λ©΄μ„œ μœ μ‚¬ λ°°μ—΄ 객체인 argumentsλ₯Ό λ°°μ—΄λ‘œ λ³€ν™˜
  return [...arguments].reduce((pre, cur) => pre + cur, 0);
}

console.log(sum(1, 2, 3)); // 6

// Rest νŒŒλΌλ―Έν„° argsλŠ” ν•¨μˆ˜μ— μ „λ‹¬λœ μΈμˆ˜λ“€μ˜ λͺ©λ‘μ„ λ°°μ—΄λ‘œ μ „λ‹¬λ°›λŠ”λ‹€.
const sum = (...args) => args.reduce((pre, cur) => pre + cur, 0);

console.log(sum(1, 2, 3)); // 6

μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹Œ μœ μ‚¬ λ°°μ—΄ κ°μ²΄λŠ” μŠ€ν”„λ ˆλ“œκ°€ μ•„λ‹Œ Array.from λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄ λ°°μ—΄λ‘œ λ³€ν™˜ν•œλ‹€.

// Array.from은 μœ μ‚¬ λ°°μ—΄ 객체 λ˜λŠ” μ΄ν„°λŸ¬λΈ”μ„ λ°°μ—΄λ‘œ λ³€ν™˜ν•œλ‹€
Array.from(arrayLike); // -> [1, 2, 3]

πŸ’¬ 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 }
// 객체 병합. ν”„λ‘œνΌν‹°κ°€ μ€‘λ³΅λ˜λŠ” 경우, 뒀에 μœ„μΉ˜ν•œ ν”„λ‘œνΌν‹°κ°€ μš°μ„ κΆŒμ„ κ°–λŠ”λ‹€.
const merged = Object.assign({}, { x: 1, y: 2 }, { y: 10, z: 3 });
console.log(merged); // { x: 1, y: 10, z: 3 }

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

// ν”„λ‘œνΌν‹° μΆ”κ°€
const added = Object.assign({}, { x: 1, y: 2 }, { z: 0 });
console.log(added); // { x: 1, y: 2, z: 0 }
// 객체 병합. ν”„λ‘œνΌν‹°κ°€ μ€‘λ³΅λ˜λŠ” 경우, 뒀에 μœ„μΉ˜ν•œ ν”„λ‘œνΌν‹°κ°€ μš°μ„ κΆŒμ„ κ°–λŠ”λ‹€.
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 };
// changed = { ...{ x: 1, y: 2 }, ...{ y: 100 } }
console.log(changed); // { x: 1, y: 100 }

// ν”„λ‘œνΌν‹° μΆ”κ°€
const added = { ...{ x: 1, y: 2 }, z: 0 };
// added = { ...{ x: 1, y: 2 }, ...{ z: 0 } }
console.log(added); // { x: 1, y: 2, z: 0 }
profile
μ΄μ‚¬μ€‘μž…λ‹ˆλ‹€!🌟https://velog.io/@devkyoung2

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보