심벌 in JS

동동·2021년 8월 17일
0

1. JS 내 원시 타입

number, string, null, undefined, boolean, bigint, Symbol

※ 참조 타입: object

2. 심벌이란

심벌은 ES6 에 추가된 원시 타입으로서, 심벌 참조 없이 접근할 수 없는 객체의 열거 불가능 프로퍼티를 만드는데 키로 사용됩니다.

  • 심벌은 원시 타입이므로 Symbol 함수를 new 연산자를 이용하여 호출하면 TypeError가 발생합니다.
  • Symbol 함수가 받는 인자는 optional으로서, 심벌의 서술 문자열이다. 이 서술 문자열으로 객체의 프로퍼티에 접근할 수 없으며, 심벌을 쉽게 읽고 디버깅할 수 있도록 하는 역할을 한다.

3. 심벌 사용 방법

심벌은 계산된 프로퍼티 이름([identifier])이 허용되는 모든 곳에서 대괄호 연산자(bracket notation) 안에 기재하여 사용할 수 있다.

4. 심벌 공유하기

유일한 식별자를 나타내는 동일한 심벌 프로퍼티를 어플리케이션 내에서 전역으로 사용하고자 할 경우, Symbol.for() 메서드를 사용할 수 있다.
Symbol.for() 메서드는 만들려는 심벌의 키로서 문자열 식별자 하나를 매개변수로 받습니다.

Symbol.for() 메서드는 문자열 매개변수를 키로 하는 심벌이 존재하는지 전역 심벌 저장소를 검색하여, 심벌이 존재하면 그 심벌을 반환하고, 존재하지 않으면 명시한 키를 사용하여 새로운 심벌을 만들고 전역 심벌 저장소에 등록한 뒤 새로운 심벌을 반환합니다.

이후 같은 키를 사용하여 Symbol.for()를 호출하면 같은 심벌이 반환된다.

Symbol.keyFor() 메서드에 심벌을 인자로 전달하면, 해당 심벌이 전역 심벌 저장소에 등록된 경우에는 해당 심벌의 문자열 키를 반환하며, 그렇지 않으면 undefined를 반환한다.

5. 심벌 타입 변환

심벌은 문자열이나 숫자로 변환되지 않는다. 심벌로서 예측되는 동작과 다르게 프로퍼티로 사용되는 것을 방지하기 위함이다.

// 예시
const add = (a,b) => a + b; 

console.log(add("a", "b")); // "ab"
console.log(add("a", Symbol("s"))); // TypeError: Cannot convert a Symbol value to a string

6. 객체에서 심벌 프로퍼티 탐색

심벌을 키로 하는 객체의 프로퍼티를 탐색하기 위해 Object.getOwnPropertySymbols()를 사용할 수 있다.

※ 심벌 프로퍼티는 기본적으로 열거 불가능이다.

Object.keys(), Object.getOwnPropertyNames()를 호출하여도 ES5 와의 호환성을 위해 심벌 프로퍼티를 반환하지 않는다.

7. 상용 심벌

ES6에서는 예전에는 내부 전용 연산자로 여겨지던 공통 동작을 상용 심벌(well-known symbols)로 정했다. 주로 특정 객체의 기본 동작 정의 심벌 프로토타입 프로퍼티를 사용하여 언어의 내부 로직이었떤 부분을 훨씬 더 많이 노출하였따.

상용 심벌은 Symbol.match 처럼 Symbol 객체의 프로퍼티로 나타낸다.

profile
작은 실패, 빠른 피드백, 다시 시도

0개의 댓글