-
[JAVASCRIPT-모던자바스크립트] 심볼형3Javascript& React study 2021. 11. 7. 05:44728x90반응형SMALL
심볼은 for...in에서 배제됩니다.
키가 심볼인 프로퍼티는 for ... in 반복문에서 배제됩니다.
let id = Symbol("id"); let user = { name : "John", age : 30, [id] : 123 }; for (let key in user) alert(key); // name과 age만 출력되고 심볼은 출력되지 않는다. // 심볼로 직접 접근하면 잘 작동합니다. alert( "직접 접근한 값:" + user[id] );
Object.keys(user)에서도 키가 심볼인 프로퍼티는 배제된다. '심볼형 프로퍼티 숨기기'라고 불리는 이런 원칙 때문에 외부 스크립트나 라이브러리에서는 심볼형 키를 가진 프로퍼티에 접근하지 못한다고 할 수 있다.
그런데 Object.assign은 키가 심볼인 프로퍼티를 배제하지 않고 객체 내 모든 프로퍼티를 복사한다.
let id = Symbol("id"); let user = { [id]: 123 }; let clone = Object.assign({}, user); alert( clone[id] ); //123
뭔가 모순이 있는것 같아 보이지만 이는 의도적으로 설계된 것이라 볼 수 있다. 객체를 복사하거나 병합할 경우 대개 id와 같은 심볼을 포함한 프로퍼티 전부를 사용하고 싶어 할 것이라는 생각에서 이렇게 설계되었다.
전역 심볼
앞서 살펴본 것처럼 심볼은 이름이 같더라도 모두 별개로 취급된다. 그런데 이름이 같은 심볼이 같은 개체를 가리키길 원하는 경우도 가끔 있다. 애플리케이션 곳곳에 심볼 "id"를 이용해 특정 프로퍼티에 접근해야 한다고 가정을 해보자
전역 심볼 레지스트리(global symbol registry)는 이런 경우를 위해 만들어졌다. 전역 심볼 레지스트리 안에 심볼을 만들고 해당 심볼에 접근하게 되면 이름이 같은 경우 항상 동일한 심볼을 반환한다.
레지스트리 안에 있는 심볼을 읽게 되거나 새로운 심볼을 생성하려고 한다면 Symbol.for(key)를 사용하면 된다.
이 메서드를 호출하게 되면 이름이 key인 심볼을 반환한다. 조건에 맞는 심볼이 레지스트리 안에 없으면 새로운 샘볼 Symbol(key)을 만들고 레지스트리 안에 저장된다.
// 전역 레지스트리에서 심볼을 읽는다. let id = Symbol.for("id"); // 심볼이 존재하지 않으면 새로운 심볼을 만든다. // 동일한 이름을 이용해 심볼을 다시 읽는다. (좀 더 멀리 떨어진 코드에서도 가능) let idAgain = Symbol.for("id"); // 두 심볼은 같습니다. alert( id === idAgain ); // true
728x90반응형LIST'Javascript& React study' 카테고리의 다른 글
[JAVASCRIPT-모던자바스크립트] 객체를 원시형으로 변환하기 (2) 2021.11.14 [JAVASCRIPT-모던자바스크립트] 심볼형5 (0) 2021.11.13 [JAVASCRIPT-모던자바스크립트] 심볼형2 (2) 2021.11.06 [JAVASCRIPT-모던자바스크립트] 옵셔널 체이닝 '?.'3 / 심볼형 (7) 2021.10.31 [JAVASCRIPT-모던자바스크립트] 옵셔널 체이닝 '?.'2 (0) 2021.10.30