-
Notifications
You must be signed in to change notification settings - Fork 42
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
191 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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`이나 프로미스 후속 처리 메서드의 콜백 함수는 태스크 큐나 마이크로태스크 큐에 일시 저장되었다가 콜 스택이 비면 이벤트 루프에 의해 콜 스택으로 푸시되어 실행된다. | ||
이때 콜 스택에 푸시된 콜백 함수의 실행 컨텍스트는 콜 스택의 가장 하부에 존재하게 되므로 에러를 전파할 호출자가 존재하지 않는다. |