모던 자바스크립트 Deep Dive 33장-7번째 데이터 타입 Symbol

HustleKang·2022년 5월 1일

심벌이란?

숫자,문자열,불리언,객체,null,undefined 6가지 데이터 타입에 이어서
ES6에서 도입된 7번째 데이터 타입
원시 타입의 값이고 다른 값과 중복되지 않는 유일무이한 값

심벌 값의 생성

Symbol 함수

리터럴로 생성 불가, Symbol 함수를 호출해야만 생성 가능
생성되는 심벌 값은 외부로 노출되지 않아 확인이 불가능
아무튼 유일무이한 값임
객체처럼 접근시 래퍼 객체 생성됨
암묵적으로 문자열이나 숫자 타입으로 변환되지 않음, 불리언으로는 됨

const x = Symbol();
console.log(x); // Symbol() 값이 안보임

new Symbol(); // 에러

const a = Symbol('a'); // 문자열을 인수로 줘도 그냥 값에 대한 설명일뿐
const b = Symbol('b');
console.log(a===b); // false

a+' '; // Cannot convert a Symbol value to a string
+a; // Cannot convert a Symbol value to a number

if (a) console.log('불리언으로 타입변환 가능');

Symbol.for/Symbol.keyFor 메서드

Symbol.for 메서드는 전달받은 인수를 키로 사용하여 키-심벌값 쌍들이 저장되어 있는 전역 심벌 레지스트리에서 해당 키와 일치하는 심벌 값을 검색
검색에 성공하면 검색된 심벌 값을 반환
실패하면 새로운 심벌 값을 생성하여 전역 심벌 레지스트리에 등록 후 심벌 값을 반환

Symbol 함수는 호출될 때마다 심벌 값을 생성하게 되는데 이 때 전역 심벌 레지스트리에 등록되지는 않음
Symbol.for 메서드는 전역 심벌 레지스트리에 등록됨

Symbol.keyFor 메서드는 전역 심벌 레지스트리에 등록된 심벌 값의 키를 반환

const x = Symbol.for('심벌 값 x의 키');
Symbol.keyFor(x); // 심벌 값 x의 키

심벌과 상수

값에는 의미가 없고 이름에 의미가 있을 때
상수 값이 실수로 중복이 될 수도 있으니 심벌 값을 이용하면 좋음

const Direction={
	UP : 1,
    DOWN : 2,
    LEFT : 3,
    RIGHT : 4
}

const NewDirection={
	UP : Symbol('up'),
    DOWN : Symbol('down'),
    LEFT : Symbol('left'),
    RIGHT : Symbol('right')
}

심벌과 프로퍼티 키

객체의 프로퍼티 키로 심벌 값도 가능
심벌 값을 대괄호로 감싸줘야 가능함

const obj = {
	[Symbol.for('age')] : 20
}
obj[Symbol.for('age')]; // 20

심벌과 프로퍼티 은닉

객체에 프로퍼티 키로 심벌 값을 사용하면 Object.keys 메서드로 찾아도 안나옴
Object.getOwnPropertySymbols 에는 나옴

심벌과 표준 빌트인 객체 확장

표준 빌트인 객체에 사용자 정의 메서드를 추가하는 것은 Bad
미래에 추가되는 메서드명이 똑같으면 문제가 발생하기 때문
만약 굳이 표준 빌트인 객체에 메서드를 추가하고 싶다면 심벌 값으로... 유일무이한 값이니까

Array.prototype.sum = function(){
	return this.reduce((acc,cur)=>acc+cur,0);
}
[1,2,3].sum();

Array.prototype[Symbol.for('sum')] = function(){
	return this.reduce((acc,cur)=>acc+cur,0);
}
[1,2,3][Symbol.for('sum')]();

Well-known Symbol

자바스크립트가 기본 제공하는 빌트인 심벌 값을 Well-known Symbol 이라 함
자바스크립트 엔진 내부 알고리즘에 사용됨

이웅모, 『모던 자바스크립트 Deep Dive』, 위키북스(2021)

profile
grindin'

0개의 댓글