Java Script - 비구조화 할당
& React에서 비구조화 할당 사용하기 >
비구조화 할당
destructuring assignment :: ECMAScript 2015에 들어온 새로운 문법
배열이나 객체의 요소를 해체하여 별개의 변수로 추출할 수 있도록 하는 것
var a, b, rest;
[a, b] = [10, 20];
console.log(a); // 10
console.log(b); // 20
위의 코드의 첫 줄에서 변수 a, b, rest를 선언했습니다. (선언만 하고 아직 할당하지 않은 상태) 그리고 두 번째 줄에서 이름 없는 배열 두 개가 같다고 표현했습니다. 왼쪽 항에 있는 배열은 a, b의 원소를 가지고 있는 배열이고, 오른쪽 항의 배열은 10과 20을 원소로 가지고 있는 배열입니다. 따라서 a는 10이 되고, b는 20 이 됩니다.
이처럼 변수에 직접 할당하는 것이 아닌 배열의 원소로서 값을 할당하는 것을 비구조화 할당이라고 합니다.
({ a, b } = { a: 10, b: 20 });
console.log(a); // 10
console.log(b); // 20
비구조화 할당은 위의 코드와 같이 배열 뿐아니라 객체에서도 가능한 표현법입니다. *(두 객체를 비교할 때는 비교식 전체를 괄호로 감싸야 합니다) 두 객체가 같을 때, 왼쪽 항의 a는 할당되지 않았지만 오른쪽 항 객체의 속성값을 할당받습니다.
// Stage 3 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}
배열에서와 마찬가지로 전개연산자를 활용한 객체에서의 비구조화 할당 역시 나머지 배열을 할당합니다. (오른쪽 항의 첫 번째, 두 번째 속성은 각각 변수 a, b에 할당되고, 나머지 c, d 속성은 rest변수에 객체로서 할당된다)
배열array
const animalList = ["CAT", "DOG", "TIGER"];
const cat = animalList[0];
const dog = animalList[1];
const tiger = animalList[2];
console.log(cat); // CAT
console.log(dog); // DOG
console.log(tiger); // TIGER
animalList라는 변수는 순서대로 'cat', 'dog', 'tiger'를 가지고 있는 배열입니다.
이 변수가 가진 값을 각각 변수에 꺼내어 쓰려고 하면 이렇게 직접 하나하나 지정을 해주어야 합니다.
이렇게 작성하는 것은 아무래도 귀찮은 작업이고, 코드를 읽기에도 괜히 복잡하게 보이는 단점이 있습니다.
const [cat, dog, tiger] = ["CAT", "DOG", "TIGER"];
console.log(cat); // CAT
console.log(dog); // DOG
console.log(tiger); // TIGER
비구조화 할당을 이용하면 위처럼 간단하게 작성할 수 있습니다.
나머지 패턴
const animalList = ["CAT", "DOG", "TIGER"];
const [cat, ...
더 나아가, 앞의 3개 요소와 나머지 요소를 분리하고 싶을 때에는 위 예시코드처럼 작성할 수 있습니다
기본값
const [cat, dog, tiger, animal = "MONKEY"] = ["CAT", "DOG", "TIGER"];
console.log(cat); // CAT
console.log(dog); // DOG
console.log(tiger); // TIGER
console.log(animal); // MONKEY
비구조화 할당을 할 때에는 기본값을 지정할 수 있습니다.
오브젝트object
const animals = {
cat: "CAT",
dog: "DOG",
tiger: "TIGER"
};
const cat = animals.cat;
const dog = animals.dog;
const tiger = animals.tiger;
console.log(cat); // CAT
console.log(dog); // DOG
console.log(tiger); // TIGER
위와 같이 오브젝트에서 요소를 꺼내어 변수에 할당할 때에도 가능합니다.
const { cat, dog, tiger } = {
cat: "CAT",
dog: "DOG",
tiger: "TIGER"
};
console.log(cat); // CAT
console.log(dog); // DOG
console.log(tiger); // TIGER
위와 같이 작성하면 비구조화 할당을 수행하며, 변수의 이름과 같은 key에 있는 값이 담깁니다.
나머지 패턴
const { cat, ...animals } = {
cat: "CAT",
dog: "DOG",
tiger: "TIGER"
};
console.log(cat); // CAT
console.log(animals); // { dog: DOG, tiger: TIGER }
배열에서의 비구조화 할당에 나머지 패턴이 있듯이, 오브젝트에서의 비구조화 할당에도 나머지 패턴이 있습니다.
기본값
const { cat, dog, tiger, monkey = "monkey" } = {
cat: "CAT",
dog: "DOG",
tiger: "TIGER"
};
console.log(cat); // CAT
console.log(dog); // DOG
console.log(tiger); // TIGER
console.log(monkey); // MONKEY
배열에서의 비구조화 할당처럼 오브젝트에서도 기본값을 지원합니다.
✔ 참고