https://ko.javascript.info/symbol
정리
자바스크립트의 객체{}는
프로퍼티 키로
문자형과 심볼형만 허용한다.
(숫자, 불린 모두 불가)
심볼은 유일한 식별자이다(symbol 상징이라는 뜻이기 때문인 듯하다.)
// id는 심볼이 된다.
let id = Symbol();
// 심볼 id에 "id"라는 설명 붙일 수 있다.
let id = Symbol("id");
심볼은 유일성이 보장된다.
따라서 다음과 같은 결과 나온다.
let id1 = Symbol("id");
let id2 = Symbol("id");
console.log(id1 == id2); // false
*심볼은 문자형으로 자동 형 변환 되지 않는다.
let id = Symbol("id");
console.log(id) // TypeError
그러나
.toString() 메서드를 호출해주면 출력 가능
console.log(id.toString()); // symbol(id)가 출력
symbol.description 프로퍼티를 이용하면 설명 값만 보여준다.
console.log(id.description); // id
심볼 사용하는 이유는
서드파티 코드에서 숨김 프로퍼티를 만들 수 있기 때문이다.
let user = { //서드파티 코드에서 가져온 객체
name: "John"
}
let id = Symbol("id");
user[id] = 1;
console.log(user[id]); // 실볼을 키로 사용해 데이터 접근 할 수 있다.
이는 다른 사람이 짠 코드 혹은 라이브러리에서 프로퍼티가 겹치더라도
심볼형으로 만든 프로퍼티는 심볼 키로만 접근이 가능하기 때문에
식별자가 같더라도 다른 프로퍼티임을 알 수 있다.
유일성을 보장한다.
for in에서 배제가 된다.
Object.keys(user)에서도 키가 심볼인 프로퍼티는 배제된다.
그러나 같은 이름이 같은 심볼이 같은 개체를 가리키길 원하는 경우가 있따.
이 떄 전역심볼을 쓰면된다.
// 전역 레지스트리에서 심볼을 읽는다. 없으면 새로운 심볼을 만든다.
let id = Symbol.for("id");
// 돌일한 이름을 이용해 심볼을 다시 읽는다.
let idAgain = Symbol.for("id");
// 두 심볼은 같다.
console.log( id === idAgain); // true
Symbol.keyFor(key)를 사용하면 전역심볼의 이름을 얻을 수 있다.
일반 심볼의 이름을 얻고 싶으면 description을 사용하면된다.
let localSymbol = Symbol("name");
console.log(localSymbol.description); // name
Symbol은 원시형 데이터로 유일무이한 식별자를 만드는 데 사용된다.
Symbol()을 호출하면 심볼을 만들 수 있다. 설명은 선택적으로 추가할 수 있다.
심볼은 이름이 같더라도 값이 항상 다르다. 이름이 같은 때 값도 같길 원한다면 전역 레지스트리를 사용한다.
Symbol.for(key)는 key라는 이름을 가진 전역 심볼을 반환한다.
key라는 이름을 가진 전역 심볼이 없으면 새로운 전역 심볼을 만들어준다.
key가 같다면 Symbol.for는 어디서 호출하든 상관없이 항상 같은 심볼을 반환한다.
심볼 사용처
1. 개체의 숨김 프로퍼티 - 외부 스크립트나 라이브러리에 속한 객체에 새로운 프로퍼티를 추가해 주고 싶다면
심볼을 만들고 이를 프로퍼티 키로 사용한다.
키가 심볼인 경우에 for..in의 대상이 되지않아 의도치않게 프로퍼티가 수정되는 것을 예빵할 수 있다.
외부 스크립트나 라이브러리는 심볼 정보를 갖고 있지 않아서 프로퍼티에 수저오디는 것을 예방할 수 있다.
심볼 키를 사용하면 프로퍼티가 우연히라도 사용되거나 덮어씌워 지는 걸 예방할 수 있다.
자바스크립트 내부에서 사용되는 시스템 심볼은 Symbol.*로 접근할 수 이싿.
시스템 심볼을 이용하면 내장 메서드 등의 기본 동작을 입맛대로 변경할 수 있다.
Symbol.itereator
Symbol.toPrimitive
'IT > Javascript' 카테고리의 다른 글
은닉화, 자동화, 객체화, 중복 최소화, 결합도 낮춤, 샤이 코드 ... 같은 맥락? (0) | 2021.01.18 |
---|---|
location.href - 페이지 이동 (0) | 2021.01.10 |
(5-1) 원시값의 메서드 (0) | 2020.07.17 |
리터럴 표기법, 리터럴 방식 (0) | 2020.07.13 |
자바스크립트 및 제이쿼리 정리 (0) | 2019.07.10 |