Destructuring(비구조화 할당)
디스트럭처링은 구조화된 배열 혹은 객체를 분해하여 변수에 할당하는 방식이다. 이 개념을 몰랐더라도 React
를 사용해봤던 개발자라면 아마 많이 봤을 문법이다.
const { state } = this.props;
오른쪽의 특정 값을 해체하여 왼쪽에 할당하는 표현식을 **Destructuring Assignment
**라고 한다.
배열 디스트럭처링
//ES5
var arr = ["JS", "Java", "Node.js"];
var x = arr[0];
var y = arr[1];
var z = arr[2];
console.log(x, y, z); //JS Java Node.js
//ES6
const arr = ["JS", "Java", "Node.js"];
let [x, y, z] = arr;
console.log(x, y, z); //JS Java Node.js
const numArr = [1, 2, 3, 4];
let [x, y, , z] = numArr;
console.log(x, y, z); //1 2 4
위의 결과를 보면 알 수 있듯이 배열을 디스트럭처링하면 각각의 변수에 배열의 index
를 기준으로 할당된다.
디스트럭처링을 사용했을 때 편한 대표적인 예는 변수의 swap처리를 할 때다.
//ES5(For Swap)
var x = 1;
var y = 2;
var tmp = y;
console.log(x, y); //1 2
y = x;
x = tmp;
console.log(x, y); //2 1
//ES6
let x = 1;
let y = 2;
console.log(x, y); //1 2
[x, y] = [y, x];
console.log(x, y); //2 1
객체 디스트럭처링
객체 또한 디스트럭처링이 가능하며 배열과 크게 다르지 않다.
//ES5
var obj = { name: "BKJang", lang: "Korean", job: "Developer" };
var name = obj.name;
var lang = obj.lang;
var job = obj.job;
console.log(name, lang, job); //BKJang Korean Developer
//ES6
const obj = { name: "BKJang", lang: "Korean", job: "Developer" };
let { name, lang, job } = obj;
console.log(name, lang, job); //BKJang Korean Developer
만약 변수 명을 다르게 하고 싶다면 다음과 같이 처리하면 된다.
var obj = { a: 1, b: "hello" };
var { a: key, b: value } = obj;
console.log(key, value); // 1, 'hello'
중첩 객체의 경우에는 아래와 같이 사용한다.
const developer = {
name: "BKJang",
stack: {
front: "HTML / CSS / JS",
back: "Java / Node.js"
}
};
const {
name,
stack: { front }
} = developer;
console.log(name, front); //BKJang HTML / CSS / JS
디스트럭처링을 사용하면 **기본 값(Default Value)**이나 **기본 파라미터(Default Parameter)**를 세팅할 수 있고, Speread Operator또한 사용할 수도 있다.
Spread Operator 용
const arr = [1, 2, 3, 4];
let [x, y, ...z] = arr;
console.log(x, y, z); //1 2 [3, 4]
const obj = { one: 1, two: 2, three: 3, four: 4 };
let { one, two, ...rest } = obj;
console.log(one, two, rest); //1 2 {three: 3, four: 4}
기본 값(Default Value)
const arr = [1, 2];
let [x, y, z = 3] = arr;
console.log(x, y, z); //1 2 3
const obj = { one: 1, two: 2 };
let { one, two, three = 3 } = obj;
console.log(one, two, three); //1 2 3
기본 파라미터(Default Parameter)
const doSomething = (name, stack = "FrontEnd") => {
stack = stack === null ? "FullStack" : stack;
console.log(`${name}은 ${stack}개발자입니다.`);
};
doSomething("BKJang"); //BKJang은 FrontEnd개발자입니다.
doSomething("BKJang", "BackEnd"); //BKJang은 BackEnd개발자입니다.
doSomething("BKJang", undefined); //BKJang은 FrontEnd개발자입니다.
doSomething("BKJang", null); //BKJang은 FullStack개발자입니다.
//Default Parameter는 함수의 length에 포함되지 않는다.
console.log(doSomething.length); //1
자바스크립트에서 함수는 length
프로퍼티를 가지는데 인자의 갯수를 나타낸다.
Default Parameter
는 이 length
프로퍼티에 포함되지 않는다.