Symbol
ES6이전에는 6개의 원시타입이 존재했다. 심볼은 ES6에서 도입된 7번째 데이터 타입이다.
심볼은 다른 값과 절대 중복되지 않는 유일무이한 값을 말한다.
생성
심볼은 심볼 함수를 호출하여 생성할 수 있다. 다른 원시 타입들은 리터럴 방식으로 생성할 수 있지만 ( ex : const arr = [] ) , 심볼은 리터럴 생성 방식이 없다.
const mySymbol = Symbol();
console.log(mySymbol); //Symbol()
Symbol은 유일무이한 값을 생성하지만, 그 값은 외부로 노출되지 않는다. console.log로 찍어보아도 Symbol()이 보이는 것을 볼 수 있다.
파라미터
심볼은 파라미터를 받는데, 이는 디버깅 용도로만 사용되며, symbol의 유일무이한 값에 영향을 주지 않는다. 즉, 디버깅 이외의 의미는 없다.
const mySymbol = Symbol("mySymbol");
console.log(mySymbol); // Symbol(mySymbol)
const s1 = Symbol("mySymbol");
const s2 = Symbol("mySymbol");
console.log(s1 === s2); // false
래퍼객체
심벌을 객체처럼 접근하면, 다른 타입들과 마찬가지로 래퍼객체를 자동으로 생성하여, 객체처럼 사용할 수 있다.
const s1 = Symbol("mySymbol");
console.log(s1.description); //mySymbol
console.log(s1.toString()); //Symbol(mySymbol)
타입변환
symbol은 자동으로 string이나 number타입으로 변환되지 않지만, boolean타입으로는 변환이 가능하다.
const s1 = Symbol("mySymbol");
console.log("hello" + s1) // Uncaught TypeError: Cannot convert a Symbol value to a string
console.log(1 + s1) // Uncaught TypeError: Cannot convert a Symbol value to a number
console.log(!!s1); // true
메서드
symbol의 메서드중 Symbol.for과 Symbol.keyFor에 대해서 알아보겠다.
Symbol.for
심벌값은 자바스크립트 엔진이 관리하는 전역 심벌 레지시트리에 키: 심벌 의 형식으로 저장된다.
Symbol.for은 전역 인수로 받은 문자열을 키로 하여 해당 키와 일치하는 심벌 값을 검색하여 반환한다. 존재하지 않으면, 생성하여 반환한다.
const s1 = Symbol.for('mySymbol');
const s2 = Symbol.for('mySymbol');
console.log(s1 === s2) // true
Symbol.for을 이용하여 중복되지 않는 상수를 단 하나만 생성하여 전역 심벌 레지스트리를 통해 공유할 수 있다.
Symbol.keyFor
전역 심벌 레지스트리에 존재하는 심벌을 키값으로 추출 할 수 있다.
const s1 = Symbol.for('mySymbol');
Symbol.keyFor(s1);
프로퍼티
Symbol은 속성 키값이 될 수 있다.
const obj = {
[Symbol.for("mySymbol")] : 1
};
obj[Symbol.for("mySymbol")]; // 1
심볼이 키값인 속성은 for … in 이나 Object.getOwnPropertyNames로 찾을 수 없다. 이렇게 심볼을 프로퍼티 키로 사용해서 프로퍼티를 은닉할 수 있다.
하지만, Object.getOwnPropertySymbols를 이용하면 심벌값을 찾을 수 있다.
심벌의 활용
표준 빌트인 객체 확장
일반적으로 표준 빌트인 객체를 확장하는 것은 권장하지 않는다. ECMA가 업데이트되면서, 이름이 겹칠 수 있기 때문이다.
하지만 중복될 가능성이 없는 심볼값을 키값으로 하여 표준 빌트인 객체를 확장하면 충돌하지 않고 안전하게 확장할 수 있다.
이처럼 심벌은 기존에 작성된 코드에 영향을 주지 않고 새로운 프로퍼티를 추가하기 위해, 즉 하위 호환성을 보장하기 위해 도입되었다.
enum
상수를 정의할 때 변경과 중복을 피하기 위해서 심벌 값을 이용할 수 있다. 대표적인 예가 javascript에서 enum을 구현하는 것이다.
const Direction = Object.freeze({ // Object.freeze를 사용하면 속성의 값을 변경할 수 없다.
UP: Symbol('up'),
DOWN: Symbol('down'),
});
const myDir = Direction.UP;
if(myDir == Direction.UP){
console.log("up..");
}
Well-Known Symbol
자바스크립트에서 제공하는 빌트인 symbol을 Well-Known Symbol이라고 부른다. Symbol함수를 참조하여 볼 수 있다.
console.dir(Symbol)
Well-Known Symbol은 javascript엔진 내부 알고리즘에 사용된다. 예를 들어 for … of 문으로 순회가능한 이터러블은 Symbol.iterator을 키로 갖는 메서드를 가지며, Symbol.iterator메소드를 호출하면 이터레이터를 반환하도록 ECMAScript에 규정되어있다.
'javascript' 카테고리의 다른 글
[javascript] var의 문제점, let, const와의 차이 (0) | 2023.01.05 |
---|---|
[javascript] 변경 감지 이벤트 onchange, oninput 차이 (0) | 2022.10.12 |
[vue] provide와 inject 알아보기 (0) | 2022.07.12 |
[javascript] Promise, Async, Await, fetch, axios (0) | 2022.07.06 |
[JavaScript]ES6, Arrow Function, ES6 Method, Method (0) | 2022.06.20 |