모자딥 33장 7번째 데이터 타입 Symbol

릿·2023년 2월 7일
0

33장 7번째 데이터 타입 Symbol

33.1 심벌이란?


  • 심벌은 변경 불가능한 원시타입, 중복되지 않는 유일무일한 값

33.2 심벌 값의 생성


33.2.1 Symbol함수

  • 심벌값은 Symbol함수를 호출하여 생성해야 함
  • 생성된 심벌 값은 외부로 노출되지 않아 확인할 수 없음
const mySymbol = Symbol();
console.log(mySymbol); // Symbol()
  • new연산자로 호출하지 않음
  • 심벌 값에 대한 설명이 같더라도 생성된 심벌은 유일무일한 값임
const mySymbol1 = Symbol('mySymbol');
const mySymbol2 = Symbol('mySymbol');

console.log(mySymbol1 === mySymbol2); // false
  • 심벌 값은 암묵적으로 문자열, 숫자타입으로 변환되지 않지만 불리언 타입으로는 변환됨
const mySymbol = Symbol();

console.log(!!mySymbol); // true

33.2.2 Symbol.for / Symbol.keyFor메서드

1. Symbol.for메서드

  • Symbol.for메서드는 인수를 키로 사용하여 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌값을 검색
  • 검색에 성공: 새로운 심벌값을 생성하지 않고 검색된 심벌값 반환
  • 검색에 실패: 새로운 심벌값을 생성하여 전역 심벌 레지스트리에 저장한 후, 생성된 심벌값을 반환
const s1 = Symbol.for('mySymbol');
const s2 = Symbol.for('mySymbol');

console.log(s1 === s2); // true

2. Symbol.keyFor메서드

  • Symbol.keyFor메서드를 사용하면 전역 심벌 레지스트리에 저장된 심벌값의 키를 추출할 수 있음
const s1 = Symbol.for('mySymbol');
Symbol.keyFor(s1); // -> mySymbol

33.3 심벌과 상수


  • 값에는 의미가 없고 상수 이름 자체에 의미가 있는 경우, 중복이 없는 심벌 값으로 대체 사용할 수 있음
const Direction = {
  UP: 1,
  DOWN: 2,
  LEFT: 3,
  RIGHT: 4
};

// 심벌로 대체
const Direction = {
  UP: Symbol('up');
  DOWN: Symbol('down');
  LEFT: Symbol('left');
  RIGHT: Symbol('right');
};

33.4 심벌과 프로퍼티 키


  • 객체의 프로퍼티 키는 모든 문자열, 심벌 값으로 만들 수 있고, 동적으로 생성할 수 있음
const obj = {
  [Symbol.for('mySymbol')]: 1
};

obj[Symbol.for('mySymbol')]; // -> 1

33.5 심벌과 프로퍼티 은닉


  • 심벌값을 프로퍼티 키로 생성한 프로퍼티는 for...in문, Object.keys, Object.getOwnPropertyNames메서드로 찾을 수 없음
  • Object.getOwnPropertySymbol메서드를 사용하면 찾을 수 있음

33.6 심벌과 표준 빌트인 객체 확장


  • 일반적으로 표준 빌트인 객체에 직접 메서드를 추가하는 건 메서드명이 중복될 수 있기 때문에 권장하지 않지만 심벌값으로 추가하면 안전하게 표준 빌트인 객체를 확장할 수 있음
Array.prototype[Symbol.for('sum')] = function () {
  return this.reduce((acc, cur) => acc + cur, 0);
};

[1, 2][Symbol.for('sum')](); // -> 3

33.7 Well-known Symbol


  • 자바스크립트가 기본 제공하는 빌트인 심벌값을 Well-Known Symbol이라 부름
profile
항상 재밌는 뭔가를 찾고 있는 프론트엔드 개발자

0개의 댓글