Skip to content

Commit 7c61f2f

Browse files
authored
Merge pull request #23 from gdsc-konkuk/eunseo
28, 29장
2 parents e1c7dc0 + f37d5b4 commit 7c61f2f

File tree

2 files changed

+348
-0
lines changed

2 files changed

+348
-0
lines changed

28장 Number/28. Number.md

+263
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,263 @@
1+
# Number
2+
3+
표준 빌트인 객체인 Number는 원시 타입인 숫자를 다룰 때 유용한 프로퍼티와 메서드를 제공한다.
4+
5+
## 28.1 Number 생성자 함수
6+
7+
Number 객체는 생성자 함수 객체다. 따라서 new 연산자와 함께 호출하여 인스턴스를 생성할 수 있다.
8+
9+
생성자 함수에 인수를 전달하지 않고 new 연산자와 함께 호출하면, [[PrimitiveValue]] 내부 슬롯에 0을 할당한 Number 래퍼 객체를 생성한다.
10+
11+
![](https://i.imgur.com/LQXczFm.png)
12+
13+
생성자 함수에 인수로 숫자를 전달하면서 new 연산자와 함께 호출하면, [[PrimitiveValue]] 내부 슬롯에 전달받은 숫자를 할당한 Number 래퍼 객체를 생성한다.
14+
15+
![](https://i.imgur.com/XdkiGJi.png)
16+
17+
Number 생성자 함수의 인수로 숫자가 아닌 값을 전달하면 인수를 숫자로 강제 변환 후 객체를 생성한다. 인수를 숫자로 변환할 수 없다면 Nan을 할당한 객체를 생성한다.
18+
19+
new 연산자를 사용하지 않고 생성자 함수를 호출하면 Number 인스턴스가 아닌 숫자를 반환한다.
20+
21+
```jsx
22+
const a = new Number(123);
23+
a === 123 // false
24+
25+
const b = Number(123);
26+
b === 123 // true
27+
```
28+
29+
## 28.2 Number 프로퍼티
30+
31+
### 28.2.1 `Number.EPSILON`
32+
33+
두 개의 표현 가능한 숫자 사이의 최소 간격.
34+
35+
1과 1보다 큰 숫자 중에서 가장 작은 숫자와의 차이($2.2204460492503130808472633361816\times10^{-16}$)이다.
36+
37+
```jsx
38+
0.1 + 0.2; // 0.30000000000000004
39+
0.1 + 0.2 === 0.3; // false
40+
```
41+
42+
부동소수점 산술 연산은 정확한 결과를 기대하기 어려운데, 이러한 오차를 해결하기 위해 사용할 수 있다.
43+
44+
```jsx
45+
function isEqual(a, b) {
46+
return Math.abs(a-b) < Number.EPSILON;
47+
}
48+
isEqual(0.1+0.2, 0.3); // true
49+
```
50+
51+
두 수의 차이가 Number.EPSILON보다 작으면 같은 수로 인정하는 방식이다.
52+
53+
### 28.2.2 `Number.MAX_VALUE`
54+
55+
자바스크립트에서 표현할 수 있는 가장 큰 양수 값($1.7976931348623157 \times 10^{308}$)이다. 이것보다 큰 숫자는 `Infinity` 다.
56+
57+
```jsx
58+
Infinity > Number.MAX_VALUE // true
59+
```
60+
61+
### 28.2.3 `Number.MIN_VALUE`
62+
63+
자바스크립트에서 표현 할 수 있는 가장 작은 양수값($5 \times 10^{-324}$)이다. 이것보다 작은 숫자는 0이다.
64+
65+
### 28.2.4 `Number.MAX_SAFE_INTEGER`
66+
67+
자바스크립트에서 안전하게 표현할 수 있는 가장 큰 정수값(9007199254740991)이다. (= 53비트로 표현할 수 있는 가장 큰 정수 2^53 - 1)
68+
69+
>[!note]
70+
>자바스크립트에서 숫자는 **64비트 부동소수점 형식**(IEEE 754 표준)을 사용하여 저장되고, 정수 부분에 대해 53비트만 사용한다.
71+
72+
### 28.2.5 `Number.MIN_SAFE_INTEGER`
73+
74+
자바스크립트에서 안전하게 표현할 수 있는 가장 작은 정수값(-9007199254740991)이다. (= 53비트로 표현할 수 있는 가장 작은 정수 -(2^53 - 1))
75+
76+
### 28.2.6 `Number.POSITIVE_INFINITY`
77+
78+
양의 무한대를 나타내는 숫자값 Infinity와 같다.
79+
80+
### 28.2.7 `Number.NEGATIVE_INFINITY`
81+
82+
음의 무한대를 나타내는 숫자값 -Infinity와 같다.
83+
84+
### 28.2.8 `Number.NaN`
85+
86+
숫자가 아님(Not-a-Number)을 나타내는 숫자값이다. `window.NaN`과 같다.
87+
88+
89+
## 28.3 Number 메서드
90+
91+
### 28.3.1 `Number.isFinite`
92+
93+
인수로 전달된 숫자값이 정상적인 유한수인지 검사하여 그 결과를 불리언값으로 반환한다.
94+
95+
**빌트인 전역 함수 `isFinite`와 비교**
96+
97+
- `isFinite`는 전달받은 인수를 숫자로 암묵적 타입 변환하여 검사를 수행한다.
98+
- `Number.isFinite`는 전달받은 인수를 숫자로 암묵적 타입 변환하지 않는다. 따라서 숫자가 아닌 인수가 주어졌을 때 반환값은 언제나 false이다.
99+
100+
```jsx
101+
Number.isFinite(null); // false
102+
isFinite(null); // true
103+
```
104+
105+
null은 암묵적으로 숫자 0으로 변환되기 때문에 true가 반환되었다.
106+
107+
```jsx
108+
Number.isFinite(NaN); // false
109+
isFinite(NaN); // false
110+
```
111+
112+
NaN은 숫자로 암묵적 타입 변환이 불가능하기 때문에 false가 반환되었다.
113+
114+
### 28.3.2 `Number.isInteger`
115+
116+
인수로 전달된 숫자값이 정수인지 검사하여 그 결과를 불리언 값으로 반환한다. 검사하기 전에 암묵적 타입 변환하지 않는다.
117+
118+
```jsx
119+
Number.isInteger(0) // true
120+
Number.isInteger(123) // true
121+
122+
Number.isInteger(0.5) // false
123+
Number.isInteger('123') // false
124+
Number.isInteger(true) // false
125+
Number.isInteger(null) // false
126+
```
127+
128+
### 28.3.3 `Number.isNaN`
129+
130+
전달된 숫자값이 NaN인지 검사하여 그 결과를 불리언 값으로 반환한다.
131+
132+
```jsx
133+
Number.isNaN(NaN); // true
134+
```
135+
136+
**빌트인 전역 함수 `isNaN`과 비교**
137+
138+
- `isNaN`은 전달받은 인수를 숫자로 암묵적 타입 변환하여 검사를 수행한다.
139+
- `Number.isNaN`은 전달받은 인수를 숫자로 암묵적 타입 변환하지 않는다. 따라서 숫자가 아닌 인수가 주어졌을 때 반환값은 언제나 false다.
140+
141+
```jsx
142+
Number.isNaN(undefined); // false
143+
144+
// undefined는 NaN으로 암묵적 타입 변환된다.
145+
isNaN(undefined); // true
146+
```
147+
148+
### 28.3.4 `Number.isSafeInteger`
149+
150+
인수로 전달된 숫자값이 안전한 정수인지 검사하여 그 결과를 불리언 값으로 반환한다. 검사전에 인수를 숫자로 암묵적 타입 변환하지 않는다.
151+
152+
```jsx
153+
Number.isSafeInteger(0) // true
154+
Number.isSageInteger(Number.MAX_SAFE_INTEGER) // true
155+
Number.isSageInteger(Number.MAX_SAFE_INTEGER+1) // false
156+
```
157+
158+
### 28.3.5 `Number.prototype.toExponential`
159+
160+
숫자를 지수 표기법으로 변환하여 문자열로 반환한다.
161+
162+
지수 표기법이란 매우 크거나 작은 숫자를 표기할 때 주로 사용하며 e(Exponent) 앞에 있는 숫자에 10의 n승을 곱하는 형식으로 수를 나타내는 방식이다. 인수로는 소수점 이하로 표현할 자릿수를 전달할 수 있다.
163+
164+
```jsx
165+
(77.1234).toExponential(); // '7.71234e+1'
166+
// 인수를 전달하지 않으면 전체 숫자를 반영한 지수 표기법을 사용한다.
167+
168+
(77.1234).toExponential(4); // '7.7123e+1'
169+
(77.1234).toExponential(2); // '7.71e+1'
170+
```
171+
172+
### 28.3.6 `Number.prototype.toFixed`
173+
174+
인수로 전달받은 소수점 이하 자리수까지 유효하도록 나머지 자릿수를 반올림하여 문자열로 반환한다.
175+
176+
소수점 이하가 주어진 인수보다 길면 숫자를 반올림하고, 짧아서 부족할 경우 뒤를 0으로 채운다. 인수는 0~20 사이의 정수값이며 기본값은 0이다.
177+
178+
```jsx
179+
var numObj = 12345.6789;
180+
181+
// 소수점 이하 반올림.
182+
numObj.toFixed(); // '12346'
183+
184+
// 소수점 이하 1자릿수 유효, 나머진 반올림
185+
numObj.toFixed(1); // '12345.7'
186+
187+
// 소수점 이하 6자릿수 유효, 부족한 부분은 0으로 채움
188+
numObj.toFixed(6); // '12345.678900'
189+
```
190+
191+
### 28.3.7 `Number.prototype.toPrecision`
192+
193+
인수로 전달받은 전체 자릿수까지 유효하도록 나머지 자릿수를 반올림하여 문자열로 반환한다.
194+
195+
인수로 전달받은 전체 자릿수로 표현할 수 없는 경우 지수 표기법으로 결과를 반환한다. 인수는 0~21 사이의 정수값이며 기본값은 0이다.
196+
197+
```jsx
198+
var numObj = 12345.6789;
199+
200+
numObj.toPrecision(); // '12345.6789'
201+
202+
numObj.toPrecision(1); //'1e+4'
203+
numObj.toPrecision(2); // '1.2e+4'
204+
205+
numObj.toPrecision(5); // '12346'
206+
```
207+
208+
| 특징 | `toFixed(digits)` | `toPrecision(precision)` |
209+
| --- | --- | --- |
210+
| 역할 | 소수점 이하 자릿수를 지정 | 전체 자릿수를 지정 |
211+
| 인자 | `digits`: 소수점 이하 유지할 자릿수 (0~100) | `precision`: 전체 유효 숫자 개수 (1~100) |
212+
| 반올림 여부 | 지정한 소수점 이하 자릿수에서 반올림 | 지정한 유효 숫자 개수에서 반올림 |
213+
| 지수 표기법 사용 | 사용하지 않음 (항상 고정 소수점) | 필요 시 지수 표기법 사용 |
214+
| 기본값 | `toFixed(0)`이면 정수 부분만 출력 | `toPrecision()` 호출 시 기본적으로 전체 유효 숫자를 출력 |
215+
| 사용 예시 | 화폐 단위처럼 소수점 이하 자릿수를 고정해야 할 때 | 과학 계산에서 정확한 유효 숫자 개수를 유지해야 할 때 |
216+
217+
### 28.3.8 `Number.prototype.toString`
218+
219+
숫자를 문자열로 변환하여 반환한다.
220+
221+
진법을 나타내는 2~36 사이의 정수값을 인수로 전달할 수 있고, 기본값은 10이다.
222+
223+
```jsx
224+
(10).toString(); // '10'
225+
(3).toString(2); // '11'
226+
```
227+
228+
### 숫자 리터럴과 함께 Number 프로토타입 메서드
229+
230+
를 사용할 경우 에러가 발생한다.
231+
232+
```jsx
233+
77.toExponential(); // SyntaxError: Invalide or unexpected token
234+
```
235+
236+
점(.)은 소수 구분 기호 또는 프로퍼티 접근 연산자로 사용될 수 있는데, 자바스크립트 엔진이 숫자 뒤의 .을 소수 구분 기호로 해석해버려 toExponential()을 프로퍼티로 해석하지 못하기 때문이다.
237+
238+
**해결 방법**
239+
240+
1. 숫자 리터럴에 괄호를 씌우기
241+
242+
```jsx
243+
(77).toExponential();
244+
```
245+
246+
숫자 리터럴을 괄호로 감싸면 점(.)이 메서드 호출 연산자로 정확히 해석됨.
247+
248+
2. 숫자 뒤에 .을 붙이기
249+
250+
```jsx
251+
77.1234.toExponential();
252+
77..toExponential();
253+
```
254+
255+
첫 번째 .은 부동 소수점 숫자의 소수 구분 기호로 보고, 숫자에 소수점은 하나만 존재하므로 두 번째 .은 프로퍼티 접근 연산자로 해석된다.
256+
257+
3. 숫자 뒤에 공백을 추가
258+
259+
```jsx
260+
77 .toExponential();
261+
```
262+
263+
자바스크립트 숫자는 정수 부분과 소수 부분 사이에 공백을 포함할 수 없기 때문에 숫자와 . 사이에 공백이 오면 .을 프로퍼티 접근 연산자로 해석한다.

29장 Math/29. Math.md

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# Math
2+
3+
표준 빌트인 객체인 Math는 수학적인 상수와 함수를 위한 프로퍼티와 메서드를 제공한다.
4+
5+
Math는 생성자 함수가 아니기 때문에 정적 프로퍼티와 정적 메서드만 제공한다.
6+
7+
# 29.1 Math 프로퍼티
8+
9+
## 29.1.1 Math.PI
10+
11+
원주율 $\pi$값(≈3.141592653589793)을 반환한다.
12+
13+
# 29.2 Math 메서드
14+
15+
## 29.2.1 Math.abs
16+
17+
인수로 전달된 숫자의 절대값을 반환한다.
18+
19+
## 29.2.2-29.2.4 어림 메서드
20+
21+
| Math.round() | Math.ceil() | Math.floor() | Math.trunc() |
22+
| --- | --- | --- | --- |
23+
| 소수점 첫째 자리에서 반올림 | 소수점 이하 올림 | 소수점 이하 내림 | 소수점 이하 버림 |
24+
| 가장 가까운 정수 선택 | `+` 방향으로 가까운 정수 선택 | `-` 방향으로 가까운 정수 선택 | 0의 방향으로 가까운 정수 선택 |
25+
26+
```jsx
27+
Math.round(2.1) // 2
28+
Math.round(-2.6) // -3
29+
30+
Math.ceil(2.1) // 3
31+
Math.ceil(-2.6) // -2
32+
33+
Math.floor(2.1) // 2
34+
Math.floor(-2.6) // -3
35+
36+
Math.trunc(2.1) // 2
37+
Math.trunc(-2.6) // -2
38+
```
39+
40+
## 29.2.5 Math.sqrt
41+
42+
인수로 전달된 숫자의 제곱근을 반환한다.
43+
44+
```jsx
45+
Math.sqrt(9); // 3
46+
Math.sqrt(-9); // NaN
47+
Math.sqrt(2); // 1.414213562373095
48+
```
49+
50+
## 29.2.6 Math.random
51+
52+
임의의 난수(랜덤 숫자)를 반환한다. 0 이상 1 미만의 실수이다.
53+
54+
## 29.2.7 Math.pow
55+
56+
첫 번째 인수를 밑으로, 두 번째 인수를 지수로 거듭제곱한 결과를 반환한다.
57+
58+
```jsx
59+
Math.pow(2,3); // 8
60+
Math.pow(2,-1); // 0.5
61+
Math.pow(2) // NaN
62+
63+
Math.pow(0,0); // 1로 취급
64+
```
65+
66+
## 29.2.8 Math.max
67+
68+
전달받은 인수 중에서 가장 큰 수를 반환한다. 인수가 전달되지 않으면 `Infinity`를 반환한다.
69+
70+
배열을 인수로 전달받아 배열의 요소 중에서 최대값을 구하려면 `Function.prototype.apply` 메서드 또는 스프레드 문법을 사용해서 개별 인자로 분해해야 한다.
71+
72+
```jsx
73+
Math.max(1, 2, 3) // 3
74+
75+
Math.max.apply(null, [1, 2, 3]); // 3
76+
Math.max(...[1, 2, 3]); // 3
77+
```
78+
79+
## 29.2.9 Math.min
80+
81+
전달받은 인수 중에서 가장 작은 수를 반환한다. 인수가 전달되지 않으면 `Infinity`를 반환한다.
82+
83+
```jsx
84+
Math.min(1, 2, 3) // 1
85+
```

0 commit comments

Comments
 (0)