종종 함수에 객체나 배열 전체가 아닌 일부만을 전달해야 하는 경우가 있습니다. 그런 경우 객체나 배열을 변수로 분해할 수 있게 해주는 것이 "구조 분해 할당(객체 비구조화 할당)" 입니다!
배열은 기본적으로 순서가 있기 대문에 순서를 기반으로 할당됩니다.
let name = ["rice", "Glutinous"];
//이 배열을 fistName과 lastName 변수에 각각 할당해봅시다
let [firstName, lastName] = name;
console.log(firstName); //rice
console.log(lastName); //Glutinous
이렇듯 배열형의 자료를 변수로 할당할 수 있습니다.
배열형 자료 뿐만 아니라 배열형을 리턴하는 메서드와도 함께 사용할 수 있습니다.
let [firstName, lastName] = "rice Glutinous".split(" ");
//.split('')는 괄호 안을 기준으로 분리해 배열값을 반환한다!
주의할 것은 값을 분해해서 할당하는 것이지, 파괴하는 것이 아니기 때문에 분해된 대상은 수정, 파괴되지 않습니다
// 필요하지 않은 요소는 쉽표로 무시하기
let [firstName, , lastName] = ["rice", "yummy", "Glutinous", "favorite"];
console.log(lastName); //Glutinous
이 예제를 보면, 쉼표로 무시한 "yummy"
는 분해되지 않았고, 할당될 인자가 부여되지 않은 "favorite"
역시 할당되지 않았습니다.
배열값 중 일부는 각각의 요소로, 일부는 한데모아서 저장하고 싶을 때 '...' 연산자를 이용해서 rest요소들을 가져옵니다!
let animal = ["cat", "dog", "rabbit", "tiger", "lion", "hippo"];
//나머지는 뭉탱이로 구조분해 할당하고 싶음!
let [cute1, cute2, cute3, ...rest] = animal;
console.log(cute1); //cat
console.log(cute2); //dog
console.log(cute3); //rabbit
//rest는 남은 아이들의 배열이다!
console.log(rest[0]); //tiger
console.log(rest[1]); //lion
console.log(rest[2]); //hippo
주의할 것은 ...rest
는 마지막 요소로만 쓰일 수 있다는 것이다!
//spread 예시
const numbers = [1, 2, 3, 4, 5];
const spreadNumbers = [...numbers, "다시 반복", ...numbers];
console.log(spreadNumbers); // [1, 2, 3, 4, 5, "다시 반복", 1, 2, 3, 4, 5]
//rest 예시
const [first, second, ...restNumbers] = numbers;
console.log(restNumbers); //[3,4,5]
그런데 만약 undefined가 아니라 다른 값을 넣고 싶다면!? -> 기본값 설정하기
let name = ["Lee"];
let [
lastName = prompt("성을 입력하세요"),
name = prompt("이름을 입력하세요"),
] = name;
console.log(lastname); //Lee (배열에서 분해해서 가져온 값)
console.log(name); //prompt에서 받아온 기본값, 기본값 설정이 안되어있었으면 undefined였을 것!
객체는 배열과는 달리 순서가 없기 때문에 각 요소들을 통해 구조 분해 할당을 할 수 있습니다.
주의할 것은, 배열은 요소명이 없었기 때문에 아무 이름의 변수에 할당했지만, 객체는 객체프로퍼티의 이름을 통해서 할당해야합니다.
let { var1, var2 } = { var1:..., var2:... };
let product = {
title: "iphone",
width: 71.5,
height: 146.7,
};
// 순서는 상관 없으며. {객체 프로퍼티: 목표 변수}를 통해 할당변수명을 바꿀 수 있다.
let { width: w, height: h, title } = product;
// width -> w
// height -> h
// title -> title
alert(title); // iphone
alert(w); // 71.5
alert(h); // 146.7
let product = {
title: "iphone",
width: 71.5,
height: 146.7,
};
//할당 프로퍼티만 할당된다
let { title } = product;
console.log(title); //iphone
...
연산자를 이용해 나머지를 객체로 묶을 수 있습니다.let product = {
title: "iphone",
width: 71.5,
height: 146.7,
};
//배열과 마찬가지로 ... 연산자를 이용해 나머지를 뭉뚱그려 저장할 수 있다.
let { title, ...size } = product;
console.log(size); //{width: 71.5, height: 146.7}
=
을 통해 디폴트값을 설정할 수 있습니다.=
(클론)과 :
(할당연산자) 를 동시에 사용할 수 있습니다let product = { title: "iphone" };
let { width: w = 10, height: h = 20, title } = product;
console.log(title); //iphone(실제 product객체에서 가져와서 할당한 값)
consile.log(w); //10(비어있으므로 기본값이 할당된다)
consile.log(h); //20(비어있으므로 기본값이 할당된다)
let deepObj = {
userInfo: {
name: "찹쌀선과",
type: ["red", "green"],
age: 22,
},
count: 10,
};
//한번에 구조 분해 하기
let extracted = ({
userInfo: { name, type: color, age },
count,
} = deepObj);
console.log(name); //찹쌀선과
console.log(color); //["red","green"]
console.log(age); //22
console.log(count); //10
// 함수에 전달할 객체
let options = {
title: "My menu",
items: ["Item1", "Item2"],
};
// 똑똑한 함수는 전달받은 객체를 분해해 변수에 즉시 할당함
function showMenu({
title = "Untitled",
width = 200,
height = 100,
items = [],
}) {
// title, items – 객체 options에서 가져옴
// width, height – 기본값
alert(`${title} ${width} ${height}`); // My Menu 200 100
alert(items); // Item1, Item2
}
showMenu(options);
//기본적으로 빈 객체를 값으로 넣어둠
function showMenu({ title = "Menu", width = 100, height = 200 } = {}) {
alert(`${title} ${width} ${height}`);
}
//빈 객체가 전달되어도 기본값이 잘 출력됨!
showMenu(); // Menu 100 200
객체나 배열을 변수로 연결할 수 있는 구조분해할당 !
쫌쫌따리 유용하게 사용되니까 잘 응용해서 사용하면 좋을 것 같습니다.
레퍼런스는 쿠키파킹을 통해 확인하실 수 있습니다~
https://www.cookieparking.com/share/U2FsdGVkX1-GB1bbnxHTC6NUfT3IljyNFB1Ag8GCY8Ba44nVUJKBdZupa1vRTC1n8vSTkwfGIlccSZmb4aurJ4-Wr6TmqNG3i4m2roO-K9U