JavaScript의 Symbol
JavaScript의 타입들
string,number,boolean,undefined,null,object- 그리고 ES6에서 도입된
symbol
symbol
- 변경 불가능한 원시 타입의 값
- 값의 고유함이 보장됨
- 값이 외부로 노출되지 않음
- 이름 충돌이 발생하지 않는 고유의 프로퍼티 키를 만들기 위해 사용함
- 문자열과 숫자 타입으로 암묵적 변환이 일어나지 않음
- 불리언으로는 암묵적 타입 변환 가능
symbol 의 생성
Symbol함수를 호출해 생성함Symbol은 생성자가 아님!!new연산자가 안붙는다!- 매개변수로 디버깅에 사용될 심볼을 설명하는 문자열을 제공할 수 있음
Symbol.for함수를 호출해 생성함- 심볼을 저장하기 위한 전역 심볼 레지스트리가 있음
Symbol.for함수는 매개변수로 받은 문자열을 키로 전역 심볼 레지스트리에 접근함- 전역 심볼 레지스트리에 해당 키가 존재하면 심볼을 반환
- 전역 심볼 레지스트리에 해당 키가 존재하지 않으면 심볼 생성 후 저장/반환
Symbol.for로 생성된 심볼은Symbol.keyFor을 통해 키를 얻을 수 있음
symbol 의 사용
- 고유함이 보장되기 때문에 상수로 사용되거나 프로퍼티 키로 사용됨
- 특히 프로퍼티 키로 사용 시
- 다른 프로퍼티 키와 충돌하지 않는 키를 얻을 수 있음
for ... in과Object.keys,Object.getOwnPropertyNames에서 보이지 않음
프로퍼티 은닉
- 프로퍼티 키로
symbol을 사용하면 외부에 노출되지 않는 프로퍼티 키를 만들 수 있음 - 하지만
Object.getOwnPropertySymbols메서드로 찾을 수 있다!
표준 빌트인 객체 확장
- 프로퍼티 키로
symbol을 사용해 표준 빌트인 객체를 확장할 수 있음 - 이후 표준 빌트인 객체에 메서드가 추가되더라도 커스텀한 프로퍼티 키와 충돌할 일이 절대 없다!
Array.prototype.find메서드를 ES6 이전에 추가했다면 이후 추가된 표준 함수를 덮어쓰게 된다!- 심볼을 사용한다면 이름 충돌 걱정 없이 마음껏 확장 가능하다!
Well-known symbol
- 자바스크립트 엔진의 알고리즘에서 사용되는 심볼들
Symbol함수의 프로퍼티에 할당되어 있음Symbol.iterator등