-
[Javascript 200] SymbolTo infinity/Javascript 이론 2021. 6. 27. 14:05
symbol은 리터럴표기법으로 값을 생성할 수가 없고 symbol함수로만 값을 생성할 수 있다.
const mysymbol = symbol()
마치 생성자함수같아 보이지만 생성자함수는 new 연산자와 함께 호출해야한다.
생성자함수 또는 클래스는 값으로 객체(인스턴스)가 생성되지만 심벌 값은 원시값이다.
선택적으로 문자열을 인수로 전달할 수 있지만 설명으로 디버깅용도로만 쓰이지 심벌값 생성에 어떤 영향도 주지 않는다.
symbol은 암묵적으로 문자열이나 숫자로 변환되지 않는다.
단, 불리언타입으로는 암묵적으로 변환이 된다.
그럼 대체 symbol은 뭘 하는거지? 어떤 값이 들어가는거지?
2. 함수
symbol.for('문자열(key)')
- 인수로 전달받은 문자열을 키로 사용해서
키와 심벌 값의 쌍들이 저장되어있는 전역 심벌 레지스트리에서 해당키와 일치하는 심벌 값을 검색한다.
-> 검색에 성공하면 검색된 심벌 값을 반환한다.
-> 검색에 실패하면 새로운 심벌 값을 생성한 후 새로 생성한 심벌 값을 반환한다.
=> 아, 객체랑 비슷하게 키와 값을 매칭해놓는구나. 근데 그 매칭한 값을 우리한텐 안 보여주는거고.
const s1 = symbor('mysymbol'); //새로운 심벌값 생성
const s2 = symbor('mysymbol'); //새로운 심벌값 생성
console.log(s1 === s2); //false
//저역 심벌 레지스트리에 등록 안함, 따라서 저장된 심벌 값의 키 추출 안됨.
const s1 = symbor.for('mysymbol'); //새로운 심벌값 생성 및 반환
const s2 = symbor.for('mysymbol'); //해당 키와 일치하는 값이 있으니 기존 심벌값 반환
console.log(s1 === s2); //true
// 전역 심벌 레지스트리에 저장하여 관리, 저장된 심벌 값의 키 추출
값 말고 이름(키값)의 의미가 더 중요할 때, symbol을 사용.
중복가능성이 없는 심벌값으로 상수를 정의하면 상수값이 변경되지 않으니까 안정적임.
3. enum
- 명명된 숫자 상수의 집합으로 열거형이라고 부름
- 자바스크립트는 해당 기능을 지원하지 않으므로 동 기능을 구현하고 싶다면 객체를 동결하는 Object.freeze메서드와 심벌값을 사용하면 됨.
4. 심벌 값으로 프로퍼티 키를 생성하려면 대괄호 []를 해야한다.
-> 심벌 값은 유일무이한 값이므로 프로퍼티 키를 만들면 다른 프로퍼티 키와 절대 충돌하지 않는다.
-> 심벌 값을 프로퍼티키로 만들어 생성한 프로퍼티는 for..in문이나 Object.keys, Object.getOwnPropertyNmes메서드로 찾을 수 없다.노출할 필요가 없는 프로퍼티를 은닉할 수 있다.
-> but, ES6에 도입된 Object.getOwnPropertySymbols 메서드를 사용하면 심벌 값을 프로퍼티키로 사용하여 생성한 프로퍼티를 찾을 수 있음.
5. 표준빌트인 객체 확장
- 원래는 표준 빌트인 객체를 직접 메서드 정의를 추가해서 확장하는 것은 좋지 않지만
심벌값을 사용해서 표준 빌트인 객체를 확장하면 중복가능성이 없기 때문에 안전하게 확장할 수 있다.
6. well-known symbol
- 자바스크립트가 기본제공하는 빌트인 심벌값을 부르는 이름 in ECMAscript
'To infinity > Javascript 이론' 카테고리의 다른 글
[Javascript] 객체리터럴 vs 생성자함수, 그리고 this (0) 2021.06.27 [Javascript] this (0) 2021.06.27 [Javascript 200] 배열과 객체 (ES6기능) (0) 2021.06.26 [Javascript 200] 배열과 객체 (0) 2021.06.26 [Javascript] 제어문 (0) 2021.06.16