2023.11.02 - TIL

유니·2023년 11월 2일
0
post-custom-banner

원시 값

Javascript에서 원시 값(primitive)는 객체가 아니면서 메서드 혹은 속성을 가지지 않는 데이터이다.

원시 값은 불변이므로 변경할 수 없다.

여기서 말하는 불변은 원시 값 자체를 의미하는 것 이지 원시 값을 할당한 변수를 이야기하는 것이 아니다. 즉 원시 값을 할당한 변수는 변수에 따라 재할당, 재선언이 가능하고, 원시 값 자체는 불변이므로 변경할 수 없다.

이제 원시 값의 종류에 대해 알아보자.

1. string

string은 문자열을 의미한다. 자바스크립트를 사용하다보면 String이라는 객체를 볼 수 있는데 이는 string 원시 값을 둘러 싼 wrapper 이다.

Wrapper란?
하나 이상의 다른 기능들을 호출하기 위한 기능이다. 원시 값 들은 언어에서 변경이 불가 하기에 Wrapper객체를 이용하여 해당 원시 값을 포장하여 메서드가 있는 것 처럼 작동하게한다.
ex.

"string".includes("r"); // true
// Wrapper
new String("string").prototype.includes("r"); // true

2. number

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'

3. bigint

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

4. boolean

boolean은 논리적인 데이터 유형이다. true와 false의 값만 가질 수 있다. Boolean이라는 wrapper객체를 가지고 있다.

const a = true;
a.toString(); // 'true'
new Boolean(true).toString(); // 'true'

5. symbol

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

6. undefined

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

7. null

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
profile
Prospective Junior Front-end Developer
post-custom-banner

0개의 댓글