JavaScript에서 값은 항상 문자열이나 숫자형 같은 특정한 자료형에 속한다. 이때 변수는 자료형에 관계없이 모든 데이터일 수 있다.
이처럼 자료의 타입은 있지만 변수에 저장되는 값의 타입은 언제든지 바꿀 수 있는 언어를 ‘동적 타입(dynamically typed)’ 언어라고 부른다.
let n = 123;
n = 12.345;
숫자형은 정수 및 소수점(floating point number)을 나타낸다.
숫자형과 관련된 연산은 다양하지만 곱셈 *, 나눗셈 /, 덧셈 +, 뺄셈 -
이 대표적이다.
숫자형에는 일반적인 숫자 외에도
Infinity, -Infinity, NaN같은 '특수 숫자 값(special numeric value)'도 포함된다.
Infinity는 어떤 숫자보다 더 큰 특수 값, 무한대(∞)를 나타낸다.
alert( 1 / 0 );
// 어느 숫자든 0으로 나누면 무한대를 얻는다.
alert( Infinity );
// Infinity를 직접 참조한다.
NaN은 계산 중에 에러가 발생했다는 것을 나타낸다. 부정확하거나 정의되지 않은 수학 연산을 사용하면 NaN이 반환된다.
alert( "숫자가 아님" / 2 );
// 문자열을 숫자로 나누면 오류가 발생한다.
! 과정중 NaN이 반환되었다면 모든 결과에 영향을 미친다.
내부 표현 방식 때문에 자바스크립트에서는(9007199254740991) 보다 큰 값 혹은 -(9007199254740991) 보다 작은 정수는 '숫자형’을 사용해 나타낼 수 없다.
const bigInt = 1234567890123456789012345678901234567890n;
//BigInt형 값은 정수 리터럴 끝에 n을 붙이면 만들 수 있다.
자바스크립트에선 문자열(string)을 따옴표로 표현한다.
1. 큰따옴표: "Hello"
2. 작은따옴표: 'Hello'
3. 역 따옴표(백틱, backtick): Hello
let str = "Hello";
let str2 = 'Single quotes are ok too';
let phrase = `can embed another ${str}`;
큰따옴표와 작은따옴표는 기본적인 따옴표로 둘에 차이는 없다.
let name = "John";
// 변수를 문자열 중간에 삽입
alert( `Hello, ${name}!` ); // Hello, John!
// 표현식을 문자열 중간에 삽입
alert( `the result is ${1 + 2}` ); // the result is 3
백틱(`)은 변수나 표현식을 감싼 후 ${…}안에 넣어주면,
원하는 변수나 표현식을 문자열 중간에 넣을 수 있다.
${…}
안에는 name 같은 변수나 1 + 2 같은 수학 관련 표현식을 넣을 수 있다. 이렇게 문자열 중간에 들어간 변수나 표현식은 문자열의 일부가 된다.
! 큰따옴표나 작은따옴표를 사용하면 중간에 표현식을 넣을 수 없다.
C 언어와 Java 와 같은 일부 언어에서 글자 하나를 저장할 때 쓰이는 문자형(char)은 따로 없다.
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; //나이(age)를 알 수 없거나 그 값이 비어있음
다른 언어에서는 null을 '존재하지 않는 객체에 대한 참조’나 '널 포인터(null pointer)'를 나타낼 때 사용한다.
자바스크립트에서는 null을 ‘존재하지 않는(nothing)’ 값, ‘비어 있는(empty)’ 값, ‘알 수 없는(unknown)’ 값을 나타낸다.
undefined값도 null 값처럼 자신만의 자료형을 만든다. undefined는 '값이 할당되지 않은 상태’를 나타낸다.
let age;
alert(age); // 결과 : 'undefined'
//변수를 선언했지만 값을 할당하지 않으면 해당 변수에 undefined가 자동으로 할당된다.
let age = 100;
age = undefined;// 값을 undefined로 바꿔준다.
alert(age); // 결과 : "undefined"
// 개발자가 변수에 undefined를 명시적으로 할당하는 것도 가능하다.
하지만 변수가 ‘비어있는/알 수 없는’ 상태라는 걸 나타내고 싶다면 null을 사용하는 편이 좋다.
undefined는 값이 할당되지 않은 변수의 초기값을 위해 예약어로 남겨두자.
객체(object)형은 특수한 자료형이다.
객체형을 제외한 다른 자료형은 문자열이든 숫자든 한 가지만 표현할 수 있기 때문에 원시(primitive) 자료형이라 부른다. 반면 객체는 데이터 컬렉션이나 복잡한 개체(entity)를 표현할 수 있다.
심볼(symbol)형은 객체의 고유한 식별자(unique identifier)를 만들 때 사용된다.
typeof 연산자는 인수의 자료형을 반환한다. 자료형에 따라 처리 방식을 다르게 하고 싶거나 변수의 자료형을 빠르게 알아내고자 할 때 사용한다.
//typeof x를 호출하면 인수의 자료형을 나타낸다.
typeof undefined // "undefined"
typeof 0 // "number"
typeof 10n // "bigint"
typeof true // "boolean"
typeof "foo" // "string"
typeof Symbol("id") // "symbol"
typeof Math // "object"
//Math는 수학 연산을 제공하는 내장 객체이다.
typeof null // "object"
// null은 별도의 고유한 자료형을 가지는 특수 값으로 객체가 아니지만 하위 호환성을 유지하기 위해 이런 오류를 수정하지 않고 남겨둔 상황이다.
// 언어 자체의 오류이므로 null이 객체가 아님 주의하자.
typeof alert // "function"
//피연산자가 함수면 "function"을 반환한다.
//'함수’형은 따로 없으며 함수는 객체형에 속한다.