본문 바로가기

JavaScript

JavaScript - 구조분해

배열을 활용한 구조분해

const rank = [‘dog’, ‘cat’, ‘bird’, ‘mouse’];

// 배열의 값을 변수에 담기
const beef = rank[0];
const salmon = rank[1];
const corn = rank[2];
const salad = rank[3];

// 구조분해 문법으로 담기
const [beef, salmon, corn, salad] = rank;

console.log(beef); // dog
console.log(salmon); // cat
  • rank를 분해해서 왼쪽 배열의 값으로 집어넣은 것이다.
  • 구조분해시, 우측값이 없거나 우측값이 배열이 아니면 에러가 발생한다.

배열의 길이가 긴 경우

const rank = [‘dog’, ‘cat’, ‘bird’, ‘mouse’, ‘rabbit’];
const [beef, salmon, corn, …salad] = rank;
console.log(salad); // [‘mouse’, ‘rabbit’]

구조분해 salad에 스프레드구문을 사용하여 mouse와, rabbit을 배열로 받았다.

배열의 길이가 짧은 경우

const rank = [‘dog’, ‘cat’, ‘bird’];
const [beef, salmon, corn, salad = ‘없음’] = rank;
console.log(salad); // ‘없음’

기본값을 할당할 수 있다.

두 변수의 값을 서로 바꾸는데에 쓸 수도 있다.

let catName = ‘kong’;
let dogName = ‘mimi’;

[catName, dogName] = [dogName, catName];

console.log(catName , dogName); // mimi kong

두 변수의 값을 바꿀때에는 temp변수에 한 쪽을 담아논 후 옮기는 과정이 필요했는데,

구조분해를 이용하면 편리하다.

 

객체를 활용한 구조분해

const macbook = {
	title : ‘맥북 프로 16형’,
	price : 3500000,
	memory : ’16GB’
}

// 변수에 객체의 프로퍼티값 담기
const title = macBook.title;
const price = macBook.price;

// 구조분해 문법으로 담기
const { title, price } = macBook;

// 구조분해 문법으로 프로퍼티네임을 변경하며 담기
const { title : product, price } = macBook;
console.log(title); //error 
console.log(product); // ‘맥북 프로 16형’

객체에서도 스프레드 구문을 통해서 아래와같이 작성 가능하다.

const { title, …rest } = macBook;

이렇게하면 titls만 title변수에 담기고, 나머지 프로퍼티들은 rest에 객체형태로 담긴다.

 

 

만약 porpertyName이 변수로는 사용할 수 없는 단어인 경우라면 새로운 이름을 지정해줘야한다.

const macbook = {
	title : ‘맥북 프로 16형’,
	price : 3500000,
	’serial-num’ : ’ABCDEFGH’
}
const {[‘serial-num] : serialNum} = macbook;
console.log(serialNum); // ABCDEFGH

 

기본값을 주기위해서는 아래와같이 작성한다.

const { title : product, price=4000000 } = macBook;

 

 

 

함수를 활용한 구조분해

function getArray(){
	return [‘dog’, ‘cat’, ‘bird’];
}
const [animal1, animal2, animal3] = getArray();

구조분해 할 때, 우항은 배열이 왔어야했는데 배열을 리턴하는 함수를 사용해도 된다.

function printBestAnimals(…arg){
	const [dog, cat, …rest] = args;
	console.log(`best animal is ${dog}`);
	console.log(`also ${cat}`);

	for(let animal of rest){
		console.log(`and ${animal}`);
	}
}

printBestAnimals(‘mimi’, ‘kong’, ‘ann’, ‘kathy’);

위와같은 함수에서 구조분해를 파라미터에서 해버버리면 아래와같이 작성할 수 있다.

function printBestAnimals([dog, cat, …rest]){

	console.log(`best animal is ${dog}`);
	console.log(`also ${cat}`);

	for(let animal of rest){
		console.log(`and ${animal}`);
	}
}

const ranks = [‘mimi’, ‘kong’, ‘ann’, ‘kathy’];
printBestAnimals(ranks);

 

 

보통 함수에서 파라미터를 객체로 받는다면 아래과같이 작성할 수 있다.

function printSummary(object){
	console.log(object.title);
	console.log(object.price);
	console.log(object.memory);
}

계속해서 파라미터에 접근하는 것. 

하지만 아래와같이 바꿀 수 있다.

// 함수 내부에서 구조분해
function printSummary(object){
	const { title, price, memory } = object;

	console.log(title);
	console.log(price);
	console.log(memory);
}

// 파라미터에서 구조분해
function printSummary( { title, price, memory } ){
	console.log(title);
	console.log(price);
	console.log(memory);
}

이렇게 구조분해를 통해 코드를 간단히 할 수 있는데, 아래는 변수뿐아니라 html, dom에 접근할때도 활용할 수 있다는 예를 보여준다.

const btn = document.querySelector(‘#login-btn’);
btn.addEventListener(‘click’, (event) => {
	event.target.classList.toogle(‘checked’);
	event.target.classList.toogle(‘clicked’);
})

하지만 위의 코드는 event.target객체에 계속해서 접근중인데 이것은 아래와 같이 수정가능하다.

// target까지 구조분해
btn.addEventListener(‘click’, ({target}) => {
	target.classList.toogle(‘checked’);
	target.classList.toogle(‘clicked’);
})

// classList까지 구조분해( 중첩 객체 구조 분해(nested Object Destructuring )
btn.addEventListener(‘click’, ({target: { classList }}) => {
	classList.toogle(‘checked’);
	classList.toogle(‘clicked’);
})

위 코드에서, classList까지 구조분해 하는 코드를 중첩 객체 구조 분해(nested Object Destructuring)이라고 한다.

 

'JavaScript' 카테고리의 다른 글

JavaScript - 배열 함수 및 유용한 내부 기능  (0) 2023.10.11
JavaScript - 에러와 에러객체  (1) 2023.10.11
JavaScript - 객체의 프로퍼티  (0) 2023.10.11
JavaScript - Spread  (0) 2023.10.11
JavaScript - 문장과 표현식  (0) 2023.10.11