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 ...
μ΄μ²λΌ μ€νλ λ λ¬Έλ²μ κ²°κ³Όλ¬Όμ κ°μΌλ‘ μ¬μ©ν μ μκ³ , λ€μκ³Ό κ°μ΄ μΌνλ‘ κ΅¬λΆν κ°μ λͺ©λ‘μ μ¬μ©νλ λ¬Έλ§₯μμλ§ μ¬μ©ν μ μλ€.
μμλ€μ μ§ν©μΈ λ°°μ΄μ νΌμ³μ κ°λ³μ μΈ κ°λ€μ λͺ©λ‘μΌλ‘ λ§λ ν, μ΄λ₯Ό ν¨μμ μΈμ λͺ©λ‘μΌλ‘ μ λ¬ν΄μΌ νλ κ²½μ°κ° μλ€.
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]);
μ€νλ λ λ¬Έλ²μ λ°°μ΄ λ¦¬ν°λ΄μμ μ¬μ©νλ©΄ ES5μμ μ¬μ©νλ κΈ°μ‘΄μ λ°©μλ³΄λ€ λμ± κ°κ²°νκ³ κ°λ μ± μ’κ² ννν μ μλ€.
// 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]
// 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]
// 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
// 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]
// μ€νλ λ νλ‘νΌν°
// κ°μ²΄ 볡μ¬(μμ 볡μ¬)
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 }