Javascript와 심볼 Symbol

박성룡 ( Andrew park )
3 min readApr 29, 2019

--

자바스크립트를 처음부터 다시 공부해보려고 한다.

프로그래밍 언어에서 심볼은 객체의 고유한 식별자를 의미한다. 고유한 심볼 테이블이 심볼들을 가지고 있다.

ES6 에서 Symbol 타입이 추가되었다.

자바스크립트는 아래와 같은 타입을 가질수 있다.

  • Number
  • String
  • Object
  • Undefined
  • Null
  • Boolean
  • Symbol

심볼의 특징

심볼은 객체 속성(object property)을 만들 수 있는 원시 데이터 형식(primitive data type) 이다.

정의하면 독립적인 값이 되기때문에, 같은 string 으로 정의해도 같은 값이 아니다.

Symbol 의 valueof 는 원시형 값이 아니다. 때문에 문자형과 합칠수 없다.

‘text’ + Symbol(‘string’) // Error

심볼의 생성

심볼은 3가지 방법으로 생성할 수 있다.

  1. Symbol();
  2. Symbol.for();
  3. Symbol.iterator

이중 Symbol.iterator은 iterator 객체를 정의하기 위해 쓰인다.
object[@@iterator]

var obj = {}
obj[Symbol.iterator] = function* {}

Symbol() 과 Symbol.for() 차이점

앞서 말했던것 처럼 Symbol() 은 고유한 심볼을 반환한다.

하지만 Symbol.for() 는 전역으로 존재하는 global symbol table 의 목록을 참조한다.

때문에 Symbol.for(token string) 으로 정의할때, token string 으로 정의 된 심볼이 있다면, 해당 심볼을 반환하게 된다.

Symbol.keyFor

Symbol.keyFor 은 global symbol table 로부터 존재하는 Symbol의 token string 을 반환한다.

객체에서 심볼 속성 찾기

Symbol 속성은 열거형 속성이 아니기 때문에 for of 이나 Object.keys 때 찾지를 못한다.

Object.getOwnPropertySymbols 로 찾아야 한다.

또한 JSON.stringify() 에서도 무시된다.

String matching

문자열의 정규표현식을 비교하는 메소드를 Symbol Object로 대체 할 수 있다.

아래 메서드를 사용하려고 할때, 정규표현식 대신 Object를 전달한다면 해당 Object의 심볼 속성을 먼저 확인한다.

  • Symbol.match
  • Symbol.replace
  • Symbol.search
  • Symbol.split

그외의 심볼들

Symbol.isConcatSpreadable

Array.prototype.concat() 을 처리시 사용된다.

Symbol.toPrimitive

객체를 원시 값 형태로 처리할 수 있는 function 을 지정할 수 있다.

Symbol.toStringTag

Object.prototype.toString() 에서 사용된다.

--

--