Skip to main content

33장 7번째 데이터 타입 Symbol

1. 심벌이란?

7번째 데이터 타입, 변경 불가능한 원시타입의 값이다. 다른 값과 중복되지 않는 유일무이한 값을 말한다. 주로 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용한다.

프로퍼티 키: 빈 문자열 포함, 모든 문자열 또는 심벌 값

2. 심벌 값의 생성

  • Symbol 함수

리터럴로 생성할수 없고, 함수를 호출한다. 외부로 노출되지않아 확인할수 없으며, 다른 값과 절대 중복되지않는다. new 연산자를 사용하지 않는다.

const mySymbol1 = Symbol(’mySumbol’); 

문자열 인수는 심벌 값에 대한 설명으로 디버깅 용도로만 사용한다. 심벌도 객체처럼 접근하면 암묵적으로 래퍼 객체를 생성한다. 심벌 값은 암묵적으로 문자열이나 숫자 타입으로 변환되지 않고, 불리언 타입은 변환된다.

  • Symbol.for/ Symbol.keyFor 메서드

Symbol.for 메서드는 인수로 전달받은 문자열을 키로 사용, 키와 심벌 값의 쌍들이 저장되어 있는 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색.

  1. 검색에 성공하면 검색된 심벌 값 반환
  2. 실패하면 새로운 심벌 값 생성, 레지스트리에 저장, 생성된 심벌 값 반환
  3. 그냥 Symbol 함수는 호출될때마다 심벌 값 생성 → 전역 심벌 레지스트리에서 심벌 값 검색할수 있는 키를 지정할수 없으므로 레스트스티에 등록되어 관리 되지 않음 → for 메서드는 중복되지않는 유일무이한 상수인 심벌 값 하나만 생성

Symbol.keyFor 메서드를 사용하면 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출한다.

3. 심벌과 상수

const Direction = {
UP: Symbol(’up’),
DOWN: Symbol(’down’),
LEFT: Symbol(’left’),
RIGHT: Symbol(’right’)
}

enum: named numeric constant 명명된 숫자 상수의 집합으로 열거형 enumerated type 이라고 부른다. 자바스크립트에서는 지원하지 않지만, 흉내내어 사용하려면 객체의 변경을 방지하기위해 객체를 동결하는 object.freeze 메서드와 심벌 값을 사용한다.

4. 심벌과 프로퍼티 키

심벌 값을 프로퍼티 키로 사용하려면 프로퍼티 키로 사용할 심벌 값에 대괄호 사용, 접근할때도 대괄호 사용

5. 심벌과 프로퍼티 은닉

심벌 값으로 된 프로퍼티 키는 for in 문이나 Object.keys, Object.getOwnPropertyNames 메서드로 찾을수 없다. 즉 프로퍼티를 은닉할 수 있다.

Object.getOwnPropertySymbol에서는 찾을수 있다.

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

일반적으로 표준 빌트인 객체에 사용자 정의 메서드를 직접 추가 하여 확장하는 것은 좋지 않다 - 직접 추가한 메서드와 미래에 표준 사양으로 추가될 메서드의 이름이 중복 될수있기 때문이다.

중복될 가능성이 없는 심벌 값으로 프로퍼티 키를 생성, 객체를 확장하면 충돌하지 않는다.

Array.prototype[Symbol.for(’sum’)] = function () {
return this.reduce((acc, cur) ⇒ acc + cur, 0)
}

7. Well-known Symbol

기본 제공하는 빌트인 심벌 값. 자바스크립트 엔진의 내부 알고리즘에 사용된다. Symbol 함수의 프로퍼티에 할당되어 있다.

well-known symbol 인 Symbol.iterator를 키로 갖는 메서드를 객체에 추가, 이터레이터를 반환하도록 구현하면 그 객체는 이터러블이 된다.