객체
와 배열
은 자바스크립트에서 가장 많이 쓰이는 자료 구조이다.
키를 가진 데이터 여러 개를 하나의 엔티티에 저장할 땐 객체를, 컬렉션에 데이터를 순서대로 저장할 땐 배열을 사용한다.
개발을 하다 보면 함수에 객체나 배열을 전달해야 하는 경우가 생기곤 한다. 가끔은 객체나 배열에 저장된 데이터 전체가 아닌 일부만 필요한 경우도 생긴다.
이럴 때 객체나 배열을 변수로 "분해"할 수 있게 해주는 특별한 분법인 구조 분해 할당
을 사용할 수 있다.
이 외에도 함수의 매개변수가 많거나 매개 변수 기본값이 필요한 경우 등에서 구조 분해는 그 진가를 발휘할 수 있다.
// 이름과 성을 요소로 가진 배열
let arr = ["Giwook", "jeong"]
// 구조 분해 할당을 이용해
// firstName엔 arr[0]을
// surname엔 arr[1]을 할당하였습니다.
let [firstName, surname] = arr;
alert(firstName); // Giwook
alert(surname); // Jeong
이제 인덱스를 이용해 배열에 접근하지 않고도 변수로 이름과 성을 사용할 수 있다.
아래 예시처럼 split
같은 반환 값이 배열인 메서드를 함께 활용해도 좋다.
let [firstName, surname] = "Giwwok Jeong".split(' ');
'분해'는 '파괴'를 의미하지 않는다
구조 분해 할당이란 명칭은 어떤 것을 복사한 이후에 변수로 분해해준다는 의미 때문에 붙여졌다. 이 과정에서 분해 대상은 수정 또는 파괴되지 않는다.
배열의 요소를 직접 변수에 할당하는 것보다 코드 양이 줄어든다는 점만 다르다.
쉼표를 사용하여 요소 무시하기
// 두 번째 요소는 필요하지 않음 let [first, , third] = ["a", "b", "c", "d"]; alert( third ); // c
두 번째 요소는 생략되었지만, 세 번째 요소는 third라는 변수에 할당된 것을 확인할 수 있다.
할당 연산자 우측엔 모든 이터러블이 올 수 있다.
배열뿐만 아니라 모든 이터러블에 구조 분해 할당을 적용할 수 있다.
let [a, b, c] = "abc"; // ["a", "b", "c"] let [one, two, three] = new Set([1, 2, 3]);
.entries() 로 반복하기
이 메서드와 구조 분해를 조합하면 객체의 키와 값을 순회해 변수로 분해 할당할 수 있다.
let user = { name: "Giwook", age: 27 }; // 객체의 키와 값 순회하기 for (let [key, value] of Object.entries(user)) { alert(`${key}:${value}`); // name:Giwook, age:27 차례대로 출력 }
map에도 물론 이 메서드를 활용할 수 있다.
let user = new Map(); user.set("name", "Giwook"); user.set("age", "27"); for (let [key, value] of user) { alert(`${key}:${value}`); // name:Giwook, then age:27 }
...로 나머지 요소 가져오기
배열 앞쪽 값 몇 개만 필요하고 그 이후 이어지는 나머지 값들은 한데 모아서 저장하고 싶을 떄가 있다.
let [name1, name2, ...rest] = ["a", "b", "c", "d"]; alert(name1); // a alert(name2); // b // `rest`는 배열. alert(rest[0]); // c alert(rest[1]); // d alert(rest.length); // 2
할당하고자 하는 변수의 개수가 분해하고자 하는 배열의 길이보다 크더라도 에러가 발생하지 않는다.
할당할 값이 없으면 undefined로 취급되기 때문이다.let [first, second] = []; alert(first); // undefined alert(second); // undefined
=
을 이용하면 할당할 값이 없을 떄 기본으로 할당해 줄 값인 기본값을 설정할 수 있다.// 기본값 let [name = "a", surname = "default"] = ["first"]; alert(name); // first (배열에서 받아온 값) alert(surname); // default (기본값)
복잡한 표현식이나 함수 호출도 기본값이 될 수 있다. 이렇게 기본식으로 표현식이나 함수를 설정하면 할당할 값이 없을 때 표현식이 평가되거나 함수가 호출된다.
기본값으로 두 개의
prompt
함수를 할당한 예시를 살펴보면, 값이 제공되지 않았을 때만 함수가 호출되므로prompt
는 한 번만 호출된다.// name의 prompt만 실행됨 let [surname = prompt('성을 입력하세요.'), name = prompt('이름을 입력하세요.')] = ["정"]; alert(surname); // 김 (배열에서 받아온 값) alert(name); // '이름을 입력하세요' (prompt에서 받아온 값)
분해는 파괴를 의미하지 않는다 요건 처음 알았어요 굳굳👍👍