LHJ

I'm a FE developer.

5.10 해체 할당

27 Apr 2020 » js_lj

ES6에서 새로 도입한 해체 할당(destructuring assignment) 은 매우 환영 받는 기능입니다.
이 기능은 객체나 배열을 변수로 ‘해체’할 수 있습니다.
객체 해체부터 시작합시다.

객체 해체

// 객체 선언
const obj = { b: 2, c: 3, d: 4 };

// 해체 할당
const {a, b, c} = obj;

a; // undefined: obj에는 "a" 프로퍼티가 없습니다.
b; // 2
c; // 3
d; // ReferenceError: "d"는 정의되지 않았습니다.

객체를 해체할 때는 반드시 변수 이름과 객체의 프로퍼티 이름이 일치해야 합니다.
프로퍼티 이름이 유효한 식별자인 프로퍼티만 해체 후 할당됩니다.
이 예제에서는 obj에 a 프로퍼티가 없으므로 a는 undefined를 할당받습니다.
해체 할당에 d라는 프로퍼티가 없으므로 d는 선언조차 되지 않았습니다.

이 예제에서는 선언과 할당을 같은 문에서 실행했습니다.
객체 해체는 할당만으로 이뤄질 수도 있지만, 그렇게 하려면 반드시 괄호를 써야 합니다.
괄호를 쓰지 않으면 자바스크립트는 표현식 좌변을 블록으로 해석합니다.

const obj = { b: 2, c: 3, d: 4 };
let a, b, c;

// 에러가 일어납니다.
{ a, b, c } = obj;

// 동작합니다.
({a, b, c} = obj);

배열 해체

배열을 해체할 때는 배열 요소에 대응할 변수 이름을 마음대로 쓸 수 있으며 이들은 배열 순서대로 대응합니다.

// 배열 선언
const arr = [1, 2, 3];

// 배열 해체 할당
let [x, y] = arr;
x; // 1
y; // 2
z; // ReferenceError: "z"는 정의되지 않았습니다.

이 예제에서 x는 배열의 첫 번째 요소 값을, y는 두 번째 요소 값을 할당받습니다.
그 뒤의 배열 요소는 모두 버려집니다.
6장에서 배울 확산 연산자(spread operator(…)를 사용하면 남은 요소를 새 배열에 할당할 수 있습니다.

spread 연산자

const arr = [1, 2, 3, 4, 5];

let [x, y, ...rest] = arr;
x; // 1
y; // 2
rest; // [3, 4, 5]

이 예제에서 x와 y는 배열의 처음 두 요소를 받고, 변수 rest에는 나머지가 저장됩니다.
배열 해체를 활용하면 변수의 값을 서로 바꿀 수 있습니다.
해체를 사용하지 않으면 임시 변수가 필수적인 작업입니다.

let a = 5, b = 10;
[a, b] = [b, a];
a; // 10
b; // 5

NOTE_
배열 해체는 꼭 배열에만 사용할 수 있는 것은 아닙니다.
9장에서 배울 이터러블 객체에는 모두 사용할 수 있습니다.

여기서 살펴본 간단한 예제 정도라면 굳이 해체를 사용하지 않고 그냥 변수에 값을 직접 할당하는 게 더 편했을 겁니다.
해체의 진가다른 곳에서 가져온 객체배열에서 원하는 요소를 뽑아내야 할 때 드러납니다.
6장에서 그런 예제를 살펴보겠습니다.