모던 JavaScript 튜토리얼을 읽고 정리한 글입니다.
Preview
JavaScript에는 8가지 기본 자료형이 있다.
숫자형
: 정수, 부동 소수점 숫자 등의 숫자. 정수의 한계는 \(\pm2^{53}\)이다.
biging
: 길이 제약 없이 정수를 나타낼 수 있다.
문자형
: 빈 문자열이나 글자로 이뤄진 문자열. 단일 문자를 나타내는 별도의 자료형은 없다.
불린형
:true
,false
null
:null
값(알 수 없는 값)만을 위한 독립 자료형
undefined
:undefined
값(할당되지 않은 값)만을 위한 독립 자료형객체형: 복잡한 데이터 구조를 표현할 때 사용한다.
심볼형: 객체의 고유 식별자를 만들 때 사용한다.
typeof
연산자는 피연산자의 자료형을 알려준다.
typeof x
또는typeof(x)
형태로 사용한다.- 피연산자의 자료형을 문자열 형태로 변환한다.
null
의typeof
연산은"object"
인데 이는 언어상 오류이다.null
은 객체가 아니다!
자료형
JavaScript에서 값은 항상 특정 자료형에 속한다. JavaScript에는 8가지 기본 자료형이 있다.
동적 타입 언어인 JavaScript는 자료의 타입은 있지만 변수에 저장되는 값의 타입은 언제든지 바꿀 수 있다.
// no error
let message = "hello";
message = 123456;
🔢 숫자형
숫자형은 정수 및 부동소수점 숫자를 나타낸다. 숫자형과 관련된 연산은 곱셈*
, 나눗셈/
, 덧셈+
, 뺄셈-
등이 대표적이다. 일반적인 숫자 외에 특수 숫자 값(Infinity
, -Infinity
, NaN
)도 포함된다.
Infinity
: 어떤 숫자보다 더 큰 특수 값, 무한대(∞)를 나타낸다.- 어느 숫자든 0으로 나누면 무한대를 얻을 수 있다.
Infinity
를 직접 참조할 수도 있다.
NaN
: 계산 중에 에러가 발생했음을 나타내는 값. 부정확하거나 정의되지 않은 수학 연산을 사용하면 계산 중에 에러가 발생할 수 있다.- 문자열을 숫자로 나누면 에러가 발생한다.
NaN
에 어떠한 추가 연산을 해도 결국NaN
이 반환된다.- 연산 과정 어디에선가
NaN
이 반환되면 모든 결과에 영향을 미친다.
alert(1/0); // 무한대
alert( Infinity ); // 무한대
alert( "숫자가 아님" / 2 ); // NaN
alert( "숫자가 아님" / 2 + 5 ); // NaN
JavaScript에서 하는 수학 연산은 안전하다. 0으로 나누거나 숫자가 아닌 문자열을 숫자로 취급하는 등의 연산도 가능하다. 에러 대신
NaN
을 반환하며 연산을 종료할 뿐!
현실에서는 특수 숫자 값을 숫자로 취급하진 않지만 JavaScript에서는 숫자형으로 분류한다.
🦖 BigInt
내부 표현 방식 때문에 JavaScript에서는 (\(2^{53}\)-1)(9007199254740991
)보다 큰 값 또는 -(\(2^{53}\)-1)보다 작은 정수는 숫자형으로 나타낼 수 없다. 대부분의 경우에는 이런 제약이 문제가 되지 않지만, 아주 큰 숫자가 필요하거나 아주 높은 정밀도로 작업을 해야 할 때는 이런 큰 숫자가 필요하다.
BigInt
형은 표준으로 채택된지 얼마 안 된 자료형으로, 길이에 상관없이 정수를 나타낼 수 있다. 정수 리터럴 끝에 n
을 붙이면 만들 수 있다. Firefox, Chrome, Edge, Safari에서만 지원하고 IE에서는 지원하지 않는다.
const bigInt = 1234567890123456789012345678901234567890n;
🔠 문자형
JavaScript에서는 문자열(string)을 따옴표로 묶는다. 큰따옴표""
와 작은따옴표''
는 구분 없이 쓰인다. 역 따옴표(백틱, backtick)로 변수나 표현식을 감싼 후 ${...}
안에 넣어주면 변수나 표현식을 문자열 중간에 넣을 수 있다.
let name = "Neori";
// 변수를 문자열 중간에 삽입
alert( `Hello, ${name}!` ); // Hello, Neori!
// 표현식을 문자열 중간에 삽입
alert( `the result is ${1 + 2}` ); // the result is 3
이렇게 문자열 중간에 들어간 변수나 표현식은 평가가 끝난 후 문자열의 일부가 된다. 기본적인(큰/작은) 따옴표를 사용하면 중간에 표현식을 넣을 수 없다!
alert( "the result is ${1 + 2}" ); // the result is ${1 + 2} (큰따옴표는 확장 기능 지원X)
다른 일부 언어는 글자 하나를 저장할 때 쓰이는 자료형인 글자(character)형을 따로 지원한다. C언어와 Java의 char가 대표적인 예이다. JavaScript는 글자형을 지원하지 않는다. 글자 하나 이상 들어갈 수 있다.
❓ 불린형
불린(boolean)형(논리 타입)은 긍정 true
와 부정 false
두 가지 값만 갖는 자료형이다.
let nameFieldChecked = true; // name field가 확인됐다(checked)
let ageFieldChecked = false; // age field를 확인하지 않았다(not checked)
불린값은 비교 결과를 저장할 때도 사용된다.
let isGreater = 4 > 1;
alert( isGreater ); // true (비교 결과: "yes")
💭 ‘null’ 값
null
은 오로지 null
값만 포함하는 별도의 자료형이다.
let age = null;
JavaScript의 null
은 다른 언어의 null
과 성격이 다르다. 다른 언어에서는 존재하지 않는 객체에 대한 참조나 널 포인터를 나타낼 때 사용한다. 하지만 JavaScript에서는 존재하지 않는(nothing) 값, 비어 있는(empty) 값, 알 수 없는(unknown) 값을 나타낼 때 사용한다.
let age = null;
은 나이(age)를 알 수 없거나 그 값이 비어 있음을 의미한다.
📦 ‘undefined’ 값
undefined
도 null
처럼 자신만의 자료형을 갖고, 값이 할당되지 않은 상태를 나타낼 때 사용한다. 변수를 선언했지만 값을 할당하지 않으면 해당 변수에 undefined
가 자동으로 할당된다.
let age;
alert(age); // 'undefined'
변수에 undefined
를 명시적으로 할당하는 것도 가능하긴 하다. 하지만 이렇게 직접 할당하는 것은 권장하지 않는다. 변수가 비어 있거나 알 수 없는 상태라면 null
을 사용하자. undefined
는 값이 할당되지 않은 변수의 초기값을 위한 예약어로 남겨두자.
let age = 100;
// 값을 undefined로 바꾼다.
age = undefined;
alert(age); // "undefined"
🧳 객체와 심볼
객체(object)형은 특수한 자료형이다. 객체형을 제외한 다른 자료형은 한 가지만 표현할 수 있기 때문에 원시(primitive) 자료형이라고 부른다. 반면 객체는 데이터 컬렉션이나 복잡한 개체(entity)를 표현할 수 있다.
심볼(symbol)형은 객체의 고유한 식별자를 만들 때 사용된다.
❗️ typeof 연산자
typeof 연산자는 인수의 자료형을 나타내는 문자열을 반환한다. 자료형에 따라 처리방식을 다르게 하고 싶거나 변수의 자료형을 빠르게 알아내고자 할 때 유용하다. 연산자(typeof x
)와 함수(typeof(x)
) 두 가지 형태의 문법을 모두 지원하며 결과는 동일하다.
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)
Math
는 수학 연산을 제공하는 내장 객체이다. 내장 객체는 객체형이다.
typeof null
의 결과는 "object"
이다. null은 고유한 자료형을 갖는 특수 값이라서 객체는 아니지만, 하위 호환성을 유지하기 위해 오류를 남겨뒀다. 언어 자체의 오류이므로 유의해야 한다!
typeof
는 피연산자가 함수이면 "function"
을 반환한다. 하지만 함수형은 따로 없다. 함수는 객체형에 속한다. 형식적으로는 잘못되긴 했지만 아주 오래전에 만들어진 규칙이라서 하위 호환성 유지를 위해 남겨진 상태이다.