Skip to content

Commit

Permalink
docs: 29, 47장 정리
Browse files Browse the repository at this point in the history
  • Loading branch information
e6d1fe committed Jan 29, 2024
1 parent b08b332 commit 53fdafc
Show file tree
Hide file tree
Showing 2 changed files with 191 additions and 0 deletions.
102 changes: 102 additions & 0 deletions docs/29_Math/나세현.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
## 29장 `Math`

표준 빌트인 객체인 `Math`는 수학적인 상수와 함수를 위한 프로퍼티와 메서드를 제공하며, 생성자 함수가 아니기 때문에 정적 프로퍼티와 정적 메서드만 제공한다.

### 📍 29.1: `Math` 프로퍼티

#### `Math.PI`

원주율 파이 값을 반환한다.

### 📍 29.2: `Math` 메서드

#### `Math.abs`

인수로 전달된 숫자의 절대값을 반환한다.

```javascript
Math.abs(-1); // 1
Math.abs('-1'); // 1
Math.abs(''); // 0
Math.abs([]); // 0
Math.abs(null); // 0
Math.abs(undefined); // NaN
Math.abs({}); // NaN
Math.abs('string'); // NaN
Math.abs(); // NaN
```

#### `Math.round`

인수로 전달된 숫자의 소수점 이하를 반올림한 정수를 반환한다.

```javascript
Math.round(1.4); // 1
Math.round(); // NaN
```

#### `Math.ceil`

인수로 전달된 숫자의 소수점 이하를 올림한 정수를 반환한다.

```javascript
Math.ceil(1.4); // 2
Math.ceil(-1.4); // -1
Math.ceil(); // NaN
```

#### `Math.floor`

인수로 전달된 숫자의 소수점 이하를 내림한 정수를 반환한다.

```javascript
Math.floor(1.9); // 1
Math.floor(-1.9); // -2
Math.floor(); // NaN
```

#### `Math.sqrt`

인수로 전달된 숫자의 제곱근을 반환한다.

```javascript
Math.sqrt(9); // 3
Math.sqrt(-9); // NaN
Math.sqrt(); // NaN
```

#### `Math.random`

0에서 1 미만의 실수인 임의의 난수를 반환한다.

#### `Math.pow`

첫번째 인수를 밑으로, 두번째 인수를 지수로 거듭제곱한 결과를 반환한다.
ES7에서 도입된 지수 연산자를 대신 사용하면 가독성이 더 좋다.

```javascript
Math.pow(2, 8); // 256
Math.pow(); // NaN

2 ** (2 ** 2); // 16
Math.pow(Math.pow(2, 2), 2); // 16
```

#### `Math.max`

전달받은 인수 중에서 가장 큰 수를 반환한다.
인수가 전달되지 않으면 `-Infinity`를 반환한다.

```javascript
Math.max(1, 2, 3); // 3
Math.max(); // -Infinity
```

#### Math.min

전달받은 인수 중에서 가장 작은 수를 반환하며, 인수가 전달되지 않으면 `Infinity`를 반환한다.

```javascript
Math.min(1, 2, 3); // 1
Math.min(); // Infinity
```
89 changes: 89 additions & 0 deletions docs/47_에러 처리/나세현.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
## 47장 에러 처리

### 📍 47.1: 에러 처리의 필요성

발생한 에러에 대해 대처하지 않고 방치하면 프로그램은 강제 종료된다.
`try ... catch`문을 사용해 발생한 에러에 적절하게 대응하면 프로그램이 강제 종료되지 않고 계속해서 코드를 실행시킬 수 있다.
직접적으로 에러를 발생시키지 않는 예외적인 상황(`null` 반환 등)이 발생할 수도 있다.
이런 예외적인 상황에 적절하게 대응하지 않으면 에러로 이어질 가능성이 크다.

### 📍 47.2: `try ... catch ... finally`

기본적으로 에러 처리를 구현하는 방법은 두 가지가 있다.

1. `querySelector``Array#find` 메서드처럼 예외적인 상황이 발생하면 반환하는 값(`null` 또는 `-1`)을 `if`문이나 단축 평가, 옵셔널 체이닝 연산자를 통해 확인해서 처리하는 방법
2. 에러 처리 코드를 미리 등록해 두고 에러가 발생하면 에러 처리 코드로 점프하도록 하는 방법

`try ... catch ... finally`문은 두번째 방법이고, 일반적으로 이 방법을 에러 처리라고 한다.
`finally`문은 불필요하다면 생략한다.

```javascript
try {
// 실행할 코드 (에러가 발생할 가능성이 있는 코드)
} catch (err) {
// try 코드 블록에서 에러가 발생하면 이 코드 블록의 코드가 실행됨
// err에는 try 코드 블록에서 발생한 Error 객체가 전달됨
} finally {
// 에러 발생과 상관없이 반드시 한 번 실행됨
}
```

### 📍 47.3: `Error` 객체

`Error` 생성자 함수는 에러 객체를 생성하며, 에러를 상세히 설명하는 에러 메시지를 인수로 전달할 수 있다.

```javascript
const error = new Error('invalid');
```

`Error` 생성자 함수가 생성한 에러 객체는 `message``stack` 프로퍼티를 갖는다.

- `message`: `Error` 생성자 함수에 인수로 전달한 에러 메시지
- `stack`: 에러를 발생시킨 콜 스택의 호출 정보를 나타내는 문자열이며 디버깅 목적으로 사용

자바스크립트는 `Error` 생성자 함수를 포함해 7가지의 에러 객체를 생성할 수 있는 `Error` 생성자 함수를 제공한다. (`SyntaxError`, `ReferenceError`, `TypeError`, `RangeError`, `URIError`, `EvalError`)
이 생성자 함수가 생성한 에러 객체의 프로토타입은 모두 `Error.prototype`을 상속받는다.

### 📍 47.4: `throw`

`Error` 생성자 함수로 에러 객체를 생성한다고 에러가 발생하는 것은 아니다.
에러를 발생시키려면 `try` 코드 블록에서 `throw`문으로 에러를 던져야 한다.

```javascript
try {
throw new Error("something's wrong");
} catch (err) {
console.log(err);
}
```

### 📍 47.5: 에러의 전파

**에러는 호출자 방향으로 전파된다.**
즉, 콜 스택의 아래 방향(실행 중인 실행 컨텍스트가 푸시되기 직전에 푸시된 실행 컨텍스트 방향)으로 전파된다.

```javascript
const foo = () => {
throw new Error('foo에서 발생한 에러');
};

const bar = () => {
foo();
};

const baz = () => {
bar();
};

try {
baz();
} catch (err) {
console.log(err);
}
```

`baz` 함수를 호출한 결과로 `foo` 함수가 `throw`한 에러는 `foo` 실행 컨텍스트 - `bar` 실행 컨텍스트 - `baz` 실행 컨텍스트 - 전역 실행 컨텍스트를 순서대로 거쳐 전파되어 전역에서 캐치된다.

주의할 점은 비동기 함수인 `setTimeout`이나 프로미스 후속 처리 메서드의 콜백 함수는 호출자가 없다는 것이다.
`setTimeout`이나 프로미스 후속 처리 메서드의 콜백 함수는 태스크 큐나 마이크로태스크 큐에 일시 저장되었다가 콜 스택이 비면 이벤트 루프에 의해 콜 스택으로 푸시되어 실행된다.
이때 콜 스택에 푸시된 콜백 함수의 실행 컨텍스트는 콜 스택의 가장 하부에 존재하게 되므로 에러를 전파할 호출자가 존재하지 않는다.

0 comments on commit 53fdafc

Please sign in to comment.