JavaScript

[자바스크립트] #3 공부 기록 - 심볼형

권군이 2022. 8. 16. 22:50
//자바스크립트는 객체 프로퍼티 키로 오직 문자형과 심볼형만 허용
//1. 심볼
let id = Symbol();
//Symbol()을 사용해 심볼값을 만듦.
//id는 새로운 심볼이 됨.

let id = Symbol("id");
//심볼 id에는 id라는 설명이 붙음.

//설명이 동일한 심볼을 만들어도 심볼값은 다름
let id1 = Symbol("id");
let id2 =Symbol("id");

alert(id1==id2);//false

let id = Symbol("id");
alert(id.toString());//Symbol(id)

let id=Symbol("id");
alert(id.description);//id

//2. 숨김 프로퍼티
//심볼을 이용해 '숨김(hidden)'프로퍼티를 만들수있음.
//숨김 프로퍼티: 외부 코드에서 접근이 불가능하고 값도 덮어쓸 수 없는 프로퍼티

let user = {//서드파티 코드에서 가져온 객체
    name:"John"
};
let id = Symbol("id");
user[id]=1;
alert(user[id]);//심볼을 키로 사용해 데이터에 접근
//user는 서드파팉 코드에서 가지고 온 객체이므로 함부로 새로운 프로퍼티를 추가할 수 없음
//심볼을 사용하면 서드파티가 모르게 user에 식별자를 부여할수있음

let id = Symbol("id");
//객체리터럴{}을 사용해 객체를 만들경우
//대괄호를 사용해 심볼형 키를 만듦
let user = {
    name:"John",
    [id]: 123//"id"는 안됨
}
//키가 심볼인 프로퍼티는 for in 반복문에서 배제됨.
//Object.key(user)에서도 키가 심볼인 프로퍼티는 배제
//심볼형 프로퍼티 숨기기 원칙때문에 ..

//Object.assign은 접근 가능
let id = Symbol("id");
let user = {
    [id]:123
};
let clone = Object.assign({},user);
//키가 심볼인 프로퍼티를 배제하지 않고
//객체 내 모든 프로퍼티를 복사함
alert(clone[id]);

//3. 전역 심볼

//전역 심볼 레지스트리
//이름이 같은 심볼이 같은 개체를 가리키길 원하는 경우
//전역 심볼 레지스트리 안에 심볼을 만들고 해당 심볼에 접근하면
//이름이 같은 겨우 항상 동일한 심볼 반환

//Symbol.for(key) 
//:이름이 key인 심볼 반환 없으면 심볼 생성 저장
//전역 레지스트리에서 심볼을 읽음
let id = Symbol.for("id");//심볼이 존재하지 않으면 새로운 심볼 생성
let idAgain = Symbol.for("id");
alert(id===idAgain);//true

//Symbol.keyFor
//전역 심볼 레지스트리를 뒤져 해당 심볼의 이름을 얻어냄


//이름을 이용해 심볼을 찾음
let sym = Symbol.for("name");
let sym2 = Symbol.for("id");

//심볼을 이용해 이름을 얻음
alert(Symbol.keyFor(sym));//name
alert(Symbol.keyFor(sym2));//id

//description - 전역 심볼이 아닌 모든 심볼에서 이름을 얻고 싶으면
let globalSymbol = Symbol.for("name");
let localSymbol = Symbol("name");

alert( Symbol.keyFor(globalSymbol) ); // name, 전역 심볼
alert( Symbol.keyFor(localSymbol) ); // undefined, 전역 심볼이 아님

alert( localSymbol.description ); // name

 

처음 알게된 개념!

 

참고) https://ko.javascript.info/symbol