0 타입 구조도 / Number
source: categories/study/javascript-mdn/javascript-mdn.md
타입 구조도
- Number
- BigInt
- 문자열 (String)
- 부울 (Boolean)
- 기호 (Symbol)
- 객체 (Object)
- 함수 (Function)
- 배열 (Array)
- 날짜 (Date)
- 정규식 (RegExp)
- 널 (Null)
- 정의되지 않음 (undefined)
그리고 또 몇가지 오류 타입이 내장되어 있습니다.
그렇지만 처음 구조도를 기억하고만 있으면 다른 것들도 아주 쉽게 이해할 수 있을 겁니다.
Number
- 자바스크립트 수: 이중정밀도 64비트 형식 IEEE 754 값"(numbers between - 2^53 - 1) and 2^53 - 1)로 정의된다.
- 이것은 몇 가지 흥미로운 결과를 가져온다.
- 자바스크립트에는 정수와 같은 것이 존재하지 않으므로(BigInt 제외), 조금 조심해야 한다.
console.log(3/2); // 1.5 not 1
console.log(Math.floor(3/2)); // 1
- "명백한 정수"는 사실 "암묵적으로 실수"이다.
- 또한, 다음과 같은 것들을 주의해라
0.1 + 0.2 == 0.30000000000000004;
- 실제로 정수 값은 32비트 정수로 처리되며 일부 구현은 32비트 정수가 아닌 숫자에 유효한 명령어를 수행할 때까지 이러한 방식으로 저장한다.
-
이는 비트 단위 작업에 중요할 수 있다.
- 덧셈, 뺄셈, 계수 (또는 나머지) 연산을 포함하는 표준 산술 연산자가 지원된다.
- 또한 앞에서 언급하는 것을 깜빡 잊은 고급 수학 함수와 상수를 다루기 위한 수학(Math)으로 불리는 내장 객체가 있다.
Math.sin(3.5);
var circumference = 2 * Math.PI * r;
- 내장
parseInt()
함수를 사용하여 문자열을 정수로 변환할 수 있다. - 이는 다음과 같이 옵션으로 주어지는 두번째 매개변수를 밑으로 하여 수행할 수 있다.
parseInt('123', 10); // 123
parseInt('010', 10); // 10
- 구형 브라우저에서 ‘0'으로 시작하는 문자열은 8진수(기수 8)로 가정되지만, 2013년 이후에는 그렇지 않다.
- 문자열 형식이 확실하지 않으면 이전 브라우저에서 놀라운 결과를 얻을 수 있다.
parseInt('010'); // 8 // 8의 0승 * 0 + 8의 1승 * 1 = 0 + 8 = 8
parseInt('0x10'); // 16 // 16의 0승 * 0 + 16의 1승 * 1 = 0 + 16 = 16
- 이 같은 결과는
parseInt()
함수가 0으로 시작되는 문자열을 8진수로, ‘0x'로 시작하는 문자열은 16진수로 취급하기 때문에 발생한다. - 16진수 표기법이 그대로 유지됩니다.
- 8진수는 제거되었습니다.
parseInt('11', 2); // 3 // 2의 1승 * 1 + 2의 0승 * 1 = 2 + 1 = 3
- 이와 비슷하게, 내장 함수
parseFloat()
를 사용하여 부동 소수점 숫자를 파싱할 수 있다. -
parseInt()
와 달리parseFloat()
는 항상 10진수를 사용한다. - 단항 연산자
+
를 사용하여 값을 숫자로 변환할 수도 있다.
+ '42'; // 42
+ '010'; // 10
+ '0x10'; // 16
- 문자열이 수가 아닌 경우
NaN
(‘Not a Number'(수가 아님을 줄인 약자)로 불리는 특별한 값을 돌려준다.)
parseInt('hello', 10); // NaN
NaN
은 독성을 가지고 있다.- 어떤 수학 연산의 입력값으로 주어지면 그 결과는 역시
NaN
이 되기 때문이다.
NaN + 5; // NaN
- 내장
Number.isNaN()
함수를 사용하여NaN
여부를 안정적으로 검사할 수 있다. - 해당 함수는
NaN
여부 검사를 보다 직관적인 방식으로 검사한다.
Number.isNaN(NaN); // true
Number.isNaN('hello'); // false
Number.isNaN('1'); // false
Number.isNaN(undefined); // false
Number.isNaN({}); // false
Number.isNaN([1]); // false
Number.isNaN([1, 2]); // false
- 하지만 직관적이지 않은 동작을 하는 전역
isNaN()
함수를 사용하여NaN
인지 검사를 하지마.
isNaN('hello'); // true
isNaN('1'); // false
isNaN(undefined); // true
isNaN({}); // true
isNaN([1]) // false
isNaN([1, 2]) // true
- 자바스크립트는 또 특별한 값으로
Infinity
와-Infinity
를 가지고 있다.
1 / 0; // Infinity
-1 / 0; // -Infinity
- 내장 함수
isFinite()
를 사용하여 Infinity, -Infinity 및 NaN 값을 테스트 할 수 있다.
isFinite(1 / 0); // false
isFinite(-Infinity); // false
isFinite(NaN); // false
Note
참고: parseInt()
와 parseFloat()
함수는 숫자로 아닌 문자가 나올때까지 문자열을 파싱하고, 그 지점까지 파싱된 숫자를 반환한다.
그런데 +
연산자는 중간에 유효하지 않은 문자가 있으면 그대로 문자열을 NaN
으로 그냥 변환해버린다.
console에서 ‘10.2abc’를 파싱해보면 어떤점이 다른지 더 쉽게 이해할 수 있다.
parseInt('10.2abc'); // 10
parseFloat('10.2abc'); // 10.2
+ '10'; // 10
+ '10.2abc' // NaN