JS 7번째 데이터 타입 symbol

심볼(symbol)은 ES6에서 새롭게 추가된 7번째 타입으로 변경 불가능한 원시 타입의 값이다. 심볼 값은 다른 값과 중복되지 않는 유일무이한 값이다. 따라서 주로 이름의 충돌 위험이 없는 유일한 프로퍼티 키를 만들기 위해 사용한다. 심볼은 중복되지 않는 상수 값을 생성하는 것은 물론 기존에 작성된 코드에 영향을 주지 않고 새로운 프로퍼티를 추가하기 위해, 즉 하위 호환성을 보장하기 위해 도입되었다.

Symbol의 생성

심볼 값은 Symbol 함수를 호출하여 생성해야 한다. 이때 생성된 심볼 값은 노출되지 않으며 다른 값과 절대 중복되지 않는다.

1
2
3
4
5
const mySymbol = Symbol();

// 심볼 값은 노출되지 않는다.
console.log(mySymbol); // Symbol()
console.log(typeof mySymbol); // symbol
  • new 연산자를 사용하지 않는다.
  • 변경 불가능한 원시 값이다.
  • 선택적으로 문자열을 인수로 전달할 수 있다.
  • 심볼 값에 대한 설명이 같더라도 생성된 심볼 값은 유일무이한 값이다.
  • 심볼 값은 암묵적으로 문자열이나 숫자 타입으로 변환되지 않는다.
  • 불리언 타입으로는 암묵적으로 타입 변환된다.

Symbol.for 메소드

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

  • 검색에 성공하면 새로운 심볼 값을 생성하지 않고 검색된 심볼 값을 반환한다.
  • 검색에 실패하면 새로운 심볼 값을 생성하여 Symbol.for 메소드의 인수로 전달된 키로 전역 Symbol 레지스트리에 저장한 후, 생성된 심볼 값을 반환한다.
1
2
3
4
const s1 = Symbol.for('mySymbol');
const s2 = Symbol.for('mySymbol');

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

Symbol과 상수

값에는 특별한 의미가 없고 상수 이름 자체에 의미가 있는 경우가 있다. 상수값이 다른 변수 값과 중복될 수 있기 때문에, 중복될 가능성이 있는 무의미한 상수 대신 중복될 가능성이 없는 유일무이한 심볼 값을 사용할 수 있다.

Symbol과 프로퍼티 키

  • 객체의 프로퍼티 키는 빈 문자열을 포함하는 모든 문자열 또는 심볼 값으로 만들 수 있다.
  • 동적으로 생성(Computed property name)할 수 있다.
  • 심볼 값으로 프로퍼티 키를 만들면 다른 프로퍼티 키와 절대 충돌하지 않는다.

Symbol과 프로퍼티 은닉

  • 심볼 값으로 동적 생성한 프로퍼티 키로 만든 프로퍼티는 for…in 문이나 Object.keys, Object.getOwnPropertyNames 메소드로 찾을 수 없다.
  • 심볼 값으로 동적 생성한 프로퍼티 키로 프로퍼티를 만들면 프로퍼티를 숨길 수 있다.
  • 단, Object.getOwnPropertySymbols 메소드를 사용하면 심볼 값으로 동적 생성한 프로퍼티 키로 만든 프로퍼티를 찾을 수 있다.
1
2
3
4
5
6
7
8
9
10
const obj = {
[Symbol('mySymbol')]: 1
};

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

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

Symbol과 표준 빌트인 객체 확장

표준 빌트인 객체에 사용자 정의 메소드를 직접 추가하여 확장하는 것은 권장하지 않는다. 개발자가 직접 추가한 메소드와 미래에 표준 사양으로 추가될 메소드가 이름이 중복 될 수 있기 때문이다. 중복될 가능성이 없는 심볼 값으로 프로퍼티 키를 생성하여 표준 빌트인 객체를 확장하면 표준 빌트인 객체의 기존 프로퍼티 키와 충돌하지 않는 것은 물론, 버전이 올라감에 따라 추가될지 모르는 어떤 프로퍼티 키와도 충돌할 위험이 없어 안전하게 표준 빌트인 객체를 확장할 수 있다.

Well known Symbol

Well known Symbol은 자바스크립트가 기본으로 제공하는 빌트인 심볼 값이다. 자바스크립트 엔진의 내부 알고리즘에 사용된다.

빌트인 이터러블
이터러블은 for…of 문으로 순회할 수 있고 스프레드 문법의 피연산자가 될 수 있는 객체를 말한다.

빌트인 이터러블 프로퍼티 키가 Symbol.iterator인 메소드
Array Array.prototype[Symbol.iterator]
String String.prototype[Symbol.iterator]
Map Map.prototype[Symbol.iterator]
Set Set.prototype[Symbol.iterator]
TypedArray TypedArray.prototype[Symbol.iterator]
arguments arguments[Symbol.iterator]
DOM 컬렉션 NodeList.prototype[Symbol.iterator], HTMLCollection.prototype[Symbol.iterator]

REFERENCE
https://poiemaweb.com

  • © 2020-2025 404 Not Found
  • Powered by Hexo Theme Ayer