※ 구조 분해 (destructuring)
- 객체 안의 필드, 배열을 구성하는 원소를 변수에 쉽게 대입할 수 있도록 활용
※ 객체의 구조 분해 할당
- const { var_name } = object_name;
- 반드시 객체의 필드 이름과 변수의 이름이 같아야 함.
- 중괄호 { } 안에 여러개의 변수가 들어갈 수 있으며, 순서는 상관없음
ex) 객체의 구조분해 할당 예시
- 객체를 구조 분해하여 할당한 변수의 값을 변경하여도, 객체 원본의 값은 변하지 않음.
▶ 객체를 구조 분해하여 함수의 인자로 받는 경우
(1) 기존 함수 인자에 객체를 받는 방식
(2) 객체 구조분해 후, 인자로 받는 방식
- 화살표 함수 ({firstname}) => 에서 매개변수가 1개이지만 괄호( ) 생략 불가
- => 함수 body 부분도 아닌데 중괄호 { }만 남게 되므로 오류 발생
- {firstname}에서 중괄호{ } 또한 생략 불가
- => 객체 자체를 인자로 받게 됨.
※ 배열의 구조분해 할당
- const [ var_name ] = array_name;
- var_name의 순서대로 배열로부터 할당 받음
- var_name에는 여러개의 변수가 올 수 있으며
- 배열에서 할당 받기 싫은 부분은 var_name 대신 ',' 를 사용해 생략
- => 리스트 매칭 : 불필요한 변수는 ,(콤마)를 사용해 생략
- array_name은 배열의 이름 or 직접 배열을 설정할 수 있음
ex 1) 배열의 첫번째 원소만 할당받는 경우
- 위 경우는 배열의 첫번째 원소만 필요하므로
- 굳이 리스트 매칭(콤마 사용)을 할 필요가 없음
- 그냥 2, 3번째에 해당하는 변수 자리를 비워두면 됨.
- 변수를 나열한 순서대로 할당받는 특성 이용
ex 2) 배열의 세번째 원소만 할당 받는 경우
- 위 경우는 배열의 세번째 원소만 할당 받고, 1, 2번째 원소는 필요가 없으므로
- '리스트 매칭' (콤마 사용) 을 통해 콤마(,)를 1, 2번째 자리에 연속 사용
- 리스트 매칭을 안하게 되면
- 변수를 나열한 순서대로 할당받는 특성에 의해 첫번째 원소를 할당 받게 됨.
※ 객체 리터럴 (Object literal)
- 객체 리터럴
- 중괄호({})를 사용하여 객체를 만드는 것을 의미
- 리터럴 (literal) : 사람이 이해할 수 있는 문자나 약속된 기호를 사용해 값을 생성하는 표기법
- 속성을 나열할 때는 콤마(,)로 구분
- 중괄호({})를 사용하여 객체를 만드는 것을 의미
ex 1) 예전 방식의 객체 리터럴
- 속성과 할당할 변수가 이름이 같아도
- "속성: 변수" 로 표기하는 번거로움 존재
- 속성으로 함수를 선언할 때, "함수명: function(parameter)" 처럼
- function 키워드를 사용해야하는 번거로움 존재
ex 2) 객체 리터럴 개선
- 속성과 할당할 변수의 이름이 같으면, 속성만 명시 가능해짐
- 속성에 함수를 선언할 때, function 키워드 생략하고 "함수명(parameter)"로 선언 가능해짐
※ 스프레드 연산자 ( . . . )
- 배열의 원소, 객체의 속성을 나열함
- => 배열, 객체 등의 데이터를 확장하거나 복사하거나 분해하는 데 사용
ex 1) 스프레드 연산자 사용 예시
- ...peaks == "대청봉", "중청봉", "소청봉"
- ...canyons == "천불동계곡", "가야동계곡"
- seoraksan == [ "대청봉", "중청봉", "소청봉", "천불동계곡", "가야동계곡" ]
- join('문자'): 배열의 모든 요소를 문자로 연결하여 하나의 문자열로 생성하여 반환
ex 2) reverse( )를 활용한 배열의 구조분해 할당
- reverse( ) : 배열 원본의 순서를 반전시키고, 레퍼런스를 반환
- var peaks = ["대청봉", "중청봉", "소청봉"]
- peaks.reverse( ) => peaks == ["소청봉", "중청봉", "대청봉"] (원본 변형)
- var [ last ] = peaks.reverse()
- 배열의 구조분해 할당 적용
- 원소의 순서가 반전된 peaks의 첫번째 요소를 last에 할당
- => 반전시키기 전의 마지막 요소를 할당하는 것과 같은 효과
ex 3) 스프레드 연산자를 통한 배열 복사
- var [ last ] = [...peaks].reverse()
- [...peaks] 는 peaks를 복사한 배열
- [ ...peaks]에 reverse( )를 해도 peaks(배열 원본)에 영향을 주지 않음
ex 4) 함수의 매개변수에 스프레드 연산자를 적용
- 문자열 여러개를 인자로 받는 함수에서 . . .args를 매개변수로 설정하여
- args를 인자로 받은 문자열들로 구성된 배열로 설정함
- . . .args == "서울", "수원", "천안", "대전", "대구", "부산"
- args == [ "서울", "수원", "천안", "대전", "대구", "부산" ]
- . . .args == "서울", "수원", "천안", "대전", "대구", "부산"
- 배열의 구조분해 할당에서도 스프레드 연산자를 사용하여 새로운 배열을 생성
- var [start, ...remaining] = args
- start: "서울"
- remaining: [수원, 천안, 대전, 대구, 부산]
- var [start, ...remaining] = args
- var [finish, ...stops] = remaining.reverse()
- remaining: [부산, 대구, 대전, 천안, 수원] // 순서 반전됨
- finish: "부산"
- stops: [대구, 대전, 천안, 수원] // 새로운 배열 stops 생성
- remaining: [부산, 대구, 대전, 천안, 수원] // 순서 반전됨
ex 5) 스프레드 연산자를 통한 객체의 속성을 나열
- var backpackingMeals = { ...morning, dinner }
- . . .morning == breakfast: "미역국", lunch: "삼치구이와 보리밥"
- 객체는 배열과 달리 순서는 중요하지 않음
- var backpackingMeals = { ...morning, dinner } or { dinner, ...morning }