본문 바로가기
programming language/Javascript

Symbol

by cariño 2022. 9. 1.
728x90
반응형
  • ES6에서 도입된 7번째 원시형 데이터 타입이다.
  • 심벌 값은 다른 값과 중복되지 않는 유일무이한 값이다.
  • 주로 이름의 다른 값들과 충돌을 피하고 싶을 때 유일한 프로퍼티 키를 만들기 위해서 사용한다.
const someSymbol = Symbol()
const someSymbol1 = Symbol(`some symbol`)

 

🔷 심벌 값의 생성

const mySymbol = Symbol()
console.log(typeof mySymbol);  //symbol
console.log(mySymbol) //Symbol()
new Symbol() //TypeError: Symbol is not a constructor

const mySymbo2 = Symbol('she')
const mySymbo3 = Symbol('he')
console.log(mySymbo2 === mySymbo3) //false

console.log(mySymbol + 'her') //TypeError: Cannot convert a Symbol value to a string
console.log(+mySymbol) //TypeError: Cannot convert a Symbol value to a string

console.log(!mySymbol); // false
console.log(!!mySymbol); // true
if(mySymbol) console.log('this is mySymbol')//this is mySymbol

 

[다른 원시타입과 다른점]

  • 다른 원시타입은 리터럴 표기법으로 생성할 수 있지만 심벌은 Symbol()함수를 호출하여 생성한다.
  • new 연산자와 함께 호출하지 않는다. 즉 생성자 함수로 객체를 생성하지 않는다.
  • 생성된 심벌 값은 외부로 노출이 되지 않아서 확인할 수 없다. 
  • 암묵적으로 문자열이나 숫자 타입으로 변환되지 않는다. => if문 등에서 존재 확인이 가능하다.

🔷 Symbol.for / Symbol.keyfor 메서드

[Symbol.for]

인수로 전달받은 문자열을 키로 사용하여 키와 심벌 값의 쌍들이 저장되어 있는 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색한다.

  • 검색에 성공하면 새로운 심벌 값을 생성하지 않고 검색된 심벌 값을 반환한다.
  • 검색에 실패하면 새로운 심벌값을 생성하여 Symbol.for 메서드의 인수로 전달된 키로 전역 심벌 레지스트리에 저장한 후 생성된 심벌 값을 반환한다. 
// 전역 심벌 레지스트리에 mySymbol이라는 키로 저장된 심벌 값이 없으면 새로운 심벌 값을 생성
const s1 = Symbol.for('mySymbol');
// 전역 심벌 레지스트리에 mySymbol이라는 키로 저장된 심벌 값이 있으면 해당 심벌 값을 반환
const s2 = Symbol.for('mySymbol');

console.log(s1 === s2); // true

 

심벌함수는 호출될 떄마다 유일무이한 심벌 값을 생성한다. 

이때 자바스크립트 엔진이 관리하는 심벌 값 저장소인 전역 심벌 레지스트리에서 심벌 값을 검색할 수 있는 키를 지정할 수 없으므로 전역 심벌 레지스크리에 등록되어 관리되지 않는다. 

 

하지만 Symbol.for 메서드를 사용하면 애플리케이션 전역에서 중복되지 않는 유일 무이한 상수인 심벌값을 생성하여 전역 심벌 레지스트리를 통해 공유할 수 있다. 

 

즉, Symbol 함수로 생성한 심벌 값은 전역으로 관리되지 않아 검색이 불가능하고,

Symbol.for 메서드는 전역으로 관리되기 때문에 검색과 공유가 가능하다.

[Symbol.keyFor]

전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출할 수 있다. 

 

  • 전역 심벌 레지스트리에 hehehe라는 키로 저장된 심벌 값이 없으면 새로운 심벌 값을 생성
  • Symbol.Keyfor(s3) 전역 심벌 레지스트리에 저장된 심벌 값의 키를 추출 할 수 있다. 
  • Symbol함수를 호출하여 생성한 심벌 값은 전역 심벌 레지스트리에 등록, 관리되지 않는다.
const s3= Symbol.for('mySymbol')
Symbol.keyFor(s3) //mySymbol

const s4 = Symbol('foo')
Symbol.keyFor(s4) //undefined

🔷 Symbol과 Property key

생성된 심벌 값은 외부로 노출되지 않아 확인할 수 없다.

심벌 값을 프로퍼티 키로 사용하여 생성한 객체는 for ...in 문이나 다른 각종 메서드로 찾을 수 없다.

 

이처럼 외부 노출할 필요가 없는 프로퍼티를 은닉할 수 있다.

하지만 Object.getOwnPropertySymbols 메서드로는 찾을 수 있다. 

 

심벌과 프로퍼티 은닉

- 심벌 값을 프로퍼티 키로 사용하여 프로퍼티를 생성하면 외부에 노출할 필요가 없는 프로퍼티를 은닉할 수 잇다. 

const obj = {
    [Symbol('mySymbol')]: 1
}

// for(const key in obj){
//     console.log(key)
// }

// console.log(Object.key(obj)) // 아무것도 출력되지 않음
console.log(Object.getOwnPropertySymbols(obj)) //[ Symbol(mySymbol) ]

const symboKey1 = Object.getOwnPropertySymbols(obj)[0]
console.log(obj[symboKey1]) //1
728x90

'programming language > Javascript' 카테고리의 다른 글

callback, promise, async/await  (0) 2022.11.03
변수에 대하여  (0) 2022.10.13
얕은복사 깊은복사 개념  (0) 2022.09.02
자바스크립트 DATA Types  (0) 2022.09.01
모던 자바스크립트 Deep Dive 훑기  (1) 2022.08.30

댓글