JavaScript의 Symbol

JavaScript의 타입들

  • string, number, boolean, undefined, null, object
  • 그리고 ES6에서 도입된 symbol

symbol

  • 변경 불가능한 원시 타입의 값
  • 값의 고유함이 보장됨
  • 값이 외부로 노출되지 않음
  • 이름 충돌이 발생하지 않는 고유의 프로퍼티 키를 만들기 위해 사용함
  • 문자열과 숫자 타입으로 암묵적 변환이 일어나지 않음
    • 불리언으로는 암묵적 타입 변환 가능

symbol 의 생성

  • Symbol 함수를 호출해 생성함
    • Symbol 은 생성자가 아님!! new 연산자가 안붙는다!
    • 매개변수로 디버깅에 사용될 심볼을 설명하는 문자열을 제공할 수 있음
  • Symbol.for 함수를 호출해 생성함
    • 심볼을 저장하기 위한 전역 심볼 레지스트리가 있음
    • Symbol.for 함수는 매개변수로 받은 문자열을 키로 전역 심볼 레지스트리에 접근함
    • 전역 심볼 레지스트리에 해당 키가 존재하면 심볼을 반환
    • 전역 심볼 레지스트리에 해당 키가 존재하지 않으면 심볼 생성 후 저장/반환
    • Symbol.for 로 생성된 심볼은 Symbol.keyFor 을 통해 키를 얻을 수 있음

symbol 의 사용

  • 고유함이 보장되기 때문에 상수로 사용되거나 프로퍼티 키로 사용됨
  • 특히 프로퍼티 키로 사용 시
    • 다른 프로퍼티 키와 충돌하지 않는 키를 얻을 수 있음
    • for ... inObject.keys, Object.getOwnPropertyNames 에서 보이지 않음

프로퍼티 은닉

  • 프로퍼티 키로 symbol 을 사용하면 외부에 노출되지 않는 프로퍼티 키를 만들 수 있음
  • 하지만 Object.getOwnPropertySymbols 메서드로 찾을 수 있다!

표준 빌트인 객체 확장

  • 프로퍼티 키로 symbol 을 사용해 표준 빌트인 객체를 확장할 수 있음
  • 이후 표준 빌트인 객체에 메서드가 추가되더라도 커스텀한 프로퍼티 키와 충돌할 일이 절대 없다!
    • Array.prototype.find 메서드를 ES6 이전에 추가했다면 이후 추가된 표준 함수를 덮어쓰게 된다!
    • 심볼을 사용한다면 이름 충돌 걱정 없이 마음껏 확장 가능하다!

Well-known symbol

  • 자바스크립트 엔진의 알고리즘에서 사용되는 심볼들
  • Symbol 함수의 프로퍼티에 할당되어 있음
    • Symbol.iterator