모던 JavaScript 튜토리얼 내용 일부를 정리 요약한 내용입니다. 더 자세한 설명은 원문 링크를 참고하세요.
객체 프로퍼티의 키로는 문자형과 심볼형만 가능합니다. 심볼은 유일한 식별자를 만들고 싶을 때 사용합니다. Symbol() 을 사용해 심볼값을 만들 수 있습니다.
let id = Symbol()
// 심볼 id 에 id 라는 설명을 붙인다면
// 이렇게 이름을 붙이면 디버깅에 유리
let id = Symbol(id)
심볼은 유일성을 보장하므로 설명이 동일한 심볼을 만들어서 서로 다른 값입니다. 심볼에 붙이는 설명은 이름표 역할만 합니다.
let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false
심볼은 문자형으로 자동 형변환이 되지 않아서 아래처럼 toString() 을 사용해야 합니다. 설명을 출력하고 싶다면 description 을 사용합니다.
let id = Symbol("id");
alert(id); // TypeError
alert(id.toString()); // Symbol(id) 출력
alert(id.description): // id 출력
심볼을 이용하면 숨김 프로퍼티를 만들 수 있습니다. 외부 코드에서 접근이 불가능하고 값도 덮어쓸 수 없습니다. 서드파티(외부 플러그인이나 라이브러리)코드에서 가져온 객체는 함수로 새로운 프로퍼티를 추가할 수 없습니다. 심볼은 서드파티 코드에 접근할 수 없기 때문에 서드파티 코드 모르게 객체에 식별자를 부여할 수 있습니다.
let user = { // 서드파티 코드의 객체
name: 'mike';
}
let id = Symbol("id");
user[id] = 1;
alert(user[id]) // 심볼을 키로 사용해 데이터 접근 불가
객체 리터럴을 사용해 객체를 만든다면 대괄호를 사용해 심볼형 키를 만들어야 합니다.
let id = Symbol("id");
let user = {
name: "mike",
[id]: 123
}
키가 심볼인 프로퍼티는 for.. in 반복문이나 Object.keys() 에서 배제되지만 Object.assign은 키가 심볼인 프로퍼티도 복사합니다.
let id = Symbol("id");
let user = {
name: "mike",
age: 30,
[id]: 123
}
for (let key in user) alert(key); // name, age 만 출력
Object.keys(user) // 심볼 배제
let clone = Object.assign({}, user);
alert(clone[id]) // 123 - 복사한 clone 으로 심볼 값 접근
심볼은 이름이 같더라도 별개로 취급되지만 이름이 같은 심볼로 같은 개체에 접근할수도 있습니다. 이를 전역 심볼 레지스트리라고 합니다. 레지스트리 안에 있는 심볼을 읽거나 새로운 심볼을 생성하려면 Symbol.for(key)를 사용하면 됩니다. 애플리케이션에서 광범위하게 사용해야 하는 심볼이라면 전역 심볼을 활용합니다.
let id = Symbol.for("id");
let idAgain = Symbol.for("id");
alert(id == idAgain); // true
Symbol.keyFor(sym) 을 사용하면 심볼을 이름을 찾을 수 있습니다. 전역 심볼 레지스트리에서만 값을 찾기 때문에 전역 심볼이 아닌 인자가 오면 undefined 를 반환합니다. 일반 심볼의 이름을 얻고 싶다면 description 을 사용합니다.
let sym = Symbol.for("name");
let sym2 = Symbol.for("id");
alert(Symbol.keyFor(sym)); // name
alert(Symbol.keyFor(sym2)); // id