일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 함수선언식
- 문자열
- boolean
- for of
- properties
- flex-wrap
- flex
- 함수표현식
- 논리연산자
- 타입
- typeof
- 비교연산자
- 함수
- 조건문
- 반복문
- ELSE
- 기초
- Methods
- flex-direction
- javascript
- align-content
- if else
- justify-content
- for in
- 변수
- frontend
- 화살표함수
- 속성
- for
- 프론트엔드
- Today
- Total
하얀 코딩
[JavaScript - 13] 구조 분해 할당 (Destructing Assignment) 본문
정의
구조 분해 할당 구문은 배열이나 객체의 속성을 해체하여 그 값을 개별 변수에 담을 수 있게 하는 JavaScript 표현식입니다.
구문 & 특징
var a, b, rest
[a, b] = [10, 20]
console.log(a); // 10
console.log(b); // 20
[a, b, ...rest] = [10, 20, 30, 40, 50]
console.log(a); // 10
console.log(b); // 20
console.log(rest); // [30, 40, 50]
{ a, b } = { a: 10, b: 20 }
console.log(a); // 10
console.log(b); // 20
// Stage 4(finished) proposal
{a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40}
console.log(a); // 10
console.log(b); // 20
console.log(rest); // {c: 30, d: 40}
1. 대신 할당문의 좌변에서 사용하여, 원래 변수에서 어떤 값을 분해해 할당할지 정의
var x = [1, 2, 3, 4, 5];
var [y, z] = x;
console.log(y); // 1
console.log(z); // 2
2. 변수의 선언이 분리되어도 구조 분해를 통해 값을 할당할 수 있습니다.
var a, b;
[a, b] = [1, 2];
console.log(a); // 1
console.log(b); // 2
3. 변수에 기본값을 할당하면, 분해한 값이 undefined일 때 그 값을 대신 사용합니다.
var a, b;
[a=5, b=7] = [1];
console.log(a); // 1
console.log(b); // 7
4. 하나의 구조 분해 표현식만으로 두 변수의 값을 교환할 수 있습니다.
구조 분해 할당 없이 두 값을 교환하려면 임시 변수가 필요합니다.
var a = 1;
var b = 3;
[a, b] = [b, a];
console.log(a); // 3
console.log(b); // 1
5. 다음과 같이 필요하지 않은 반환 값을 무시할 수 있습니다.
function f() {
return [1, 2, 3];
}
var [a, , b] = f();
console.log(a); // 1
console.log(b); // 3
6. 반환 값을 모두 무시할 수도 있습니다.
[,,] = f();
7. 배열을 구조 분해할 경우, 나머지 구문을 이용해 분해하고 남은 부분을 하나의 변수에 할당할 수 있습니다.
var [a, ...b] = [1, 2, 3];
console.log(a); // 1
console.log(b); // [2, 3]
8. 객체로부터 속성을 해체하여 객체의 원래 속성명과는 다른 이름의 변수에 할당할 수 있습니다.
var o = {p: 42, q: true};
var {p: foo, q: bar} = o;
console.log(foo); // 42
console.log(bar); // true
9. 새로운 변수명 할당과 기본값 할당을 한번에 할 수 있습니다.
var {a: aa = 10, b: bb = 5} = {a: 3};
console.log(aa); // 3
console.log(bb); // 5
10. 구조 분해는 JavaScript 식별자 이름으로 적합하지 않은 속성명이 제공된 경우에도 이용할 수 있습니다.
이 때는 대체할 유효한 식별자명을 제공해야 합니다.
const foo = { 'fizz-buzz': true };
const { 'fizz-buzz': fizzBuzz } = foo;
console.log(fizzBuzz); // true
// fizzBuzz는 선언된게 없는데 true가 들어 갔다는 점!
11. 함수에서 응용하기 - 1 (ES5 버전)
function drawES5Chart(options) {
options = options === undefined ? {} : options;
var size = options.size === undefined ? 'big' : options.size;
var cords = options.cords === undefined ? { x: 0, y: 0 } : options.cords;
var radius = options.radius === undefined ? 25 : options.radius;
console.log(size, cords, radius);
// 이제 드디어 차트 그리기 수행
}
drawES5Chart({
cords: { x: 18, y: 30 },
radius: 30
});
11. 함수에서 응용하기 - 2 (ES2015 버전)
function drawES2015Chart({size = 'big', cords = { x: 0, y: 0 }, radius = 25} = {}) {
console.log(size, cords, radius);
// 차트 그리기 수행
}
drawES2015Chart({
cords: { x: 18, y: 30 },
radius: 30
});
※
위의 drawES2015Chart 함수의 원형에서 구조 분해된 좌변에 빈 오브젝트 리터럴을 할당하는 것을 볼 수 있습니다.
{size = 'big', cords = {x: 0, y: 0}, radius = 25} = {}. 빈 오브젝트를 우변에 할당하지 않고도 함수를 작성할 수 있습니다.
하지만, 지금의 형태에서는 단순히 drawES2015Chart()와 같이 어떤 매개변수 없이도 호출할 수 있지만,
우변의 빈 오브젝트 할당을 없앤다면 함수 호출시 적어도 하나의 인자가 제공되어야만 합니다.
이 함수가 어떠한 매개변수 없이도 호출할 수 있길 원한다면 지금 형태가 유용하고, 무조건 객체를 넘기길 원하는 경우에는
빈 객체 할당을 하지 않는 것이 유용할 수 있습니다.
'JavaScript' 카테고리의 다른 글
[JavaScript - 15] 일급 객체 (함수) (0) | 2023.01.11 |
---|---|
[JavaScript - 14] 얕은 복사(shallow copy)와 깊은 복사(deep copy) (0) | 2022.11.18 |
[JavaScript - 12] 전개 문법 (Spread syntax) (0) | 2022.11.13 |
[JavaScript - 11] 호이스팅(hoisting) (0) | 2022.11.11 |
[JavaScript - 10] 클로저(Closure) (0) | 2022.11.08 |