하지만 ECMAScript 6에서는 이제 number나 string을 이용할 필요가 없다. ECMAScript 6에서는 새로운 타입인 Symbol 타입이 추가되었기 때문이다.
Symbol 타입의 값은
Symbol
함수를 통해서만 생성할 수 있고, new
를 통해서 만들 수 없다.Symbol
함수는 인자로 description을 받을 수도 있고, 아무 인자도 받지 않을 수도 있다. 이 인자는 실제로 생성되는 Symbol
에 영향을 주지 않는다. 로깅 등을 위해서 toString
함수를 이용해 string으로 변환할 때, 반영되지만 이는 디버깅을 위해서고, 일반적으로 이 description을 이용할 일은 없다. 같은 description을 이용해 생성한 Symbol
도 실제로는 다른 값을 가진다.이는 Symbol 타입이 unique함을 보장하기 때문이다. Symbol 타입은 immutability와 unique 함이 보장된다. number나 string도 immutability는 보장된다. 하지만 unique 함은 보장되지 않는다. 이것이 Symbol 타입과 number/string 타입과의 차이점이다.
같은 Symbol을 가지고 오기 위해서는 생성한 Symbol을 전역 변수로 등록시키고 있어야 한다. 이것을 해주는 게
for
함수이다.Symbol.for()
함수는 key를 인자로 받는다. 이전에 같은 key로 생성한 Symbol이 있으면 그 Symbol을 돌려주고, 처음 받은 key면 새로운 Symbol을 생성하여, 저장한 뒤 돌려준다.주의해야 할 것은
Symbol.for(key)
함수는 이미 등록된 Symbol이 있을 경우만 그것을 가지고 올 수 있다는 것이다. 따라서 Symbol(description)
을 이용해서 생성한 Symbol은 Symbol.for(key)
를 이용해서 가지고 올 수 없다.이런 특징을 이용해서 아래와 같이 object의 private property를 만드는 것도 가능하다.