ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

ES6์—์„œ ๋„์ž…๋œ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•(spread syntax, ์ „๊ฐœ ๋ฌธ๋ฒ•) ... ์€ ํ•˜๋‚˜๋กœ ๋ญ‰์ณ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ์„ ํŽผ์ณ์„œ ๊ฐœ๋ณ„์ ์ธ ๊ฐ’๋“ค์˜ ๋ชฉ๋ก์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋Œ€์ƒ์€ Array, String, Map, Set, DOM ์ปฌ๋ ‰์…˜(NodeList, HTMLCollection), arguments์™€ ๊ฐ™์ด 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]์€ ๊ฐ’๋“ค์˜ ๋ชฉ๋ก 1, 2, 3์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ• ... ์ด ํ”ผ์—ฐ์‚ฐ์ž๋ฅผ ์—ฐ์‚ฐํ•˜์—ฌ ๊ฐ’์„ ์ƒ์„ฑํ•˜๋Š” ์—ฐ์‚ฐ์ž๊ฐ€ ์•„๋‹ˆ๋ผ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์˜ ๊ฒฐ๊ณผ๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋ณ€์ˆ˜์— ํ• ๋‹น์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

// ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์˜ ๊ฒฐ๊ณผ๋Š” ๊ฐ’์ด ์•„๋‹ˆ๋‹ค.
const list = ...[1, 2, 3]; // SyntaxError: Unexpected token ...

 

์ด์ฒ˜๋Ÿผ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„ํ•œ ๊ฐ’์˜ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ๋งฅ์—์„œ๋งŒ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฌธ์˜ ์ธ์ˆ˜ ๋ชฉ๋ก
  • ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด์˜ ์š”์†Œ ๋ชฉ๋ก
  • ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์˜ ํ”„๋กœํผํ‹ฐ ๋ชฉ๋ก

ํ•จ์ˆ˜ ํ˜ธ์ถœ๋ฌธ์˜ ์ธ์ˆ˜ ๋ชฉ๋ก์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

์š”์†Œ๋“ค์˜ ์ง‘ํ•ฉ์ธ ๋ฐฐ์—ด์„ ํŽผ์ณ์„œ ๊ฐœ๋ณ„์ ์ธ ๊ฐ’๋“ค์˜ ๋ชฉ๋ก์œผ๋กœ ๋งŒ๋“  ํ›„, ์ด๋ฅผ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜ ๋ชฉ๋ก์œผ๋กœ ์ „๋‹ฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Math.max([1, 2, 3]); // -> NaN

var arr = [1, 2, 3];

// apply ํ•จ์ˆ˜์˜ 2๋ฒˆ์งธ ์ธ์ˆ˜(๋ฐฐ์—ด)๋Š” apply ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์˜ ์ธ์ˆ˜ ๋ชฉ๋ก์ด๋‹ค.
// ๋”ฐ๋ผ์„œ ๋ฐฐ์—ด์ด ํŽผ์ณ์ ธ์„œ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.
var max = Math.max.apply(null, arr); // -> 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 ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•๊ณผ ๋ฐ˜๋Œ€์˜ ๊ฐœ๋…์œผ๋กœ ์ธ์ˆ˜๋“ค์˜ ๋ชฉ๋ก์„ ๋ฐฐ์—ด๋กœ ์ „๋‹ฌ๋ฐ›๊ธฐ ์œ„ํ•ด ๋งค๊ฐœ๋ณ€์ˆ˜ ์ด๋ฆ„ ์•ž์— ... ์„ ๋ถ™์ด๋Š” ๊ฒƒ


๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ES5์—์„œ ์‚ฌ์šฉํ•˜๋˜ ๊ธฐ์กด์˜ ๋ฐฉ์‹๋ณด๋‹ค ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

concat

์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด concat๊ณผ ๊ฐ™์€ ๋ณ„๋„์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์—ด ๋ฆฌํ„ฐ๋Ÿด๋งŒ์œผ๋กœ 2๊ฐœ์˜ ๋ฐฐ์—ด์„ 1๊ฐœ์˜ ๋ฐฐ์—ด๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

