...

์ ์
'๋น๊ตฌ์กฐํ ํ ๋น(destructuring assignment) ๊ตฌ๋ฌธ์ ๋ฐฐ์ด์ด๋ ๊ฐ์ฒด์ ์์ฑ์ ํด์ฒดํ์ฌ
๊ทธ ๊ฐ์ ๊ฐ๋ณ ๋ณ์์ ๋ด์ ์ ์๊ฒ ํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํํ์(expression)'์ ๋๋ค.
โ
๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ๋ฉด ๋ฐฐ์ด [], ํน์ ๊ฐ์ฒด {} ์์ ๊ฐ์ ํธํ๊ฒ ๊บผ๋ด ์ธ ์ ์๋ ๋ฌธ๋ฒ์ ๋๋ค.
๊ธฐ๋ณธ ๋ฌธ๋ฒ - ๋ฐฐ์ด
var [a1, a2, ...rest_a] = [1, 2, 3, 4, 5, 6, 7, 8, 9];
console.log(a1); // 1
console.log(a2); // 2
console.log(rest_a); // [3, 4, 5, 6, 7, 8, 9]
์ขํญ์ด ํธ์ถ๋ ๋ณ์๋ช ์งํฉ, ์ฐํญ์ด ํ ๋นํ ๊ฐ ์ ๋๋ค.
์ขํญ์ ๊ฐ ์์์๋ ๊ฐ์ index๋ฅผ ๊ฐ์ง๋ ๋ฐฐ์ด๊ฐ์ด ํ ๋น๋ฉ๋๋ค.
๋ํ ์ ๊ฐ ์ฐ์ฐ์( ... )๋ฅผ ์ฌ์ฉํ์ฌ ์ขํญ์์ ๋ช ์์ ์ผ๋ก ํ ๋น๋์ง ์์ ๋๋จธ์ง ๋ฐฐ์ด ๊ฐ๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ var, let, const๋ฅผ ์ฌ์ฉํด ๋ณ์๋ค์ ์ ํจ ๋ฒ์๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ธํ ์ ์์ต๋๋ค.
โ
๐ก ์์์ ์ธ๋ฑ์ค ๊ฐ๋ง ๊ฐ์ ธ์ค๊ธฐ
cons arr = [1,2,3,4,5];
const [x,y,,,z] = arr;
console.log(x); // 1
console.log(y); // 2
console.log(z); // 5
๐จ ์ ๊ฐ ์ฐ์ฐ์ ์ดํ์ ๋ณ์๋ฅผ ์ ๋ ฅํ๊ฑฐ๋, ์ข ์ฐํญ์ด ๋ค๋ฅธ ์์ฑ์ผ ๊ฒฝ์ฐ ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
[a1, a2, ...rest_a, a3] = [1, 2, 3, 4, 5, 6, 7, 8, 9]; // error
[a1, a2, ...rest_a] = {a1 : 10, a2: 20}; // error
๊ธฐ๋ณธ ๋ฌธ๋ฒ - ๊ฐ์ฒด
var { a1, a2, ...rest_a } = { a1 : 10, a2 : 20, a3 : 30, a4 : 40 };
console.log(a1); // 10
console.log(a2); // 20
console.log(rest_a); // { a3: 30, a4: 40 }
๊ฐ์ฒด์ ๊ฒฝ์ฐ์๋ ์ฐํญ์ key ๊ฐ์ด ์ขํญ์ ๋ณ์๋ช ๊ณผ ๋งค์นญ๋ฉ๋๋ค.
๋ฐฐ์ด๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก var, let, const๊ฐ ์ ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
โ
๐ก key์ด๋ฆ ๋์ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ณ์๋ช ์ฌ์ฉํ๊ธฐ
์๋์ key ๊ฐ๊ณผ ๋ค๋ฅธ ์ด๋ฆ์ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
* ์ ์ฒ๋ผ a1 ๋์ awesome_name์ด๋ผ๋ value๊ฐ์ ๋ณ์๋ก ์ฌ์ฉํฉ๋๋ค.
var { a1 : awesome_name, a2 : dumb , ...rest_a } = { a1 : 10, a2 : 20, a3 : 30, a4 : 40 };
console.log(awesome_name); // 10
console.log(dumb); // 20
console.log(a1); // Error : a1 is not defined
๋๋จธ์ง ๊ฐ์ ๋ปํ๋ ์ ๊ฐ ์ฐ์ฐ์๋ ์ฐํญ์ key์ ์ํฅ์ ๋ฐ์ง ์๊ธฐ ๋๋ฌธ์ ...rest_a : blah ์ ๊ฐ์ ํํ์์ ๋ฌด์๋ฏธํ๋ฉฐ, ์ค์ ๋ก ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
โ
๋ํ ์ฐํญ์ key๊ฐ์ ๋ณ์๋ช ์ผ๋ก ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ ๋ฌธ์์ด์ด ์์๊ฒฝ์ฐ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋น๊ตฌ์กฐํ ํ ์ ์์ต๋๋ค.
'it is key' ๊ฐ์๊ฒฝ์ฐ key๊ฐ์ผ๋ก์๋ ๋ฌธ์์ด์ด๋ ์๊ด์์ง๋ง, ๋ณ์๋ช ์ผ๋ก์๋ ์ฌ์ฉ ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
var key = 'it is key'; //๋์ด์ฐ๊ธฐ ๋ฌธ์์ด ์ผ๊ฒฝ์ฐ ๋ณ์๋ก ์ฌ์ฉ ๋ชปํ๋ค.
var { 'an-apple':apple, [key]:is_key } = { 'an-apple' : 10, 'it is key' : 20};
console.log(apple); // 10
console.log(is_key); // 20
โ
๐ก ์ค์ฒฉ๋ ๊ฐ์ฒด ๊บผ๋ด์ค๊ธฐ
const example = { a : 13, b : { C : 135, d : 146 } };
const { a, b : { d } } = example;
console.log(a); // 13
console.log(d); // 146
๐จ this๊ฐ ์๋ ๊ฐ์ฒด ๋ฉ์๋๋ฅผ ๊ตฌ์กฐ๋ถํด๋ก ๊บผ๋ด๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค!
์๋ํ๋ฉด ๊ตฌ์กฐ๋ถํด๋ ๊ฐ์ฒด๊ฐ์ ๋ณต์ฌํด์ ๋ฃ๋๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ getCandy๋ฉ์๋ ๋ด์ฉ์ด ๋ณต์ฌ๋์ด ๊ตฌ์กฐ๋ถํด ๋๋ ๊ทธ์์ this๋ windows๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค.
var candyMachine = {
status : {
name : 'node',
count : 5,
},
getCandy() {
this.status.count--;
return this.status.count;
}
}
candyMachine.getCandy();
var count = candyMachine.status.count;
console.log(count); // 5-- ๋์ 4๊ฐ ๋๋ค.
var { getCandy, status: { count } } = candyMachine;
getCandy();
console.log(count); // ์ฌ์ ํ 4๊ฐ ๋๋ค.
๋ง์ง๋ง์ผ๋ก ๊ฐ์ฒด ๋น๊ตฌ์กฐํ์์ ์ฃผ์ํด์ผ ํ ์ ์
๋ณ์ ์ ์ธ์ ๋ํ ๋ช ์(var, let, const)๊ฐ ์์ ๊ฒฝ์ฐ ๊ดํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌถ์ด์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ ์ ๋๋ค.
({ a, b } = { a : 10, b : 20});
console.log(a); // 10
console.log(b); // 20
{ c, d } = { c : 30, d : 40}; // error
๊ธฐ๋ณธ๊ฐ ํ ๋น
โ๋น๊ตฌ์กฐํ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฐ ํ ๋น์ ์๋ํ๋ฉด undefined๋ฅผ ๋ฐํํ๊ฒ ๋ฉ๋๋ค.
์ด๋ฐ ๊ฒฝ์ฐ๋ฅผ ๋ฐฉ์ดํ๊ธฐ ์ํด ๋ณ์๋ช ๋ค์ ํ ๋น ์ฐ์ฐ์(=)๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ๊ฐ ํ ๋น์ ํ ์ ์์ต๋๋ค.
[a, b] = [10];
console.log(a); // 10
console.log(b); // undefined
var {c = 30, d : new_name = 40} = { };
console.log(c); // 30
console.log(new_name); // 40
๋ณต์ฌ(copy)
var arr = [1,2,3];
var copy1 = arr; // ๋ ํผ๋ฐ์ค ์ด์ด๋ถ์ด๊ธฐ
var [...copy2] = arr; // ๊ฐ์ ์์ ๋ณต์ฌ
var copy3 = [...arr]; // ''
arr[0] = 'String';
console.log(arr); // [ 'String', 2, 3 ]
console.log(copy1); // [ 'String', 2, 3 ]
console.log(copy2); // [ 1, 2, 3 ]
console.log(copy3); // [ 1, 2, 3 ]
์์ ๋ณต์ฌ์ธ copy1์ arr์ ์ฐธ์กฐํ๊ธฐ ๋๋ฌธ์ 0๋ฒ ์์๊ฐ ๋ณ๊ฒฝ๋์์ง๋ง
์ ๊ฐ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ copy2, copy3๋ ๊น์ ๋ณต์ฌ๊ฐ ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
โ
๊ฐ์ฒด ์ญ์ ์ ๊ฐ ์ฐ์ฐ์๋ก ๊น์ ๋ณต์ฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฌด์๋ณด๋ค๋ ๊ฐ๋ ฅํ ์ ์ ๋ณต์ฌ์ ํจ๊ป ์๋ก์ด ๊ฐ์ ํ ๋นํ ์ ์๋ค๋ ์ ์ ๋๋ค.
var prevState = {
name: "yuddomack",
birth: "1996-11-01",
age: 22
};
var state = {
...prevState,
age: 23
};
console.log(state); // { name: 'yuddomack', birth: '1996-11-01', age: 23 }
์์ ๊ฐ์ด ...prevState๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํจ๊ณผ ๋์์ ageํค์ ์๋ก์ด ๊ฐ(23)์ ํ ๋นํ ์ ์์ต๋๋ค.
๋ฆฌ์กํธ์ props๋ state์ฒ๋ผ ์ด์ ์ ๋ณด๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉํ ์ ์์ต๋๋ค.
โ
โ์ด๋ฒ์ ๊ฐ์ฒด์ ๊น์ํ ๊ณณ์ ๋ค์ด์๋ ๊ฐ์ ๊บผ๋ด๋ ๋ฐฉ๋ฒ์ ์์๋ด ์๋ค.
์๋ฅผ๋ค์ด์ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ฒด๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
const deepObject = {
state: {
information: {
name: 'velopert',
languages: ['korean', 'english', 'chinese']
}
},
value: 5
};
์ฌ๊ธฐ์, name, languages, value ๊ฐ๋ค์ ๋ฐ์ผ๋ก ๊บผ๋ด์ฃผ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น์?
const deepObject = {
state: {
information: {
name: 'velopert',
languages: ['korean', 'english', 'chinese']
}
},
value: 5
};
const { name, languages } = deepObject.state.information;
const { value } = deepObject;
const extracted = {
name, // name : name, ๊ฐ์ด key์ value์ ์๋ณ์๊ฐ ๊ฐ์ผ๋ฉด ํ๋๋ก ์๋ต ๊ฐ๋ฅ
languages,
value
};
console.log(extracted); // {name: "velopert", languages: Array[3], value: 5}
๊ทธ๋ฐ๋ฐ ์ ๊น! ์ง๊ธ extracted ๊ฐ์ฒด๋ฅผ ์ ์ธ ํ ๋ ์ด๋ฐ์์ผ๋ก ํ๋๋ฐ์
const extracted = {
name,
languages,
value
}
์ด ์ฝ๋๋ ๋ค์ ์ฝ๋์ ๋๊ฐ์ต๋๋ค.
const extracted = {
name: name,
languages: languages,
value: value
}
๋ง์ฝ์ key ์ด๋ฆ์ผ๋ก ์ ์ธ๋ ๊ฐ์ด ์กด์ฌํ๋ค๋ฉด, ๋ฐ๋ก ๋งค์นญ์์ผ์ฃผ๋ ๋ฌธ๋ฒ์ ๋๋ค.
์ด ๋ฌธ๋ฒ์ ES6 ์ object-shorthand ๋ฌธ๋ฒ์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
โ
ํจ์์์์ ์ฌ์ฉ
โํจ์์ ํ๋ผ๋ฏธํฐ ๋ถ๋ถ์์๋ ๋น๊ตฌ์กฐํ ํ ๋น์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ฌธ๋ฒ์ ํนํ API ์๋ต ๊ฐ์ ์ฒ๋ฆฌํ๋๋ฐ์ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
function renderUser({name, age, addr}){
// ๊ฐ์ฒด์์ฒด๋ฅผ ์๊ท๋จผํธ๋ก ๋ฐ์์ฌ๋ ์ฌ์ฉํ๋ฉด ์ข๋ค.
// ๊ตณ์ด ๊ฐ์ฒด๋ณ์๋ฅผ ๋ฐ์์์ ์ผ์ผํ ํ์ด์ ์ฐ๋๊ฒ๋ณด๋ค, ์ง๊ด์ ์ด๊ฒ ์๊ท๋จผํธ๋ฅผ ๋ช
์ํ๋๊ฒ ๊ฐ๋
์ฑ๋ฉด์์ ์ข๋ค.
console.log(name);
console.log(age);
console.log(addr);
}
const users = [
{name: 'kim', age: 10, addr:'kor'},
{name: 'joe', age: 20, addr:'usa'},
{name: 'miko', age: 30, addr:'jp'}
];
users.map((user) => {
renderUser(user);
});
๋ง์ฐฌ๊ฐ์ง๋ก mapํจ์์ ํ๋ผ๋ฏธํฐ์๋ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
const users = [
{name: 'kim', age: 10, addr:'kor'},
{name: 'joe', age: 20, addr:'usa'},
{name: 'miko', age: 30, addr:'jp'}
];
users.map(({name, age, addr}) => {
console.log(name);
console.log(age);
console.log(addr);
});
ํด๋์ค์์์ ํ์ฉ
class Person {
constructor({name, age}) {
this.name = name;
this.age = age;
}
introduce() {
return `์ ์ด๋ฆ์ ${this.name}์
๋๋ค.`
}
}
class Student extends Person {
constructor({grade, ...rest}) {
// ๋ถ๋ชจ ํด๋์ค์ ์์ฑ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
super(rest);
this.grade = grade;
}
introduce() {
// ๋ถ๋ชจ ํด๋์ค์ `introduce` ๋ฉ์๋๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
return super.introduce() + ` ์ ๋ ${this.grade}ํ๋
์
๋๋ค.`;
}
}
const s = new Student({grade: 3, name: '์ค์์ค', age: 19});
s.introduce(); // ์ ์ด๋ฆ์ ์ค์์ค์
๋๋ค. ์ ๋ 3ํ๋
์
๋๋ค.
for of ๋ฌธ
const users = [
{name: 'kim', age: 10, addr:'kor'},
{name: 'joe', age: 20, addr:'usa'},
{name: 'miko', age: 30, addr:'jp'}
];
for(var {name : n, age : a} of users){
console.log(n);
console.log(a);
}

์ค์ฒฉ๋ ๊ฐ์ฒด ๋ฐ ๋ฐฐ์ด์ ๋น๊ตฌ์กฐํ
const kim = {
name: 'kim',
age: 10,
addr: 'kor',
friends: [
{name: 'joe', age: 20, addr:'usa'},
{name: 'miko', age: 30, addr:'jp'}
]
};
var { name: userName, friends: [ ,{ name: jpFriend }] } = kim;
console.log(userName); // kim
console.log(jpFriend); // miko
Reference
https://learnjs.vlpt.us/useful/06-destructuring.html
โ
์ด ๊ธ์ด ์ข์ผ์ จ๋ค๋ฉด ๊ตฌ๋ & ์ข์์
์ฌ๋ฌ๋ถ์ ๊ตฌ๋
๊ณผ ์ข์์๋
์ ์์๊ฒ ํฐ ํ์ด ๋ฉ๋๋ค.