Skip to content

Commit

Permalink
πŸ“ 백광인 2024-03-07
Browse files Browse the repository at this point in the history
  • Loading branch information
RookieAND committed Mar 8, 2024
1 parent e447135 commit 993e5e8
Show file tree
Hide file tree
Showing 2 changed files with 219 additions and 0 deletions.
52 changes: 52 additions & 0 deletions docs/RookieAND/dil/2024-03-06.md
Original file line number Diff line number Diff line change
Expand Up @@ -140,3 +140,55 @@ bButton.addEventListener('click', function () {

- ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜λŠ” 경우 μ΄λ²€νŠΈκ°€ λ°œλ™λ˜μ—ˆμ„ λ•Œ 배열이 μƒμ„±λ˜λŠ” 것이 μ•„λ‹Œ, `heavyJobWithClosure` ν•¨μˆ˜κ°€ μ‹€ν–‰λ˜μ–΄ `innerFunc` 에 λ°˜ν™˜λœ ν•¨μˆ˜κ°€ 적재될 λ•Œ μƒμ„±λœλ‹€.
- λ”°λΌμ„œ μ‹€μ œ ν•΄λ‹Ή 배열이 ν•„μš”ν•œ 경우 (Click μ΄λ²€νŠΈκ°€ λ°œλ™λœ μˆœκ°„) κ°€ μ•„λ‹ˆλΌ **항상 longArr 배열을 λ©”λͺ¨λ¦¬μ— μ μž¬ν•΄λ‘κΈ° λ•Œλ¬Έμ—** ν΄λ‘œμ €λ₯Ό μ‚¬μš©ν•˜λŠ” 것이 더 λΉ„νš¨μœ¨μ μ΄λ‹€.

# βœ’οΈ JS λŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ 기반의 Non - Blocking μ–Έμ–΄λ‹€.

### ✏️ JS λŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ μ–Έμ–΄λ‹€.

- JS κ°€ 개발될 λ‹Ήμ‹œμ—λŠ” λ©€ν‹° μ“°λ ˆλ“œμ˜ κ°œλ…μ΄ 크게 μ •μ°©λ˜μ§€ μ•Šμ•˜μ„ λ•Œμ΄κΈ° λ•Œλ¬Έμ— ν•˜λ‚˜μ˜ ν”„λ‘œμ„ΈμŠ€κ°€ 단일 μŠ€λ ˆλ“œλ₯Ό 기반으둜 λ™μž‘ν•˜λŠ” μ‹±κΈ€ μŠ€λ ˆλ“œ 방식을 μ±„νƒν–ˆλ‹€.
- λ”°λΌμ„œ JS μ½”λ“œ λ‚΄ 싀행은 μœ„μ—μ„œ μ•„λž˜λ‘œ 순차적으둜 λ™μž‘ν•˜λ©°, ν•œ κ³³μ—μ„œ 싀행이 였래 걸릴 경우 μ΄ν›„μ˜ μ½”λ“œκ°€ μ‹€ν–‰λ˜μ§€ μ•ŠλŠ” νŠΉμ§•μ„ 가진닀.
- μ΄λ ‡κ²Œ λ™κΈ°μ μœΌλ‘œ μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” μƒν™©μ—μ„œ, μ•žμ„  μ½”λ“œμ˜ 싀행이 μ™„λ£Œλ˜μ§€ μ•Šμ•„ λ‹€μŒ 싀행을 λ§‰λŠ” ν˜„μƒμ„ Blocking 이라 ν•œλ‹€.

### ✏️ JS λŠ” Non - Blocking μ–Έμ–΄λ‹€.

- ν•˜μ§€λ§Œ λΉ„λ™κΈ°μ μœΌλ‘œ λ™μž‘ν•˜λŠ” JS μ½”λ“œλŠ” **이후 μ½”λ“œμ˜ 싀행을 막지 μ•ŠλŠ”λ‹€**. 즉 Non - Blocking ν•˜λ‹€λŠ” νŠΉμ§•μ„ 가진닀.
- ν•˜μ§€λ§Œ JS λŠ” μ‹±κΈ€ μŠ€λ ˆλ“œμΈλ° μ–΄λ–»κ²Œ ν•΄λ‹Ή μž‘μ—…μ„ λ³‘λ ¬λ‘œ μ‹€ν–‰ν•  수 μžˆλŠ”κ°€? μ΄λŠ” λΈŒλΌμš°μ €μ—μ„œ μ§€μ›ν•˜λŠ” λ©€ν‹° μ“°λ ˆλ“œ 기반의 Web API λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

> λΉ„λ™κΈ°λ‘œ λ™μž‘ν•œλ‹€ VS Non Blocking ν•˜λ‹€.
- λΉ„λ™κΈ°λ‘œ λ™μž‘ν•œλ‹€ : μ•žμ„  μ½”λ“œμ™€ 이후 μ½”λ“œμ˜ μ‹€ν–‰ μˆœμ„œκ°€ 보μž₯λ˜μ§€ μ•ŠμŒμ„ 의미.
- Non - Blocking ν•˜λ‹€ : μ•žμ„  μ½”λ“œμ˜ 싀행이 μ™„μ „νžˆ μ’…λ£Œλ˜κΈ° 이전에 이후 μ½”λ“œκ°€ λ°”λ‘œ μ‹€ν–‰λœλ‹€. 즉 두 μž‘μ—…μ„ λ³‘λ ¬λ‘œ μ‹€ν–‰ν•  수 μžˆλ‹€. (μ‹€μ œλ‘œλŠ” μ™„μ „νžˆ 같은 타이밍에 μ‹€ν–‰λ˜μ§€ μ•ŠλŠ”λ‹€.)

# βœ’οΈ 이벀트 루프

### ✏️ 이벀트 λ£¨ν”„μ˜ μ •μ˜

> μ±…μ—μ„œλŠ” λΈŒλΌμš°μ € (Web API) 기반의 이벀트 루프λ₯Ό μœ„μ£Όλ‘œ μ„€λͺ…ν–ˆκΈ° λ•Œλ¬Έμ—, 정리글 λ˜ν•œ whatwg Spec 을 기반으둜 μž‘μ„±ν•œλ‹€.
- λΉ„λ™κΈ°λ‘œ λ™μž‘ν•˜λŠ” νƒœμŠ€ν¬ (Call Stack 에 λ°”λ‘œ μ μž¬λ˜μ§€ μ•ŠλŠ” μž‘μ—…) 듀을 λ³„λ„μ˜ Queue 에 λ³΄κ΄€ν–ˆλ‹€κ°€, Call Stack 이 빌 경우 λ³΄κ΄€ν–ˆλ˜ νƒœμŠ€ν¬λ“€μ„ 순차적으둜 μ²˜λ¦¬ν•˜λŠ” 일련의 과정을 **이벀트 루프**라고 ν•œλ‹€.

### ✏️ Call Stack

- JS 엔진에 μ˜ν•΄ μ½”λ“œκ°€ μ‹€ν–‰λ˜κΈ° 전에 ν•„μš”ν•œ μ½”λ“œλ‚˜ μ‹λ³„μžμ™€ κ΄€λ ¨ν•œ 정보λ₯Ό λ³΄κ΄€ν•œ μ‹€ν–‰ μ»¨ν…μŠ€νŠΈλ₯Ό μ μž¬ν•˜λŠ” Stack 이닀.
- Call Stack 의 경우 λ¨Όμ € μƒμ„±λœ μ»¨ν…μŠ€νŠΈλΆ€ν„° μŒ“μ΄λ©°, 이후에 μŒ“μΈ μ»¨ν…μŠ€νŠΈλΆ€ν„° μ‚¬λΌμ§€λŠ” Stack 의 νŠΉμ§•μ„ κ·ΈλŒ€λ‘œ 가진닀.

### ✏️ Task Queue

- 이벀트 λ£¨ν”„λŠ” κ²°κ΅­ Call Stack 에 λ°”λ‘œ μ μž¬λ˜μ§€ μ•Šκ³  λΉ„λ™κΈ°λ‘œ λ™μž‘ν•˜λŠ” μž‘μ—…λ“€μ„ λ³„λ„μ˜ Queue 에 λ³΄κ΄€ν•˜κ³ , 이후 Call Stack 이 λΉ„μ—ˆμ„ 경우 Queue 에 적재된 μž‘μ—…μ„ ν•˜λ‚˜μ”© μ²˜λ¦¬ν•˜λŠ” 과정을 μ˜λ―Έν•œλ‹€.
- μ΄λ•Œ λΉ„λ™κΈ°λ‘œ λ™μž‘ν•˜λŠ” μ—¬λŸ¬ μž‘μ—…λ“€μ„ λ³΄κ΄€ν•˜λŠ” Queue λ₯Ό λ°”λ‘œ Task Queue 라고 ν•œλ‹€.

> 이름이 Task Queue 라고 ν•΄μ„œ 자료 ꡬ쑰가 Queue 인 것은 μ•„λ‹ˆλ‹€.
```
Task queues are sets, not queues, because the event loop processing model grabs the first runnable task from the chosen queue, instead of dequeuing the first task.
```

- whatwg μŠ€νŽ™μ—μ„œλŠ” Task Queue 의 κ΅¬ν˜„μ²΄κ°€ Queue κ°€ μ•„λ‹Œ Set (Ordered Set) μž„μ„ μ•ˆλ‚΄ν•˜κ³  μžˆλ‹€.
- κ·Έ μ΄μœ λŠ” Task Queue μ—μ„œ μž‘μ—…μ„ κ°€μ Έμ˜¬ λ•Œ μ‹€ν–‰ κ°€λŠ₯ν•œ Task 쀑 ν•˜λ‚˜λ₯Ό κΊΌλ‚΄μ•Ό ν•˜κΈ° λ•Œλ¬ΈμΈλ°, 이것이 λ°˜λ“œμ‹œ **κ°€μž₯ "첫번째" 에 μœ„μΉ˜ν•œ νƒœμŠ€ν¬λ₯Ό κΊΌλ‚΄λŠ” 것은 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ΄λ‹€.**
- Link : https://html.spec.whatwg.org/multipage/webappapis.html#task-queue


### ✏️ 이벀트 λ£¨ν”„μ˜ κ΅¬ν˜„μ²΄λŠ” 어디에?

- μžλ°”μŠ€ν¬λ¦½νŠΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μž‘μ—…μ€ 단일 μŠ€λ ˆλ“œλ‘œ κ΅¬μ„±λ˜μ§€λ§Œ, λΉ„λ™κΈ°λ‘œ λ™μž‘ν•˜λŠ” μž‘μ—…μ˜ κ²½μš°μ—λŠ” λ³„λ„μ˜ μŠ€λ ˆλ“œμ—μ„œ μˆ˜ν–‰λœλ‹€.
- λ³„λ„μ˜ μŠ€λ ˆλ“œμ—μ„œ μ΄λŸ¬ν•œ μž‘μ—…μ„ μ‹€ν–‰ν•˜λ„λ‘ λ•λŠ” μž₯μΉ˜λŠ” Browser 의 Web API λ‚˜, NodeJS 의 경우 C++ 기반의 라이브러리인 `libuv` λ₯Ό 기반으둜 이벀트 루프λ₯Ό κ΅¬ν˜„ν•œλ‹€.
167 changes: 167 additions & 0 deletions docs/RookieAND/dil/2024-03-07.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,167 @@
### ✏️ 마이크둜 νƒœμŠ€ν¬ 큐

- 비동기 μž‘μ—…μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ ECMA μ—μ„œλŠ” `PromiseJobs` μ΄λΌλŠ” λ‚΄λΆ€ Queue λ₯Ό λͺ…μ‹œν•˜λŠ”λ°, V8 μ—”μ§„μ—μ„œλŠ” 이λ₯Ό 마이크둜 νƒœμŠ€ν¬ 큐라고 μ •μ˜ν•œλ‹€.
- 마이크둜 νƒœμŠ€ν¬ νλŠ” νƒœμŠ€ν¬ 큐와 λ‹€λ₯΄κ²Œ λ¨Όμ € λ“€μ–΄μ˜¨ μž‘μ—…μ„ μš°μ„ ν•˜μ—¬ μ‹€ν–‰ν•œλ‹€. (FIFO : First In First Out)
- λͺ¨λ“  Promise μž‘μ—…μ˜ 경우 Microtask Queue 에 λ“€μ–΄κ°€ μ²˜λ¦¬λ˜κΈ°μ— Promise λŠ” 늘 λΉ„λ™κΈ°λ‘œ
μž‘λ™ν•œλ‹€.
- μΆ”κ°€λ‘œ `MutationObserver` κ°€ λ³€ν™”λ₯Ό κ΄€μΈ‘ν•  μ‹œ μ‹€ν–‰ν•˜λŠ” Callback ν•¨μˆ˜ λ˜ν•œ Microtask Queue 둜 λ“€μ–΄κ°„λ‹€.

### ✏️ 마이크둜 νƒœμŠ€ν¬ 큐의 특이점

- Microtask Queue λ‚΄λΆ€μ˜ Task λŠ” Call Stack 이 λΉ„μ—ˆμ„ λ•Œ κ°€μž₯ μ΅œμš°μ„ μœΌλ‘œ μ‹€ν–‰λœλ‹€.
- Microtask Queue λ‚΄λΆ€μ˜ μž‘μ—…μ΄ Call Stack 에 μ μž¬λ˜μ–΄ 싀행될 λ•Œ, μƒˆλ‘œμš΄ Microtask λ₯Ό 생성할 수 μžˆλ‹€.
- λΈŒλΌμš°μ € λ Œλ”λ§μ˜ 경우 Microtask Queue λ‚΄λΆ€μ˜ μž‘μ—…μ΄ λͺ¨λ‘ μ‹€ν–‰λ˜μ–΄ Queue κ°€ λΉ„μ—ˆμ„ λ•Œ μ‹€ν–‰λœλ‹€.
- λ”°λΌμ„œ ν•œ 사이클에 μ—°μ†μ μœΌλ‘œ μƒˆλ‘œμš΄ Microtask λ₯Ό μƒμ„±ν•˜λŠ” 것은 λΈŒλΌμš°μ € λ Œλ”λ§ 및 Task Queue λ‚΄λΆ€μ˜ μž‘μ—…μ„ **μ§€μ—°μ‹œν‚¨λ‹€**.

### ✏️ 각 비동기 Task 의 μ‹€ν–‰ μˆœμ„œ 정리

```js
console.log('a');

setTimeout(() => {
console.log('b')
}, 0);

Promise.resolve().then(() => {
console.log('c');
})

window.requestAnimationFrame(() => {
console.log('d')
})


1. console.log('a') κ°€ Call Stack 에 적재되고, μ‹€ν–‰λœλ‹€.
2. setTimeout μž‘μ—…μ΄ Task Queue 에 ν• λ‹Ήλœλ‹€.
3. Promise.resolve() μž‘μ—…μ΄ μˆ˜ν–‰λ˜κ³ , then ν•Έλ“€λŸ¬ λ‚΄λΆ€μ˜ callback 이 Micro Task Queue 에 ν• λ‹Ήλœλ‹€.
4. requestAnimationFrame κ°€ 인자둜 받은 callback 을 화면이 λ Œλ”λ§ λ˜λŠ” κ³Όμ •μ—μ„œ μ‹€ν–‰ν•˜λ„λ‘ μ˜ˆμ•½ (μŠ€μΌ€μ€„λ§) ν•œλ‹€.
5. Call Stack 이 λΉ„μ—ˆμœΌλ―€λ‘œ Micro Task Queue λ‚΄λΆ€μ˜ μž‘μ—…μ„ 가져와 `console.log('c')` λ₯Ό μ‹€ν–‰ν•œλ‹€.
6. Call Stack κ³Ό Micro Task Queue 이 μ „λΆ€ λΉ„μ—ˆμœΌλ―€λ‘œ λΈŒλΌμš°μ € λ Œλ”λ§μ΄ μ§„ν–‰λœλ‹€. μ΄λ•Œ rAF κ°€ 인자둜 받은 `console.log('d')` 이 μ‹€ν–‰λœλ‹€.
7. Task Queue 에 있던 μž‘μ—…μ΄ Call Stack 으둜 적재되고, `console.log('b')` κ°€ μ‹€ν–‰λœλ‹€.
```

### ✏️ [λ²ˆμ™Έ] rAF 의 λ™μž‘ 방식

- requestAnimationFrame 이 인자둜 받은 callback 은 Map of Animation Frame Callbacks 에 μ €μž₯λœλ‹€.
- 이 말인 즉은 rAF 의 callback 은 λ³„λ„μ˜ Queue κ°€ μ•„λ‹Œ **λΈŒλΌμš°μ € λ‚΄λΆ€μ—μ„œ κ΄€λ¦¬ν•˜λŠ” λ³„λ„μ˜ 곡간**에 Map 으둜 μ €μž₯λ˜μ–΄ μžˆλ‹€λŠ” μ˜λ―Έλ‹€.
- κ΅¬ν˜„μ²΄κ°€ Map 이기 λ•Œλ¬Έμ— rAF 의 경우 `cancelAnimationFrame(id)` λ©”μ„œλ“œλ‘œ μ·¨μ†Œκ°€ κ°€λŠ₯ν•˜λ‹€.

> μΆ”ν›„ μ‹œκ°„μ΄ λ‚¨μœΌλ©΄ μ‚΄νŽ΄λ΄μ•Ό ν•  λ¬Έμ„œλ“€
- https://stackoverflow.com/questions/77008112/which-queue-is-associated-with-requestanimationframe
- https://html.spec.whatwg.org/multipage/imagebitmap-and-animations.html#run-the-animation-frame-callbacks

# βœ’οΈ React μ—μ„œ 자주 μ“°μ΄λŠ” JS 문법

### ✏️ ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή, μ „κ°œ ꡬ문

- κ°μ²΄λ‚˜ λ°°μ—΄ λ‚΄λΆ€μ˜ μš”μ†Œλ₯Ό λ³„λ„μ˜ μ„ μ–Έλ¬Έ 없이 λ³€μˆ˜μ— 직접 μ„ μ–Έ 및 ν• λ‹Ήν•˜κ³  싢을 λ•Œ 쓰인닀.
- Default Parameter 문법도 μ‚¬μš©ν•  수 μžˆμœΌλ‚˜, 값이 undefined 인 κ²½μš°μ—λ§Œ μ μš©λœλ‹€.
- μΆ”κ°€λ‘œ 객체 ꡬ쑰 λΆ„ν•΄ ν• λ‹Ήμ˜ 경우 ES5둜 트랜슀파일링 ν•  경우 λ²ˆλ“€μ˜ μ‚¬μ΄μ¦ˆκ°€ 컀질 수 μžˆλ‹€.

```tsx
// λ°°μ—΄ ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή
const [isOpen, setIsOpen] = useState(false);

// 객체 ꡬ쑰 λΆ„ν•΄ ν• λ‹Ή
const Component = ({ totalCount }: PropsType) => {
return (...)
}
```

- μ „κ°œ ꡬ문의 경우 Spread Operator (`...`) λ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • 객체λ₯Ό μƒˆλ‘œμš΄ 객체 내뢀에 μ„ μ–Έν•  수 있고, λ°°μ—΄ λ˜ν•œ 같은 μ›λ¦¬λ‘œ μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.

```js
const obj = { a: 1, b: 2 };
const newObj = { ...obj, c: 3, d: 4 };
```

> 객체 ꡬ쑰 λΆ„ν•΄ ν• λ‹Ήμ˜ 트랜슀파일링 ꡬ쑰λ₯Ό νŒŒν—€μ³λ³΄μž.
```js
"use strict";

// source κ°μ²΄μ—μ„œ excluded λ°°μ—΄ λ‚΄ key λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
// _objectWithoutPropertiesLoose μ™€λŠ” λ‹€λ₯΄κ²Œ Symbol Key κ°€ μžˆλŠ” κ²½μš°λ„ κ³ λ €ν•œλ‹€.
function _objectWithoutProperties(source, excluded) {
if (source == null) return {};
var target = _objectWithoutPropertiesLoose(source, excluded);
var key, i;

// Symbol ν‚€κ°€ μžˆλ‹€λ©΄ getOwnPropertySymbols 둜 λͺ©λ‘μ„ λ°›μ•„ μˆœνšŒν•œλ‹€.
if (Object.getOwnPropertySymbols) {
var sourceSymbolKeys = Object.getOwnPropertySymbols(source);

// 객체 λ‚΄λΆ€μ˜ key λ₯Ό μˆœνšŒν•˜λ©° excluded 에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ” λ‚˜λ¨Έμ§€λ₯Ό target 에 μΆ”κ°€ν•œλ‹€.
for (i = 0; i < sourceSymbolKeys.length; i++) {
key = sourceSymbolKeys[i];
if (excluded.indexOf(key) >= 0) continue; // ν•΄λ‹Ή key κ°€ excluded 배열에 μžˆλ‹€λ©΄ continue.
if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;
target[key] = source[key];
}
}
return target;
}

// source κ°μ²΄μ—μ„œ excluded λ°°μ—΄ λ‚΄ key λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜
function _objectWithoutPropertiesLoose(source, excluded) {
if (source == null) return {};
var target = {};
var sourceKeys = Object.keys(source); // μ—¬κΈ°μ„œλŠ” Symbol Key λ₯Ό λ°˜ν™˜ν•˜μ§€ μ•ŠλŠ”λ‹€.
var key, i;

// 객체 λ‚΄λΆ€μ˜ key λ₯Ό μˆœνšŒν•˜λ©° excluded 에 ν¬ν•¨λ˜μ§€ μ•ŠλŠ” λ‚˜λ¨Έμ§€λ₯Ό target 에 μΆ”κ°€ν•œλ‹€.
for (i = 0; i < sourceKeys.length; i++) {
key = sourceKeys[i];
if (excluded.indexOf(key) >= 0) continue; // ν•΄λ‹Ή key κ°€ excluded 배열에 μžˆλ‹€λ©΄ continue.
target[key] = source[key];
}
return target;
}
var obj = {
a: 1,
b: 2,
c: 3,
d: 4,
};
var a = obj.a,
b = obj.b,
rest = _objectWithoutProperties(obj, ["a", "b"]);
```

1. `_objectWithoutPropertiesLoose` ν•¨μˆ˜

- source μΈμžλŠ” 객체이고, excluded 배열은 κ°μ²΄μ—μ„œ μ œκ±°ν•  key 값을 담은 배열이닀.
- source 객체의 key λ₯Ό μΆ”μΆœν•œ ν›„, 이λ₯Ό μˆœν™”ν•˜λ©° excluded 에 ν¬ν•¨λ˜λŠ” key λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€λ₯Ό target 객체에 μΆ”κ°€ν•œλ‹€.
- 이후 target 을 λ°˜ν™˜ν•˜λŠ” κ²ƒμœΌλ‘œ ν•¨μˆ˜λ₯Ό μ’…λ£Œν•œλ‹€.

2. `_objectWithoutProperties` ν•¨μˆ˜

- κΈ°λ³Έ κ³¨μžλŠ” `_objectWithoutPropertiesLoose` 와 κ°™μœΌλ‚˜ `Object.keys()` λ©”μ„œλ“œκ°€ Symbol ν˜•νƒœμ˜ key λ₯Ό 찾지 λͺ»ν•˜λŠ” μ˜ˆμ™Έλ₯Ό μ²˜λ¦¬ν•˜λŠ” 둜직이 μΆ”κ°€λ˜μ—ˆλ‹€.
- λ¨Όμ € `_objectWithoutPropertiesLoose` ν•¨μˆ˜μ˜ κ²°κ³Ό (target) λ₯Ό 인계 λ°›λŠ”λ‹€.
- 이후 source 객체 λ‚΄ Symbol νƒ€μž…μ˜ key 배열을 `Object.getOwnPropertySymbols` λ©”μ„œλ“œλ‘œ λ°›λŠ”λ‹€.
- Symbol Key 배열을 μˆœνšŒν•˜λ©° excluded 에 ν•΄λ‹Ή key κ°€ μžˆλ‹€λ©΄ 이λ₯Ό μ œμ™Έν•˜κ³ , μ—†λ‹€λ©΄ key 와 value λ₯Ό target 객체에 ν• λ‹Ήν•œλ‹€.


### ✏️ Array Map, filter, reduce

- κΈ°μ‘΄ λ°°μ—΄μ˜ μš”μ†Œλ₯Ό μˆœνšŒν•˜μ—¬ 인자둜 받은 callback 의 κ²°κ³Όλ₯Ό 기반으둜 μƒˆλ‘œμš΄ 배열에 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜λŠ” λ©”μ„œλ“œμ΄λ‹€.
- React 의 경우 λ°°μ—΄ν˜• state 의 λ³€κ²½μœΌλ‘œ λ¦¬λ Œλ”λ§μ„ μœ λ°œμ‹œν‚€λ €λ©΄ λ©”λͺ¨λ¦¬ μ£Όμ†Œκ°€ 달라져야 ν•œλ‹€.
- μœ„ λ©”μ„œλ“œλŠ” μƒˆλ‘œμš΄ 배열을 μƒμ„±ν•˜μ—¬ ν• λ‹Ήν•˜κΈ°μ— `Object.is` 기반의 동등성 κ²€μ‚¬μ—μ„œ 값이 달라짐을 μœ λ„ν•œλ‹€.

### ✏️ μ‚Όν•­ 쑰건 μ—°μ‚°μž

- νŠΉμ • 값을 기반으둜 λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈλ₯Ό λ‚΄λΆ€μ—μ„œ λ Œλ”λ§ ν•˜λ„λ‘ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλ‹€.
- if - else 기반의 μ½”λ“œ λΈ”λŸ­ 없이 ν•œ μ€„λ‘œ κ°„κ²°ν•˜κ²Œ 쑰건문을 μΆ•μ•½ν•  수 μžˆλ‹€.


# βœ’οΈ Typescript

> μ±…μ—μ„œλŠ” Typescript λ₯Ό 닀뀄야 ν•˜λŠ” μ΄μœ μ— λŒ€ν•΄μ„œ μ„€λͺ…ν–ˆκΈ°μ— κ°„κ²°ν•˜κ²Œ λ‚΄μš©λ§Œ μ •λ¦¬ν•˜κ³ μž ν•œλ‹€.
1. any λŒ€μ‹  unknown 을 μ‚¬μš©ν•˜μž.
2. Type Guard, Type Narrow λ₯Ό 잘 ν™œμš©ν•˜μž.
3. Generic μ‚¬μš©μœΌλ‘œ νƒ€μž…μ˜ μœ μ—°μ„±μ„ λ†’νžˆμž.
4. Index Signature, Mapped Type ν™œμš©μœΌλ‘œ μ°Έμ‘°ν˜• νƒ€μž…μ˜ μ‚¬μš©μ„ μ‰½κ²Œ ν•˜μž.

- TS λ₯Ό 써야 ν•˜λŠ” μ΄μœ μ— λŒ€ν•œ μ •λ¦¬λŠ” https://github.com/RookieAND/TIL/blob/master/TS/2023%20TS%20Study/Chapter1.md 에 λ‚¨κ²¨λ‘μ—ˆλ‹€.

0 comments on commit 993e5e8

Please sign in to comment.