모던 JavaScript 튜토리얼을 따라가면서 정리합니다.
2.5. 자료형
자바스크립트의 변수는 자료형에 관계없이 모든 데이터일 수 있다. 자바스크립트는 자료의 타입은 있지만 변수에 저장되는 값의 타입은 언제든지 바뀔 수 있는 “동적 타입(dynamically typed) 언어”이다.
숫자형(number type)
숫자형은 정수 및 부동소수점 숫자(floating point number)를 나타낸다. 일반적이 숫자 외에 Infinity
, -Infinity
, NaN
같은 특수 숫자 값(special numeric value)가 포함된다.
어느 숫자든 0으로 나누면 Infinity
를 얻을 수 있고, Infinity
를 직접 참조할 수도 있다. NaN
은 부정확하거나 정의되지 않은 수학 연산을 사용하면 계산 중에 에러가 발생하는데, 이때 반환된다. NaN
에는 어떤 추가 연산을 해도 결국 NaN
이 반환된다. 즉 연산 과정 어디선가 NaN
이 반환되었다면 이는 모든 결과에 영향을 미친다.
1
2
"숫자가 아님" / 2; // NaN, 문자열을 숫자로 나누면 오류 발생
"숫자가 아님" / 2 + 5; // NaN
자바스크립트에서 행해지는 수학 연산은 안전하다. 0으로 나누거나 숫자가 아닌 문자열을 숫자로 취급하는 등 말이 안 되는 수학 연산을 하더라도 스크립트는 치명적인 에러를 내뿜으며 죽는 것이 아니라 NaN
을 반환하며 연산을 종료할 뿐이다.
BigInt
자바스크립트에서는 (253-1) 보다 큰 값 혹은 -(253-1) 보다 작은 정수는 ‘숫자형’을 사용해 나타낼 수 없다. 그러나 암호 관련 작업 등 아주 큰 숫자가 필요하거나 아주 높은 정밀도로 작업을 해야 할 때 이런 큰 숫자가 필요하다. BigInt 형은 표준으로 채택된 지 얼마 안 된 자료형으로, 길이에 상관없이 정수를 나타낼 수 있다. BigInt 형 값은 정수 리터럴 끝에 n
을 붙이면 만들 수 있다.
1
const bigInt = 1234567890123456789012345678901234567890n;
문자형
따옴표에는 큰따옴표, 작은따옴표, 역 따옴표(백틱)가 있다. 큰따옴표와 작은따옴표는 기본적인 따옴표로 차이가 없다. 역따옴표로 변수나 표현식을 감싼 후 ${}
안에 넣어 주면 원하는 변수나 표현식을 문자열 중간에 손쉽게 넣을 수 잇다. 이렇게 문자열 중간에 들어간 변수나 표현식은 평가가 끝난 후 문자열의 일부가 된다.
1
2
3
4
5
let name = "John";
// 변수를 문자열 중간에 삽입
alert(`Hello, ${name}!`); // Hello John!
// 표현식을 문자열 중간에 삽입
alert(`the result is ${1 + 2}`); // the result is 3
자바의 char
과 같은 글자형은 자바스크립트에 존재하지 않는다.
불린형
긍정이나 부정을 나타내는 값을 저장할 때 사용하고, 비교 결과를 저장할 때도 사용된다.
null
값
null
값은 오로지 null
값만 포함하는 별도의 자료형을 만든다.
다른 언어에선 null
을 존재하지 않는 객체에 대한 참조 나 널 포인터(null pointer)를 나타낼 때 사용한다. 하지만 자바스크립트에서는 null
을 존재하지 않는(nothing) 값, 비어있는(empty) 값, 알 수 없는(unknown) 값을 나타내는 데 사용한다.
즉 let age = null;
은 나이(age)를 알 수 없거나 그 값이 비어있음을 보여준다.
undefined
값
자신만의 자료형을 형성한다. undefined
는 값이 할당되지 않은 상태를 나타낼 때 사용한다. 변수는 선언했지만, 값을 할당하지 않았다면 해당 변수에 undefined
가 자동으로 할당된다. 변수에 명시적으로 undefined
를 할당할 수도 있지만 이것은 권장되지 않는다. 변수가 ‘비어있거나’ ‘알 수 없는’ 상태임을 나타내려면 null
을 사용하자.
### 객체와 심볼
객체형을 제외한 다른 자료형은 한 가지만 표현할 수 있기 때문에 원시(primitive) 자료형이라 부른다. 반면 객체는 데이터 컬렉션이나 복잡한 개체(entity)를 표현할 수 있다.
심볼(symbol)형은 객체의 고유한 식별자(unique identifier)를 만들 때 사용된다.
typeof
연산자
인수의 자료형을 반환하는 연산자이다. 자료형에 따라 처리 방식을 다르게 하고 싶거나 변수의 자료형을 알아내고자 할 때 유용하다. 연산자 문법(typeof x
), 함수 문법(typeof (x)
) 모두 지원한다.
1
2
3
4
5
6
7
8
9
typeof undefined // "undefined"
typeof 0 // "number"
typeof 10n // "bigint"
typeof true // "boolean"
typeof "foo" // "string"
typeof Symbol("id") // "symbol"
typeof Math // "object" (1)
typeof null // "object" (2)
typeof alert // "function" (3)
typeof null
의 결과는 "object"
이다. null
은 별도의 고유한 자료형을 가지는 특수값으로 객체가 아니지만, 하위 호환성을 위해 이런 오류를 수정하지 않고 남겨놓은 상황이다.
typeof 함수
의 결과는 "function"
이다. 그러나 함수형은 따로 없고 함수는 객체형에 속한다. 하위 호환성 유지를 위해 남겨놓은 상태이다. 한편 실무에서는 이런 특징이 매우 유용하게 사용되기도 한다.
과제
문자열 따옴표
1
2
3
4
5
6
7
8
9
10
11
let name = "Ilya";
// 표현식은 숫자 1
alert(`hello ${1}`); // hello 1
// 표현식은 문자열 "name"
alert(`hello ${"name"}`); // hello name
// 표현식 안에 변수가 들어 있기 때문에 이 변수가 평가되어
// 전체 문자열이 반환된다.
alert(`hello ${name}`) // hello Ilya