What is Symbol?
자바스크립트엔 총 7 가지 원시 타입이 존재합니다. (string, number ,boolean , null, undefined, bigint , symbol)
얼마없는 타입의 하나의 좌를 차지하는 주제에 좀처럼 안보이는 녀석이기도 합니다. (제 생각이지만) 실제로 토이 프로젝트 레벨 정도의 프로젝트면 크게 효용을 못느낄것 같습니다.
Symbol is a built-in object whose constructor returns a symbol primitive — also called a Symbol value or just a Symbol — that's guaranteed to be unique.-MDN
쉽게 말해서, 유니크한 값을 보장합니다. Symbol을 선언하는 순간 자바스크립트 엔진에 따라 다르지만, 유니크한 값을 제공 받습니다.
찾아보니 어떤 엔진은, Symbol의 메모리 주소값 자체를 반환한다 하더군요.
애당초 Symbol의 디자인 이유가 객체 상속 혹은 수정에 따른 프로퍼티 충돌 현상, 즉 객체의 고유 식별자의 역할을 하기 위해 디자인 되었습니다.
class Human{
name = 'default name'
}
class Male extends Human{
name = 'man with name' //shitt....
}
Features
1. description 과 Symbol value로 구성
const mySymbol = Symbol('descript')
// SymbolValue description
2. 모든 Symbol은 Unique
const a = Symbol('mySymbol');
const b = Symbol('mySymbol');
console.log(a === b) // false
처음 Symbol을 접할 때, description을 key로 갖는 해시 함수를 생각하는데, 완전히 다릅니다! (밑에서 설명)
3. for 메서드를 통한 globalSymbolRegistry에 등록가능
const a = Symbol.for('a');
const b = Symbol.for('b');
const c = Symbol.for('a')
console.log(a === c) //true
const symbolicKey = Symbol.for('secret')
const myObj = {
[symbolicKey] : () => {
console.log(`youve accessed with secret Key!!`)
}
}
myObj[symbolicKey](); //`you've accessed with secret Key!!`
myObj[Symbol.for('secret')](); //`you've accessed with secret Key!!`
myObj[Symbol(Symbol.keyFor(symbolicKey))](); // Error
for 메서드를 통해, globalSymbolRegistry에 등록 가능합니다.
만약, 인자로 제공된 description이 이미 레지스트리에 등록 되어있다면, 기존 저장값을 반환합니다
반대까지는 아니지만, keyFor 메서드를 통해, description을 반환 받을 수 있습니다.
4. well-known Symbol은 @@로 표현
실제 사용하는 syntax는 아니지만, symbol을 표현할 때, 예약된 심볼들은 @@(at at)를 붙여 표현합니다
How does it works? (For :: Spider Monkey Engine)
1. 먼저 Javascript 레벨에서, Symbol의 선언이 일어납니다.
2. 커스텀 심볼을 선언하였기에, uniqueSymbol 값으로 0xffffffff를 할당 받습니다. (고정값)
3. 현재 시행중인 execution context의 메모리 주소와 symbol선언 시, 넣은 description을 symbol 생성 함수에 넣습니다.
4. 그렇게 여러 validation들을 거쳐서, AllocateNonObject에 의해 반환받은 메모리 주소를 할당해주네요!
T *t = static_cast<T *>(cx->allocator()->arenas.allocateFromFreeList(kind, thingSize));
//AllocateNonObject 내부 메모리 할당 부
'Javascript' 카테고리의 다른 글
[Javascript + Web] Event loop & Async (이벤트 루프 & 비동기) (0) | 2023.03.29 |
---|---|
[Javascript] Generator (제너레이터) (0) | 2023.03.12 |
[Javascript] Prototype (프로토타입) (0) | 2023.03.08 |
[Javascript] Closure (클로져) (0) | 2023.03.08 |
[Javascript] Factory function (팩토리 함수) (0) | 2023.03.02 |