Javascript에서 원시 값(primitive)는 객체가 아니면서 메서드 혹은 속성을 가지지 않는 데이터이다.
원시 값은 불변이므로 변경할 수 없다.
여기서 말하는 불변은 원시 값 자체를 의미하는 것 이지 원시 값을 할당한 변수를 이야기하는 것이 아니다. 즉 원시 값을 할당한 변수는 변수에 따라 재할당, 재선언이 가능하고, 원시 값 자체는 불변이므로 변경할 수 없다.
이제 원시 값의 종류에 대해 알아보자.
string은 문자열을 의미한다. 자바스크립트를 사용하다보면 String이라는 객체를 볼 수 있는데 이는 string 원시 값을 둘러 싼 wrapper 이다.
Wrapper란?
하나 이상의 다른 기능들을 호출하기 위한 기능이다. 원시 값 들은 언어에서 변경이 불가 하기에 Wrapper객체를 이용하여 해당 원시 값을 포장하여 메서드가 있는 것 처럼 작동하게한다.
ex."string".includes("r"); // true // Wrapper new String("string").prototype.includes("r"); // true
number는 배정밀도 64비트 부동 소수점 형식의 숫자 데이터 타입이다.
배정밀도 64비트 부동소수점
부동 소수점은 소수점이 고정이 아니라는뜻인데 64비트 배정밀도의 부동소수점은 컴퓨터가 인식할수있는 2진수로 표현할때 맨 왼쪽 1비트는 부호비트, 이어지는 11비트는 지수부, 나머지 52비트는 가수부로 표현된다.
지수부는 10의 거듭제곱으로 값으 크기를 표현하고, 가수부는 값의 모양을 표기한다.
그러기에 자바스크립트의 소수점 연산은 재밌는 결과가 나온다.
console.log(0.1 + 0.2) // 0.30000000000000004
console.log(0.2 + 0.2) // 0.4
number역시 Number라는 Wrapper객체가 존재한다.
const a = 123;
a.toString() // '123'
new Number(123).toString() // '123'
bigint는 임의 정밀도 방식(정수를 숫자의 배열로 간주해 자릿수단위로 쪼개어 배열 형태로 표현)으로 정수를 나타낼 수 있는 숫자 데이터 타입이다.
선언은 숫자 뒤에 n을 붙이거나 Bigint 함수안에 숫자나 문자열을 넣어주면된다.
const bigintNumber = 2394823904823904823904823904890234n;
const bigintString = BigInt("28934230482390490234909023490234");
console.log(bigintNumber, bigintString);
//2394823904823904823904823904890234n 28934230482390490234909023490234n
주의. bigint는 단항 덧셈 연산자 +value를 지원 안한다.
const bigintNumber = 2394823904823904823904823904890234n;
+bigintNumber;
// TypeError: Cannot convert a BigInt value to a number
boolean은 논리적인 데이터 유형이다. true와 false의 값만 가질 수 있다. Boolean이라는 wrapper객체를 가지고 있다.
const a = true;
a.toString(); // 'true'
new Boolean(true).toString(); // 'true'
symbol은 생성자가 symbol원시값을 반환하는 내장 객체이다. symbol 원시 값은 고유함이 보장되기에 객체에 속성을 추가할 때 고유한 키를 부여하여 다른코드와의 충돌하지 않도록 할 때 많이 쓰인다.
const a = Symbol("asdf");
const b = Symbol("asdf");
a == b; // false
a === b; // false
symbol은 Symbol()로 생성하기에 new 연산자를 쓰면 타입에러가 발생한다.
const symbols = new Symbol("asdf");
// TypeError: Symbol is not a constructor;
만약 정말로 Symbol의 래퍼객체를 생성해야만 한다면 Object()함수를 사용할 수 있다.
const symbols = Symbol("asdf");
typeof symbols;
// symbol
const symbolObject = Object(symbols);
typeof symbolObject;
// object
undefined는 원시 값으로써, 선언한 후 값이 아직 할당되지 않은 변수 혹은 인수에 자동으로 할당된다.
const a;
console.log(a); // undefined;
var는 실행컨텍스트에서 선언이될때 undefined로 초기화 되기 때문에 할당보다 먼저 선언호출시 undefined로 나온다. let과 const는 undefined로 초기화 되지 않기때문에 Reference Error가 발생한다.
console.log(vars);
console.log(lets);
console.log(consts);
var vars = 1; // undefined
let lets = 1; // lets is not defined
const consts = 1; // consts is not defined
null은 어떤 값이 의도적으로 비어있음을 표현하며, boolean 연산에서 거짓으로 취급한다. undefined와 마찬가지로 없다는 의미를 표현하기때문에 동등연산자(==)는 null과 undefined의 관계를 true로 반환하지만, 일치연산자(===)에서는 false로 반환한다.
const a = null;
if(a) {
console.log(true);
} else {
console.log(false);
}
// false
null == undefined
undefined == null
// true
null === undefined
undefined === null
// false