여니의 프로그래밍 study/JavaScript

[Javascript] 심볼형에 대해 알아보기

여니's 2021. 3. 25. 16:44

심볼 (Symbol)

> 유일한 식별자를 만들고 싶을 때 사용한다.

즉 객체의 속성키를 Symbol 값으로 해서 

해당 속성을 고유하게 관리하고자 할 때 사용!


심볼을 이용하면

내부 이름 충돌을 걱정하지 않아도 된다.

 

Symbol()은 함수이지만, 생성자 함수는 아니다.

호출될 때 새로운 Symbol 값을 반환한다.

 

Symbol은 for..in 문과 같이,

객체의 프로퍼티를 열거하는 문법 사용시,

Symbol 속성은 열거되지 않는다.

 


* 심볼 탄생 배경 *

for in loop나 object.keys와 같은 기존 메소드를 변경하지 않은 상태에서

객체에 새로운 프로퍼티를 추가하는 작업이 필요해졌다.

 

즉, 기존 메소드 결과값에는 영향을 주지 않으면서,

기존 객체에 새로운 프로퍼티를 추가하고자 하는 것!

 

그래서 심볼을 이용하여 위 과정을 해결할 수 있게 되었다.

심볼은 아까도 언급했지만,

객체의 프로퍼티를 열거하는 문법을 사용할 때,

심볼 속성은 열거되지 않는다.

 

따라서, 결과는 같으나,

객체의 속성만 따로 추가할 수 있게 된 것이다.

 

 

참고로,

심볼은 유일성이 보장되는 자료형이기 때문에,

설명이 동일한 심볼을 만들더라도,

각각 다른 심볼값이다.

 

자바스크립트에서는,

문자형으로의 암시적 형변환이 자유롭게 일어나는 편이지만,

심볼은 예외다.

심볼은 자동형변환이 이루어지지 않는다.

(심볼 != 문자형)

 

 

 

만약 심볼을 출력해야 하는 상황이라면?

toString()메소드를 호출하면 된다.

 

let id=Symbol("id");
alert(id.toString()); // Symbol(id)가 출력된다.
alert(id.descripttion); // 설명 출력

'숨김' 프로퍼티

심볼을 이용하면 숨김 프로퍼티를 만들 수 있다.

숨김 프로퍼티는 외부 코드에서 접근 불가하고,

값도 덮어쓸 수 없는 프로퍼티(속성)이다.

 

 

심볼은 서드파티코드에서 접근할 수 없기 때문에,

심볼을 사용하게 되면 서드파티 코드가 user에 식별자를 부여한다.

let id=Symbol("id");
 
let user={ // 서드파티 코드에서 가져온 객체라 함부로 새로운 프로퍼티를 추가할 수 없다.
	name:"John"
    [id]:123
 };
 

 전역 심볼

이름이 같은 심볼이 같은 객체를 가리키길 원할 때를 위해 만들어짐

이름이 같은 경우 항상 동일한 심볼을 반환해준다.

 

전역 심볼을 찾을 땐 Symbol.for(key)를 사용한다.

let id=Symbol.for("id");
let idAgain=Symbol.for("id");
alert(id===idAgain); //True

 


Symbol.keyFor(sym)

>> 심볼을 이용해 이름을 얻는다.

>> 검색 범위가 전역 심볼 레지스트이기에 일반 심볼에는 사용 불가

(일반 심볼의 이름은 description 이용)

 


참고 출처

ko.javascript.info/object-toprimitive