[자바스크립트 ES6+ 기본] 18. Symbol 오브젝트

Speedwell🍀·2022년 2월 3일
0

primitive 값

  • 자바스크립트에서 Primitive 값은

    • 오브젝트가 아니라 값이며 함수를 갖고 있지 않음
  • const num = 100;을 할당하면

    • num 변수에 100만 할당되며 아무것도 첨부되지 않음
    • 100이 primitive 값
  • ES5의 primitive 값 타입

    • string, number, boolean, null, undefined
  • ES6에서 symbol 타입 추가


Wrapper 오브젝트

  • wrapper 오브젝트는?

    • 프리미티브 값이 포함된 오브젝트
    • wrapper 오브젝트에는 메소드가 있음
  • wrapper 오브젝트가 있는 프리미티브 값 타입

    • string: String, number: Number 오브젝트
    • boolean: Boolean, symbol: Symbol 오브젝트
  • const obj = new String(100);

    • obj 인스턴스의 [[PrimitiveValue]]에 100이 설정됨
    • [[PrimitiveValue]] 형태
  • undefined, null은 wrapper 오브젝트 없음


Symbol()

  • Symbol() 함수는 값을 생성하여 반환
    • 반환된 값을 볼 수 없음
    • new 연산자를 사용할 수 없음
const sym = Symbol();
log(sym);
log(typeof sym);

// Symbol()
// symbol
  • 프로그램 전체를 통해 유일한 값 제공
const one = Symbol();
const two = Symbol();
log(one == two);

// false
  • Symbol 값으로 연산 불가
let sym = Symbol();
try {
  const add = sym + 5;
} catch(e){
  log("연산 불가");
};

// 연산 불가	
  • Symbol 타입 변경 불가
let sym = Symbol();
try {
  +sym;
} catch{
  log("값 타입 변경 불가");
};

// 값 타입 변경 불가
  • 파라미터에 주석, 설명을 작성
const sym = Symbol("주석, 설명");
log(sym);

// Symbol(주석, 설명)
  • Symbol 값을 문자열로 바꿔서 연결
const sym = Symbol("설명");
log(sym.toString() + "연결");

// Symbol(설명)연결
  • Template에 사용
const sym = Symbol("주석, 설명");
try {
  `${sym}`
} catch {
  log("`${sym} 불가`");
};

// `${sym} 불가`

Symbol 사용 형태

  • Object의 프로퍼티 키로 사용
    • Symbol 값이 유일하므로 중복되지 않음
    • symbol-keyed property라고 부름
    • 프로퍼티 값 추출 방법
const sym = Symbol("설명");
const obj = {[sym]: 100}; // [sym]처럼 대괄호 안에 Symbol()로 할당한 변수 이름 작성 => 이를 symbol-keyed property라고 부름
// 프로퍼티 값 추출 방법
const sym = Symbol("설명");
const obj = {[sym]: 100};
log(obj[sym]);
log(obj.sym);

// 100
// undefined
  • Object에서 함수 이름으로 사용
const sym = Symbol("함수 이름");
const obj = {
  [sym](param){
    return param;
  }
};
log(obj[sym](200));

// 200
  • for-in 문에서 사용
    • Symbol이 열거되지 않음
    • [[Enumberable]]:false이기 때문
const obj = {
  [Symbol("100")]: 100,
  two: 200
};
for (let key in obj){
  log(key);
};

// two
  • Object.getOwnPropertySymbols()로 열거 가능

    • 다음 장에서 다룸
  • for-of문에서 사용

    • 배열 안에 Symbol() 작성
const list = [Symbol("100")];
for (let value of list){
  log(value);
};

// Symbol(100)
  • JSON.stringify()에서 사용
    • Symbol 값이 문자열로 변환되지 않음
const sym = Symbol("JSON");
const result = JSON.stringify({[sym]: "ABC"});
log(result);

// {}

0개의 댓글