const list = [21, 22]; console.log([11, ...list, 12]); const obj = {key: 50}; console.log({...obj}); // [11,21,22,12] // {key: 50}
const one = [21, 22]; const two = [31, 32]; const result = [11, ...one, 12, ...two]; console.log(result); consoel.log(result.length); // [11,21,22,12,31,32] // 6
const one = [21, 22]; const result = [11, 12, ...one]; console.log(result); console.log(result.length); // [11, 12, 21, 22] // 4
let result = [21, 22]; const five = [51, 52]; result.push(...five); console.log(result); result.push(..."abc"); console.log(result); // [21, 22, 51, 52] // [21, 22, 51, 52, a, b, c]
const target = "ABC"; console.log([...target]); // [A, B, C]
const one = {key1: 11, key2: 22}; const result = {key3: 33, ...one}; console.log(result); // {key3: 33, key1: 11, key2: 22}
const one = {key1: 11, key2: 22}; const result = {key1: 33, ...one}; console.log(result); // {key1: 11, key2: 22} // const check = [...one]; --- error
호출하는 함수의 파라미터에 spread대상을 작성합니다.
function add(one, two, three) { console.log(one + two + three); }; const values = [10, 20, 30]; add(...values); // 60
분리하여 받은 파라미터를 배열로 결합합니다.
spread: 분리, rest: 결합
syntax: function(param, paramN, ...name)
function point(...param) { console.log(param); console.log(Array.isArray(param)); } const values = [10, 20, 30]; point(...values); // [10, 20, 30] // true
작성 방법
⇒ point(...values) → point(10, 20, 30)이 되어 호출합니다.
⇒ rest 파라미터로 다시 결합하여 param = [10, 20, 30]이 됩니다.
function point(ten, ...rest) { console.log(ten); console.log(rest); }; const values = [10, 20, 30]; point(...values); // 10 // [20, 30]
Object 타입이지만 배열처럼 이터러블 가능한 오브젝트입니다. for()문으로 전개할 수 있습니다.
const values = {0: "가",1:"나", 2:"다", length: 3}; for(let k = 0; k< values.length; k++){ console.log(values[k]); };
작성 방법
⇒ length 프로퍼티는 전개되지 않습니다(하면 안됩니다)
⇒ for~in문으로 전개할 경우 length 프로퍼티도 전개됩니다.
let one, two, three; const list = [1, 2, 3]; [one, two, three] = list; console.log(one); console.log(two); console.log(three); console.log(list); // 1 // 2 // 3 // [1,2,3]
사전적 의미로는 구조를 파괴한다는 의미가 있습니다. 하지만, 코드를 보면 원본 데이터가 파괴된다기보다는 구조분해 후 특정요소 pick을 한다는게 더 맞는 의미입니다.
즉, 파괴보다는 분할/분리에 더 가깝다고 볼 수 있고, "분할 할당"이라고 할 수 있습니다.
배열의 엘리먼트를 분할하여 할당할 수 있습니다.
인덱스에 해당하는 변수에 할당
⇒ 왼쪽의 인덱스에 해당하는 오른쪽 배열의 값을 할당합니다. one에 1, two에 2, three에 3이 할당됩니다.
let one, two, three; [one, two, three] = [1, 2, 3]; console.log(one); console.log(two); console.log(three); // 1 // 2 // 3
할당받을 변수 수가 적은 경우
⇒ 왼쪽에 할당받을 변수가 분할 할당할 값보다 적은 경우 왼쪽 인덱스에 맞추어 값을 할당합니다. 그렇기에 3은 할당되지 않습니다.
let one, two; [one, two] = [1, 2, 3]; console.log(one); console.log(two); // 1 // 2
할당받을 변수 수가 많은 경우
⇒ 왼쪽의 할당받을 변수가 3개이고 분할 할당할 값이 2개라면 왼쪽에 값을 할당할 수 없는 변수에는 undefined가 설정됩니다.
let one, two, three; [one, two, three] = [1, 2]; console.log(two); console.log(three); // 2 // undefined
배열 차원에 맞추어 분할 할당을 합니다.
⇒ [three, four]와 [3,4]가 배열이고 배열 차원도 변환됩니다.
let one, two, three, four; [one, two, [three, four]] = [1,2,[3,4]]; console.log([one, two, three, four]); // [1,2,3,4]
매치되는 인덱스에 변수가 없으면 값을 할당하지 않습니다.
⇒ [one, , , four] 형태에서 콤마로 구분하고 변수를 작성하지 않을 경우 인덱스를 건너 띄어 할당합니다.
let one, two, three, four; [one, , , four] = [1,2,3,4]; console.log([one, two, three, four]); // [1, undefined, undefined, 4]
나머지를 전부 할당
let one, rest; [one, ...rest] = [1,2,3,4]; console.log(one); console.log(rest); // 1 // [2,3,4]
인덱스를 반영한 나머지 할당
let one, three, rest; [one, ,three ...rest] = [1,2,3,4, 5]; console.log(three); console.log(rest); // 3 // [4, 5]
Object의 프로퍼티를 분할하여 할당합니다.
프로퍼티 이름이 같은 프로퍼티에 값을 할당합니다.
const {one, two} = {one: 10, two: 20}; console.log(one); console.log(two); // 10 // 20
프로퍼티 이름을 별도로 작성
⇒ 이처럼 프로퍼티 명을 위에 별도로 작성을 한 경우에 분할 할당을 하기위해서는 소괄호안에 작성을 하여 평가해야합니다.
let one, two ({one, two} = {one: 10, two: 20}); console.log(one); console.log(two); // 10 // 20
프로퍼티 값 위치에 변수 이름 작성
⇒ 이름을 별도로 선언했기에 소괄호안에 작성합니다.
one의 프로퍼티 값 5를 five에 할당하고, six도 마찬가지로 two의 프로퍼티 값인 6을 할당합니다.
이때 one을 출력하려하면 ReferenceError가 발생합니다.(단지 분류의 기능 수행)
let five, six; ({one: five, two: six} = {one: 5, two: 6}); console.log(five); console.log(six); // console.log(one); --- ReferenceError // 5 // 6
Object구조에 맞춰 값 할당
⇒ 왼쪽의 할당받는 변수에서 plus: {two, three}에서 plus는 구조(경로)를 만들기 위해 존재하며 구조가 다르면 실행할 때 에러가 발생하기에 작성합니다. 그렇기에 plus는 실제로 존재하지 않습니다.
const {one, plus: {two, three}} = {one: 10, plus:{two:20, three:30}}; console.log(one); console.log(two); console.log(three); // 10 // 20 // 30
나머지를 Object로 할당
const {one, ...rest} = {one: 10, two: 20, three:30}; console.log(rest); // {two: 20, three:30}
호출하는 함수에서 Object형태로 넘겨준 파라미터 값을 호출받는 함수의 파라미터에 맞추어 할당합니다.
function add({one, two}) { console.log(one + two); } add({one: 10, two: 20}); // 30
⇒ 호출하는 함수에서 넘겨준 one과 two가 담긴 오브젝트를 호출받는 함수의 프로퍼티 이름에 맞춰 분할 할당합니다.
function add({one, plus:{two}}) { console.log(one + two); } add({one: 10, plus:{two: 20}}); // 30
같은 프로퍼티 이름 사용
const value = {book: 10, book: 20}; console.log(value); // 20
Shorthand property names
const one = 10, two = 20; const values = {one, two}; console.log(values); // {one: 10, two: 20}
문자열을 프로퍼티 이름으로 사용
const value = {
["one" + "two"]: 12
};
console.log(value.onetwo);
// 12
⇒ [ ]안에 문자열로 이름을 작성하면 그 문자열이 프로퍼티 이름이 되는데 우측 코드에서 one + two로 문자열 결합이 되어 onetwo가 프로퍼티 이름으로 사용됩니다.
변수값을 프로퍼티 이름으로 사용
const item = "world";
const sports = {
[item]: 100,
[item + " Cup"]: "월드컵",
[item + "Sports"]: function() {
return "스포츠";
}
};
console.log(sports[item]); // 100
console.log(sports[item + " Cup"]); //월드컵
console.log(sports[item + "Sports"]());// 스포츠
// 100
// 월드컵
// 스포츠
⇒ 변수값을 프로퍼티 이름으로 사용합니다.
⇒ 변수값을 문자열 결합하여 사용할 수도 있습니다.
⇒ 프로퍼티 이름에 공백도 넣을 수 있습니다.
⇒ 함수로 호출할 수도 있습니다.
분할 할당을 조합한 형태
const item = "book";
const result = {[item]: title} = {book: "책"};
console.log(result);
⇒ 변수값을 프로퍼티 이름으로 사용하고 분할 할당하는 형태입니다.
⇒ {[item]: title}은 {book: title} 형태가 됩니다.
⇒ {book: title} = {book: "책"}이 되어 result는 {book: "책"}이 됩니다.
값을 할당하지 않으면 사전에 정의된 값(default value)을 할당하는 것입니다.
할당할 값이 없으면 디폴트 값을 할당합니다.
const [one, two, five = 50] = [10, 20]; console.log(five); // 50
할당할 값이 있으면 디폴트 값을 무시합니다.
const [one, two, five = 50] = [10, 20, 70]; console.log(five); // 70
⇒ 왼쪽과 오른쪽 모두 값이 3개로 할당 값도 할당 받을 변수도 맞기에 five는 50이 아닌 우측에서 70을 할당받습니다.
Object는 프로퍼티 이름으로 체크합니다.
const {one, two = 20} = {one: 10}; console.log(two); // 20
⇒ 우측의 one값인 10을 좌측의 one 프로퍼티 값으로 분할할당합니다. two에는 할당할 값이 없으며 기본값인 20을 할당합니다.
디폴트 값 적용 순서(좌 → 우)
const [one, two = one + 20, five = two + 50] = [10]; console.log(two); console.log(five); // 30 // 80
넘겨받은 파라미터 값이 없으면 디폴트 값을 할당합니다
const add = (ten, two = 20) => ten + two; const result = add(10); console.log(result); // 30
넘겨받은 파라미터 값이 있으면 디폴트 값을 무시합니다.
const add = (ten, two = 20) => ten + two; const result = add(10, 50); console.log(result); // 60
⇒ add(10, 50)으로 두 번쨰 파라미터도 작성을 해주게 되면 호출받은 함수의 파라미터부분에서도 디폴트 값을 적용하지 않습니다
호출한 함수의 파라미터 값이 undefined일 때
const point = () => 20; const add (one, two = point()) => one + two); const result = add(10, undefined); console.log(result); // 30