Javascript와 심볼 Symbol
자바스크립트를 처음부터 다시 공부해보려고 한다.
프로그래밍 언어에서 심볼은 객체의 고유한 식별자를 의미한다. 고유한 심볼 테이블이 심볼들을 가지고 있다.
ES6 에서 Symbol 타입이 추가되었다.
자바스크립트는 아래와 같은 타입을 가질수 있다.
- Number
- String
- Object
- Undefined
- Null
- Boolean
- Symbol
심볼의 특징
심볼은 객체 속성(object property)을 만들 수 있는 원시 데이터 형식(primitive data type) 이다.
정의하면 독립적인 값이 되기때문에, 같은 string 으로 정의해도 같은 값이 아니다.
Symbol 의 valueof 는 원시형 값이 아니다. 때문에 문자형과 합칠수 없다.
‘text’ + Symbol(‘string’) // Error
심볼의 생성
심볼은 3가지 방법으로 생성할 수 있다.
- Symbol();
- Symbol.for();
- 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() 에서 사용된다.