✓ 프로세스(process)
- 프로그램을 실행하는 단위
- 하나의 프로그램 실행은 하나의 프로세스를 가지고, 그 프로세스 내부에서 모든 작업 처리
✓ 스레드(thread)
- 하나의 프로그램 내에서 동시에 여러 개의 복잡한 작업을 수행할 필요성 대두
- 프로세스보다 작은 실행 단위
- 하나의 프로세스 내에서 여러 개의 스레드를 만들 수 있음
- 스레드끼리 메모리 공유 -> 여러 작업 동시 수행
✓ 자바스크립트 : 싱글 스레드
- 최초의 자바스크립트는 브라우저에서 HTML을 그리는데 도움을 주는 보조적 역할
- 스레드는 하나의 프로세스에서 동시에 서로 같은 자원에 접근할 수 있는 문제(동시성 문제) 발생 ex) DOM 조작
-> 싱글 스레드에서 동기 방식으로 작동되도록 설계
- 한 번에 하나의 작업만 동기적(직렬 방식)으로 처리
-> 요청이 시작된 이후에는 무조건 응답을 받은 이후에 다른 작업 처리, 그동안 다른 모든 작업 대기
<-> 비동기(asynchronous) : 한 번에 여러 작업 실행
- Run-to-completion : 모든 코드는 동기식으로 한번에 하나씩 순차적으로 처리
✓ 이벤트 루프(Event loop)
- 자바스크립트 런타임 외부에서 자바스크립트 비동기 실행을 돕기 위해 만들어진 장치
- 호출 스택에 실행 중인 코드가 있는지, 태스크 큐에 대기 중인 함수가 있는지 반복해서 확인
- 호출 스택이 비워 있는지 여부를 확인하고, 수행해야 할 코드가 있다면 오래된 태스크부터 순차적으로 꺼내와서 자바스크립트 엔진을 이용해 실행
-> 동기식으로 수행되는 메인 스레드가 아닌 태스크 큐가 할당되는 별도의 스레드에서 비동기 함수 수행
function bar() {
console.log('bar');
}
function baz() {
console.log('baz');
}
function foo() {
console.log('foo');
setTimeout(bar(), 0);
baz();
}
foo(); // foo -> baz -> bar
1) call stack : Foo()
2) call stack : console.log('foo')
3) console.log('foo') 실행
4) call stack : setTimeout(bar(), 0)
5) 타이머 이벤트 실행 후 -> task queue로 이동, call stack에서 제거
6) call stack : baz()
7) call stack : console.log('baz')
8) console.log('baz') 실행
9) call stack에서 baz() 제거
10) call stack에서 foo() 제거
11) event loop : call stack empty 체크 후 task queue 확인
12) console.log('bar') task queue -> call stack 이동
13) console.log('bar') 실행
14) call stack에서 bar() 제거
✓ 호출 스택(call stack)
- 자바스크립트에서 수행해야 할 코드나 함수를 순차적으로 담아두는 스택
✓ 태스크 큐(task queue)
- 자료구조 set 형태
- 실행해야 할 태스크 : 비동기 콜백 함수, 이벤트 핸들러
- ex) setTimeout, setInterval, setImmediate
✓ 마이크로 태스크 큐
- 기존 태스크 큐와 다르게 다른 태스크 처리
- 마이크로 태스크 큐가 빌때까지 기존 태스크 큐의 실행은 뒤로 미뤄짐
- ex) process.nextTick, promises, queueMicroTask, MutaionObserver
- 각 마이크로 태스크 큐가 끝날 때 마다 한 번씩 렌더링(동기 코드와 유사)
- cf) 동기 코드는 동기 코드 실행 후 렌더링
✓ 구조 분해 할당(Destructing assignment)
- 배열 또는 객체의 값을 분해해 개별 변수에 즉시 할당
- w전개 연산자는 마지막에 사용
✓ 배열 구조 분해 할당
const array = [1, 2, 3, 4, 5];
const [first, second, third, ...arrayRest] = array;
// first 1, second 2, third 3, arrayRest [4, 5]
const first, , , , fifth] = array;
// 2, 3, 4 는 표현식이 없으므로 변수 할당 생략
// first 1, fifth 5
const array2 = [1, 2];
const [a = 10, b = 10, c = 10] = array2;
// a 1, b 2, c 10
const [a = 1, b = 1, c = 1, d = 1, e = 1] = [undefined, null, 0 , ''];
// undefined일 때만 기본값으로 사용
// a 1, b null, c 0, d '', e 1
✓ 객체 구조분해 할당
const object = {
a: 1,
b: 2,
c: 3,
d: 4,
e: 5
};
const { a, b, c ..objectRest } = object;
// a 1, b 2, c 3, objectRest = { d: 4, e: 5 ]
const object2 = {
a: 1,
b: 2
}
const { a: first, b: second } = object2;
// first 1, second 2
const { a = 10, b = 10, c = 10 } = object2;
// 기본값 부여
// a 1, b 2, c 10
const key = 'a';
const { [key]: a } = object2;
// a 1
✓ 전개 구문
- 전개 연산자 ... 사용
- 기존의 객체나 배열에 영향을 미치지 않고 값 복사
✓ 객체 초기자
- 객체를 선언할 때 객체에 넣고자 하는 키와 값을 가지고, 변수가 이미 존재한다면 해당 값을 간결하게 넣어주는 방식
const a = 1;
const b = 2;
const obj = { a, b }; // { a: 1, b: 2 }
✓ Array 프로토타입 메서드
- map : 인수로 전달받은 배열과 똑같은 길이의 새로운 배열을 반환하는 메서드, 각 아이템을 순회하면서 콜백으로 연산한 결과로 구성된 새로운 배열 생성
- filter : 콜백 함수를 인수로 받아 이 함수의 truthy 조건을 만족하는 경우에만 해당 원소를 반환하는 메서드, filter 결과에 따라 원본 배열 길이 이하의 새로운 배열 반환
- reduce : 콜백 함수와 초기값을 인수로 받아 초기값에 따라 배열, 객체 또는 그 외의 무언가를 반환하는 메서드, reducer 콜백 함수를 실행하고 초기값에 누적해 결과 반환
- forEach : 콜백 함수를 받아 배열을 순회하며 단순히 콜백 함수를 실행하기만 하는 메서드, 반환값 undefined
const arr = [1, 2, 3, 4, 5];
arr.map((item) => item * 2); // [2, 4, 6, 8, 10]
arr.filter((item) => item % 2 === 0); // 2, 4
arr.reduce((result, item) => { return result + item}, 0); // 15
arr.forEach((item) => console.log(item)); // 1, 2, 3
✓ 삼항조건연산자
- 조건문 ? 참일 때 값 : 거짓일 때 값
'JavaScript' 카테고리의 다른 글
240525 리액트 스터디 : DOM, Text, in / hasOwnProperty (0) | 2024.06.12 |
---|---|
240518 리액트 스터디 : 자바스크립트 이벤트 루프 (0) | 2024.06.12 |
240511 리액트 스터디 : JavaScript 클래스 / 클로저 (0) | 2024.05.11 |
Deep Dive : JavaScript 클래스 / 클로저 (0) | 2024.05.11 |
240504 리액트 스터디 : JavaScript 함수 (0) | 2024.05.04 |