TIL_20210401

ChungsikPark·2021년 4월 1일
0

TIL

목록 보기
22/31

심볼형

  • 자바스크립트는 객체 프로퍼티 키로 오직 문자형과 심볼형만을 허용

심볼

  • '심볼(symbol)'은 유일한 식별자(unique identifier)를 만들고 싶을 때 사용
  • Symbol()을 사용
  • 심볼은 유일성이 보장되는 자료형, 심볼에 붙이는 설명(심볼 이름)은 어떤 것에도 영향을 주지 않는 이름표 역할
let id1 = Symbol("id"); // 심볼 id에 "id"라는 설명을 부여
let id2 = Symbol("id"); // 심볼 id에 "id"라는 설명을 부여

alert(id1 == id2); // false, 설명이 동일한 심볼을 여러 개 만들어도 각 심볼값은 다름
  • 심볼형 값은 다른 자료형으로 암시적 형 변환(자동 형 변환)되지 않음
let id = Symbol("id");

alert(id); // TypeError: Cannot convert a Symbol value to a string
alert(id.toString()); // Symbol(id), .toString() 메서드를 이용하여 호출
alert(id.description); // id, symbol.description 프로퍼티를 이용하면 설명만 보여주는 것도 가능

'hidden' property

  • 심볼을 이용하여 ‘숨김(hidden)’ 프로퍼티 생성
  • 숨김 프로퍼티는 외부 코드에서 접근이 불가능하고 값도 덮어쓸 수 없는 프로퍼티
// Example 1) 심볼을 사용하여 서드파티 코드가 모르게 user에 식별자를 부여

let user = {
  name: "John"
}; // 서드파티 코드에서 가져온 객체, 함부로 새로운 프로퍼티를 추가 불가능

let id = Symbol("id");

user[id] = 1;

alert( user[id] ); // 심볼을 키로 사용해 데이터에 접근 가능

/* Example 2-1) user의 원천인 서드파티 코드, 현재 작성 중인 스크립트, 제3의 스크립트가
각자 서로의 코드도 모른 채 user를 식별해야 하는 상황 */

let id = Symbol("id");

user[id] = "제3 스크립트 id 값";
// 제3의 스크립트에서 Symbol("id")을 이용해 전용 식별자를 만들어 사용
// 심볼은 유일성이 보장 특성을 이용하여 사용

// Example 2-2) 문자열을 사용했을 때 충돌 발생 가능성
let user = { name: "John" };

user.id = "스크립트 id 값"; // 문자열 "id"를 사용해 식별자 생성

// 만약 제3의 스크립트가 우리 스크립트와 동일하게 문자열 "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); // name과 age만 출력

alert( "직접 접근한 값: " + user[id] ); // 직접 접근한 값: 12345
  • '심볼형 프로퍼티 숨기기(hiding symbolic property)': 외부 스크립트나 라이브러리는 심볼형 키를 가진 프로퍼티에 접근 불가능
  • Object.keys(user)에서도 키가 심볼인 프로퍼티는 배제
  • Object.assign은 키가 심볼인 프로퍼티를 배제하지 않고 객체 내 모든 프로퍼티를 복사
let id = Symbol("id");
let user = {
  [id]: 12345
};

let clone = Object.assign({}, user);

alert( clone[id] ); // 12345
profile
Blog by Chungsik Park

0개의 댓글