심볼형
- 자바스크립트는 객체 프로퍼티 키로 오직 문자형과 심볼형만을 허용
심볼
- '심볼(symbol)'은 유일한 식별자(unique identifier)를 만들고 싶을 때 사용
Symbol()
을 사용
- 심볼은 유일성이 보장되는 자료형, 심볼에 붙이는 설명(심볼 이름)은 어떤 것에도 영향을 주지 않는 이름표 역할
let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2);
- 심볼형 값은 다른 자료형으로 암시적 형 변환(자동 형 변환)되지 않음
let id = Symbol("id");
alert(id);
alert(id.toString());
alert(id.description);
'hidden' property
- 심볼을 이용하여 ‘숨김(hidden)’ 프로퍼티 생성
- 숨김 프로퍼티는 외부 코드에서 접근이 불가능하고 값도 덮어쓸 수 없는 프로퍼티
let user = {
name: "John"
};
let id = Symbol("id");
user[id] = 1;
alert( user[id] );
let id = Symbol("id");
user[id] = "제3 스크립트 id 값";
let user = { name: "John" };
user.id = "스크립트 id 값";
user.id = "제3 스크립트 id 값"
Symbols in a literal
- 객체 리터럴
{...}
을 사용해 객체를 만드는 경우, 대괄호를 사용해 심볼형 키 생성
let id = Symbol("id");
let user = {
name: "John",
[id]: 12345
};
Symbols in for...in property
- 키가 심볼인 프로퍼티는
for..in
반복문에서 배제
let id = Symbol("id");
let user = {
name: "Chungsik",
age: 28,
[id]: 12345
};
for (let key in user) alert(key);
alert( "직접 접근한 값: " + user[id] );
- '심볼형 프로퍼티 숨기기(hiding symbolic property)': 외부 스크립트나 라이브러리는 심볼형 키를 가진 프로퍼티에 접근 불가능
Object.keys(user)
에서도 키가 심볼인 프로퍼티는 배제
Object.assign
은 키가 심볼인 프로퍼티를 배제하지 않고 객체 내 모든 프로퍼티를 복사
let id = Symbol("id");
let user = {
[id]: 12345
};
let clone = Object.assign({}, user);
alert( clone[id] );