비구조화
비구조화
비구조화(destructuring)란?
- 객체나 배열 등의 요소 안에 있는 변수들을
바깥으로 끄집어 내서 사용할 수 있도록 하는 것
객체의 비구조화
- 객체의 내부 요소에 접근하는 기본적인 방식
//다음과 같이 학생에 대한 정보가 있다고 했을 때
const student = {
name : "who",
classInfo : {
gradeNo : 3,
classNo : 10
},
score : {
math : 97,
sience : 87,
english : 65
}
};
//해당 학생의 수학 점수를 보기 위한 방법
console.log("score :", student.score.math);
//보통은 이렇게 하지만 만약 math라는 항목이 없다면 undefined가 출력된다.객체의 내부 요소에 접근하는 방식
//위의 코드에 있는 student 객체에서
//이름, 학년, 반, 수학 점수를 찾을 때 밑의 코드처럼 선언한다.
const {
name,
classInfo : {gradeNo, classNo},
score : {math}
} = student;
//방금 작성된 코드는 다음의 코드와 내용이 같다.
//const name = student.name;
//const gradeNo = student.classInfo.gradeNo;
//const classNo = student.classInfo.classNo;
//const math = student.score.math;
//실제로 math를 찍어보면 결과가 나온다.
console.log(math); //출력 : 97
//만약, 수학 시험날에 일이 있어서 시험이 못치는 경우도 있으니
//그럴 때는 default value를 주면 된다.
//혹시나 var나 let으로 선언해서
//저 코드에서 math = 100;을 해도
//실제 student의 값이 바뀌지는 않는다.이름 변경 (Renaming)
//아까 작성하던 코드 중에서 수학 점수를 찾을 때 math라는 이름으로 사용되었다.
//하지만 이렇게 짧은 코드가 아니라 무척 길고 어려운 코드를 짜다보면
//math라는게 해당 과목에 대한 점수를 얘기하는 건지
//담당 선생님을 얘기하는 건지 헷갈릴 수가 있다.
//그래서 객체의 비구조화를 진행할 때 Renaming을 진행한다.
//아까 쓰던 코드는 다음과 같다.
const {
name,
classInfo : {gradeNo, classNo},
score : {math}
} = student;
//여기서 math를 mathScore로 해주고,
//혹시 모르니 점수를 기본 값으로 0을 주려고 한다면 다음과 같이 작성하면 된다.
const {
name,
classInfo : {gradeNo, classNo},
score : {math : mathScore = 0}
} = student;배열의 비구조화
- 가져온 정보를 조작할 일이 없을 때 쓰는 것이 좋다.
- 배열의 내부 요소에 접근하는 기본적인 방식
const test = ["testA", "testB", "testC"];
console.log(test[0]);//출력 : testA- 배열의 내부 요소에 접근하는 새로운 방식
- 예시 1
const test = ["testA", "testB", "testC"];
const [test0, test1, test2] = test; //각 인덱스에 객체처럼 이름을 준다고 생가하면 된다.
console.log(test0); //출력 : testA
1
- 예시 2
//객체를 반환하는 함수에도 사용할 수 있다.
const test = () => ["testA", "testB", "testC"];
const [test0, test1, test2] = test();
console.log(test0); //출력 : testA
Variable Swapping (값 교환)
- 일반적인 값 교환
var a = 1, b = 2 ,temp;
console.log("a =>",a,", b =>",b); //출력 : a => 1 , b => 2
temp = a;
a = b;
b = temp;
console.log("a =>",a,", b =>",b); //출력 : a => 2 , b => 1
- 배열의 비구조화를 통한값 교환
var a = 1, b = 2 ,temp;
console.log("a =>",a,", b =>",b); //출력 : a => 1 , b => 2
[a, b] = [b, a];
console.log("a =>",a,", b =>",b); //출력 : a => 2 , b => 1
Variable Omitting (값 생략)
const test = ["testA", "testB", "testC"];
//위의 test 배열에서 "testC"만 가져오고 싶을 때
const [ , , omittingTest] = test;
console.log(omittingTest); //출력 : testC함수의 비구조화
- 함수의 내부 요소에 접근하는 기본적인 방식
//인자가 너무 많아지면 좋지 않다.
function test (a, b, c, d, e){
...;
}
- 함수의 내부 요소에 접근하는 새로운 방식
//인자가 많으면 아예 인자를 객체로 받는다.
function test({name, classInfo, score}){
console.log(score.math);
}
//함수 호출
test({
name : "who",
classInfo : {
gradeNo : 3,
classNo : 10
},
score : {
math : 97,
sience : 87,
english : 65
}
});
//출력 : 97
변수명 단축
//만약 다음과 같은 함수가 있다고 가정해보자.
const test = () => console.log("execute function, function name : test");
//그 다음에는 obj라는 객체가 있고
//해당 객체에는 whatever과 test라는 항목이 있다고 했을 때
//whatever에는 "whatever text"를
//test에는 아까 선언한 test라는 함수를 저장하고자 한다면
//일반적으로는 다음과 같이 선언한다.
const obj = {
whatever : "whatever text",
test : test
};
obj.test(); //출력 : execute function, function name : test
//하지만 발전해버린 JavaScript는 똑똑해졌기 때문에
//만약 객체에서 해당 항목에 값을 생략해버리면
//해당 항목과 같은 이름을 가진 변수를 값으로 저장한다.
const obj = {
whatever : "whatever text",
test
};
obj.test(); //출력 : execute function, function name : test 이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.