반복 가능한(iterable, 이터러블) 객체는 배열을 일반화한 객체입니다. 이터러블 이라는 개념을 사용하면 어떤 객체에든 for..of 반복문을 적용할 수 있습니다.
배열은 대표적인 이터러블입니다. 배열 외에도 다수의 내장 객체가 반복 가능합니다. 문자열 역시 이터러블의 예입니다.
이터러블 객체의 핵심은 '관심사의 분리(Separation of concern, SoC)'
->이렇게 하면 이터레이터 객체와 반복 대상인 객체를 분리할 수 있습니다.
이터러블엔 메서드 Symbol.iterator가 반드시 구현되어 있어야 합니다.
- obj[Symbol.iterator]의 결과를 이터레이터라고 부릅니다. 이터레이터는 이어지는 반복 과정을 처리
- 객체 {done: Boolean, value: any}을 반환하는 메서드 next()가 반드시 구현되어 있어야한다.
데이터를 저장한다는 점에서 객체와 유사합니다. 다만, 맵은 키에 다양한 자료형을 허용한다는 점에서 차이가 있습니다.
중복을 허용하지 않는 값을 모아놓은 특별한 컬렉션입니다.
셋에는 키가 없는 값이 저장됩니다.
<맵과 셋의 공통점>
컬렉션 내 요소나 값을 재 정렬하거나 (배열에서 인덱스를 이용해 요소를 가져오는 것처럼) 숫자를 이용해 특정 요소나 값을 가지고 오는 것은 불가능합니다.
캐싱(caching)
시간이 오래 걸리는 작업의 결과를 저장해서 연산 시간과 비용을 절약해주는 기법입니다.
- 캐시 메모리..
< 위크셋과 위크맵의 공통점>
구성 요소 전체를 대상으로 하는 메서드를 지원하지 않는다.
구성 요소 하나를 대상으로 하는 메서드만 지원!Object.keys, values, entries
- Object.keys(obj) – 객체의 키만 담은 배열을 반환합니다.
- Object.values(obj) – 객체의 값만 담은 배열을 반환합니다.
- Object.entries(obj) – [키, 값] 쌍을 담은 배열을 반환합니다.
객체엔 map, filter 같은 배열 전용 메서드를 사용할 수 없습니다.
<객체나 배열에 저장된 데이터 전체가 아닌 일부만 필요한 경우>
객체나 배열을 변수로 '분해’할 수 있게 해주는 특별한 문법인 구조 분해 할당(destructuring assignment) 을 사용
객체나 배열이 다른 객체나 배열을 포함하는 경우, 좀 더 복잡한 패턴을 사용하면 중첩 배열이나 객체의 정보를 추출
let options = {
title: "My menu",
items: ["Item1", "Item2"]
};
function showMenu({
title = "Untitled",
width: w = 100, // width는 w에,
height: h = 200, // height는 h에,
items: [item1, item2] // items의 첫 번째 요소는 item1에, 두 번째 요소는 item2에 할당함
}) {
alert( `${title} ${w} ${h}` ); // My Menu 100 200
alert( item1 ); // Item1
alert( item2 ); // Item2
}
showMenu(options);
중첩객체와 콜론을 조합하여 구조분해.
- 구조분해 할당을 하면 객체나 배열을 변수로 바로 연결할 수 있다.
- 객체 분해하기
let {prop : varName = default, ...rest} = object
오브젝트의 프로퍼티 prop의 값은 변수 varName에 할당.
오브젝트에 prop이 없으면 default가 varName에 할당된다.
3. 배열 분해하기let [item1 = default, item2, ...rest] = array
- 할당 연산자 좌측의 패턴과 우측의 구조가 같으면 중첩 배열이나 객체가 있는 복잡한 구조에서도 원하는 데이터를 뽑아낼 수 있다.
날짜를 저장할 수 있고, 날짜와 관련된 메서드도 제공해주는 내장 객체 Date
--> Date 객체를 활용하면 생성 및 수정 시간을 저장하거나 시간을 측정할 수 있고, 현재 날짜를 출력하는 용도 등으로도 활용
Date.now()를 사용하면 현재 시각의 타임스탬프를 빠르게 구할 수 있습니다.
네트워크를 통해 객체를 어딘가에 보내거나 로깅 목적으로 객체를 출력해야 한다면 객체를 문자열로 전환해야함.
--> 이때 전환된 문자열엔 원하는 정보가 있는 객체 프로퍼티 모두가 포함되어야만 합니다.
JSON (JavaScript Object Notation)은 값이나 객체를 나타내주는 범용 포맷.
다른 언어에서도 사용되는 호환성 덕분에 JSON을 데이터 교환 목적으로 사용하는 경우가 많다. (클라이언트 언어가 javascript 인 경우일 때)
이렇게 변경된 문자열은 JSON으로 인코딩된(JSON-encoded), 직렬화 처리된(serialized), 문자열로 변환된(stringified), 결집된(marshalled) 객체라고 부릅니다. 객체는 이렇게 문자열로 변환된 후에야 비로소 네트워크를 통해 전송하거나 저장소에 저장할 수 있습니다.
JSON으로 인코딩된 객체의 특징 (일반 객체와 차이점)
1. 문자열은 큰따옴표로 감싸야 합니다. JSON에선 작은따옴표나 백틱을 사용할 수 없습니다('John'이 "John"으로 변경된 것을 통해 이를 확인할 수 있습니다).
2. 객체 프로퍼티 이름은 큰따옴표로 감싸야 합니다(age:30이 "age":30으로 변한 것을 통해 이를 확인할 수 있습니다).
재귀는 큰 목표 작업 하나를 동일하면서 간단한 작업 여러 개로 나눌 수 있을 때 유용한 프로그래밍 패턴
실행 컨텍스트는 함수 실행에 대한 세부 정보를 담고 있는 내부 데이터 구조
상당수의 자바스크립트 내장 함수는 인수의 개수에 제약을 두지 않습니다.
arguemnts라는 특별한 유사 배열 객체(array-like object)를 이용하면 인덱스를 사용해 모든 인수에 접근할 수 있습니다.
배열이 아니기 때문에 배열 메서드를 사용할 수 없다는 단점이 있다. 또한 인수 전체를 담기 때문에 나머지 매개변수처럼 인수의 일부만 사용할 수 없다는 단점도 존재한다.
배열을 통째로 매개변수에 넘겨주는 것
전개 문법은 for..of와 같은 방식으로 내부에서 iterator(반복자)를 사용해 요소를 수집
Array.from(obj)와 [...obj] 차이점
1. Array.from은 유사 배열 객체와 이터러블 객체 둘 다에 사용할 수 있습니다.
2. 전개 문법은 이터러블 객체에만 사용할 수 있습니다.
무언가를 배열로 바꿀 때는 전개 문법보다 Array.from이 보편적으로 사용
함수 내부에서 선언한 함수는 ‘중첩(nested)’ 함수라고 부릅니다.
자바스크립트에선 실행 중인 함수, 코드 블록 {...}, 스크립트 전체는 렉시컬 환경(Lexical Environment) 이라 불리는 내부 숨김 연관 객체(internal hidden associated object)를 갖습니다.
<렉시컬 환경 객체의 구성>
1. 환경 레코드(Environment Record) – 모든 지역 변수를 프로퍼티로 저장하고 있는 객체입니다. this 값과 같은 기타 정보도 여기에 저장됩니다.
2. 외부 렉시컬 환경(Outer Lexical Environment) 에 대한 참조 – 외부 코드와 연관됨
’변수’는 특수 내부 객체인 환경 레코드의 프로퍼티일 뿐입니다. '변수를 가져오거나 변경’하는 것은 '환경 레코드의 프로퍼티를 가져오거나 변경’함을 의미
함수는 변수와 마찬가지로 값입니다.
다만 함수 선언문(function declaration)으로 선언한 함수는 일반 변수와는 달리 바로 초기화된다는 점에서 차이가 있습니다.
함수를 호출해 실행하면 새로운 렉시컬 환경이 자동으로 만들어집니다.