// 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 ๋ฉ”์„œ๋“œ๋ฅผ ๋”์šฑ ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋…์„ฑ ์ข‹๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

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

/*
apply ๋ฉ”์„œ๋“œ์˜ 2๋ฒˆ์งธ ์ธ์ˆ˜(๋ฐฐ์—ด)๋Š” apply ๋ฉ”์„œ๋“œ๊ฐ€ ํ˜ธ์ถœํ•œ splice ๋ฉ”์„œ๋“œ์˜ ์ธ์ˆ˜ ๋ชฉ๋ก์ด๋‹ค.
apply ๋ฉ”์„œ๋“œ์˜ 2๋ฒˆ์งธ ์ธ์ˆ˜ [1, 0].concat(arr2)๋Š” [1, 0, 2, 3]์œผ๋กœ ํ‰๊ฐ€๋œ๋‹ค.
๋”ฐ๋ผ์„œ splice ๋ฉ”์„œ๋“œ์— apply ๋ฉ”์„œ๋“œ์˜ 2๋ฒˆ์งธ ์ธ์ˆ˜ [1, 0, 2, 3]์ด ํ•ด์ฒด๋˜์–ด ์ „๋‹ฌ๋œ๋‹ค.
์ฆ‰, arr1[1]๋ถ€ํ„ฐ 0๊ฐœ์˜ ์š”์†Œ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๊ทธ ์ž๋ฆฌ(arr1[1])์— ์ƒˆ๋กœ์šด ์š”์†Œ(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]

 

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

์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฐฐ์—ด์„ ๋ณต์‚ฌํ•  ๋•Œ 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

 

์ดํ„ฐ๋Ÿฌ๋ธ”์„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜

arguments ๊ฐ์ฒด๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ฉด์„œ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด  ๊ฐ„ํŽธํ•˜๊ฒŒ ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, Rest ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

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

// ์ดํ„ฐ๋Ÿฌ๋ธ”์ด ์•„๋‹Œ ์œ ์‚ฌ ๋ฐฐ์—ด ๊ฐ์ฒด
const arrayLike = {
  0: 1,
  1: 2,
  2: 3,
  length: 3
};

const arr = Array.prototype.slice.call(arrayLike); // -> [1, 2, 3]
console.log(Array.isArray(arr)); // true

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

๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ

Rest ํ”„๋กœํผํ‹ฐ์™€ ํ•จ๊ป˜ TC39 ํ”„๋กœ์„ธ์Šค์˜ stage 4 ๋‹จ๊ณ„์— ์ œ์•ˆ๋˜์–ด ์žˆ๋Š” ์Šคํ”„๋ ˆ๋“œ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์˜ ํ”„๋กœํผํ‹ฐ ๋ชฉ๋ก์—์„œ๋„ ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

// ์Šคํ”„๋ ˆ๋“œ ํ”„๋กœํผํ‹ฐ
// ๊ฐ์ฒด ๋ณต์‚ฌ(์–•์€ ๋ณต์‚ฌ)
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 }

[์ถœ์ฒ˜] ๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive

https://wikibook.co.kr/mjs/

 

๋ชจ๋˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Deep Dive: ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ

269๊ฐœ์˜ ๊ทธ๋ฆผ๊ณผ ์›๋ฆฌ๋ฅผ ํŒŒํ—ค์น˜๋Š” ์„ค๋ช…์œผ๋กœ ‘์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๊ณผ ๋™์ž‘ ์›๋ฆฌ’๋ฅผ ์ดํ•ดํ•˜์ž! ์›นํŽ˜์ด์ง€์˜ ๋‹จ์ˆœํ•œ ๋ณด์กฐ ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ œํ•œ์ ์ธ ์šฉ๋„๋กœ ํƒœ์–ด๋‚œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋Š” ๊ณผ๋„

wikibook.co.kr