Symbol()
을 사용하면 심볼값을 만들 수 있다.
Symbol()
은 함수이지만, 생성자 함수는 아니다. 호출될 때 새로운 Symbol 값을 반환한다.
심볼을 만들 때 심볼 이름이라 불리는 설명을 붙일 수도 있다.
// 심볼 id에는 "id"라는 설명이 붙습니다.
let id = Symbol("id");
심볼은 유일성이 보장되는 자료형이기 때문에 설명이 동일한 심볼을 만들더라도 각각 다른 심볼값이다.
설명이 같은 심볼 두 개를 만들고 비교했을 때, false
가 반환된다.
let id1 = Symbol("id");
let id2 = Symbol("id");
alert(id1 == id2); // false
또한, 자바스크립트에서는 문자형으로의 암시적 형변환이 자유롭게 일어나지만, 심볼은 예외다.
심볼형 값은 다른 자료형으로 암시적 형 변환(자동 형 변환)되지 않는다.
심볼을 반드시 출력해줘야 하는 상황이라면 아래와 같이 .toString()
메서드를 호출해주면 된다.
let id = Symbol("id");
alert(id.toString()); // Symbol(id)가 얼럿 창에 출력됨
심볼을 이용하면 ‘숨김(hidden)’ 프로퍼티를 만들 수 있다.
숨김 프로퍼티는 외부 코드에서 접근이 불가능하고 값도 덮어쓸 수 없는 프로퍼티이다.
심볼은 서드파티코드에서 접근할 수 없기 때문에 심볼을 사용하게 되면 서드파티 코드가 user에 식별자를 부여한다.
let user = { // 서드파티 코드에서 가져온 객체
name: "John"
};
let id = Symbol("id");
user[id] = 1;
alert( user[id] ); // 심볼을 키로 사용해 데이터에 접근할 수 있습니다.
let id = Symbol("id");
let user = {
name: "John",
age: 30,
[id]: 123
};
for (let key in user) alert(key); // name과 age만 출력되고, 심볼은 출력되지 않습니다.
이름이 같은 심볼이 같은 객체를 가리키길 원할 때를 위해 만들어졌다.
이름이 같은 경우 항상 동일한 심볼을 반환해준다.
전역 심볼을 찾을 땐 Symbol.for(key)
를 사용하면 된다.
이 메소드를 호출하면 이름이 key
인 심볼을 반환해준다.
// 전역 레지스트리에서 심볼을 읽습니다.
let id = Symbol.for("id"); // 심볼이 존재하지 않으면 새로운 심볼을 만듭니다.
// 동일한 이름을 이용해 심볼을 다시 읽습니다(좀 더 멀리 떨어진 코드에서도 가능합니다).
let idAgain = Symbol.for("id");
// 두 심볼은 같습니다.
alert( id === idAgain ); // true
전역 심볼을 찾을 때 사용되는 Symbol.for(key)에 반대되는 메서드도 있다. Symbol.keyFor(sym)를 사용하면 이름을 얻을 수 있다.
// 이름을 이용해 심볼을 찾음
let sym = Symbol.for("name");
let sym2 = Symbol.for("id");
// 심볼을 이용해 이름을 얻음
alert( Symbol.keyFor(sym) ); // name
alert( Symbol.keyFor(sym2) ); // id
'시스템 심볼(system symbol)'은 자바스크립트 내부에서 사용되는 심볼이다.
Symbol
은 원시형 데이터로, 유일무이한 식별자를 만드는 데 사용된다.
Symbol()
을 호출하면 심볼을 만들 수 있다. 설명(이름)은 선택적으로 추가할 수 있다.
심볼은 이름이 같더라도 값이 항상 다르다.이름이 같을 때 값도 같길 원한다면 전역 레지스트리를 사용해야 한다.
Symbol.for(key)는 key라는 이름을 가진 전역 심볼을 반환한다.