심볼형
- 자바스크립트는 객체 프로퍼티 키로 오직 문자형과 심볼형만을 허용
 
심볼
- '심볼(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] );