[JavaScript] Symbol 데이터 타입

bbio3o·2021년 4월 13일
0

JavaScript

목록 보기
13/13
post-thumbnail

자바스크립트 공부하면서 symbol 타입은 다룰 일이 없어서 잘 모르고 넘어갔었다.
함수형 프로그래밍을 공부하게 되면서 이터러블, 이터레이터 프로토콜을 공부해야해 Symbol을 개념을 다시 한번 정리해보려한다!


📌 Symbol 값의 생성

Symbol은 ES6에서 도입된 7번째 데이터 타입으로 변경 불가능한 원시 타입의 값이다.
심벌 값은 다른 값에 중복되지 않는 유일무이한 값이다.
따라서 주로 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용한다.

// Symbol 함수를 호출하여 유일무이한 심벌 값을 생성한다.
const mySymbol = Symbol();
console.log(typeof mySymbol); // symbol

// 심벌 값은 외부로 노출되지 않아 확인할 수 없다.
console.log(mySymbol); // Symbol()

심벌값은 Symbol 함수를 호출하여 생성한다. 다른 원시값, 즉 문자열, 숫자, 불리언, undefined, null 타입의 값은 리터럴 표기법을 통해 값을 생성할 수 있지만 심벌 값은 Symbol 함수를 호출하여 생성해야 한다.

이때 생성된 심벌 값은 노출되지 않아 확인할 수 없으며, 다른 값과 절대 중복되지 않는 유일무이한 값이다.



new Symbol(); // TypeError: Symbol is not a constructor

위의 코드는 언뜻 보면 생성자 함수로 객체를 생성하는 것처럼 보이지만 Symbol 함수는 String, Number, Boolean 생성자 함수와는 달리 new 연산자와 함께 호출되지 않는다.
new 연산자와 함께 생성자 함수 또는 클래스를 호출하면 객체(인스턴스)가 생성되지만 심벌 값은 변경 불가능한 원시 값이다.


// 심벌 값에 대한 설명이 같더라도 유일무이한 심벌 값을 생성한다.
const mySymbol1 = Symbol('mySymbol');
const mySymbol2 = Symbol('mySymbol');

console.log(mySymbol1 === mySymbol2); // false


📌 Symbol과 프로퍼티 키

const obj = {
	// 심벌 값으로 프로퍼티 키를 생성
  [Symbol.for('mySymbol')]: 1
};

obj[Symbol.for('mySymbol')]; // 1

심벌 값은 유일무이한 값이므로 심벌 값으로 프로퍼티 키를 만들면 다른 프로퍼티 키와 절대 충돌하지 않는다.
이는 기존 프로퍼티 키와 충동하지 않는 것은 물론, 미래에 추가될 어떤 프로퍼티 키와도 충돌할 위험이 없다는 것을 의미한다.



📌 Symbol과 프로퍼티 은닉

const obj = {
	// 심벌 값으로 프로퍼티 키를 생성
    [Symbol('mySymbol')]: 1
};

for (const key in obj) {
	console.log(key); // 아무것도 출력되지 않는다.
}

console.log(Object.keys(obj)); // []
console.log(Object.getOwnPropertyNames(obj)); // []

심벌 값을 프로퍼티 키로 사용하여 생성한 프로퍼티는 for...in 문이나 Object.keys, Object.getOwnPropertyNames 메서드로 찾을 수 없다.
이처럼 심벌 값을 프로퍼티 키로 사용하여 프로퍼티를 생성하면 외부로 노출할 필요가 없는 프로퍼티를 은직할 수 있다.

[출처 모던 자바스크립트 Deep Dive]

profile
그림도 그리는 개발자 🎨👩‍💻

0개의 댓글