You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
`symbol.description` 프로퍼티를 이용하면 설명만 보여주는 것도 가능합니다.
74
+
73
75
```js run
74
76
let id = Symbol("id");
75
77
*!*
@@ -101,10 +103,12 @@ alert( user[id] ); // 심볼을 키로 사용해 데이터에 접근할 수 있
101
103
102
104
그런데 문자열 `"id"`를 키로 사용해도 되는데 `Symbol("id")`을 사용한 이유가 무엇일까요?
103
105
104
-
`user`는 서드파티 코드에서 가지고 온 객체이므로 함부로 새로운 프로퍼티를 추가할 수 없습니다. 그런데 심볼은 서드파티 코드에서 접근할 수 없기 때문에, 심볼을 사용하면 서드파티 코드가 모르게 `user`에 식별자를 부여할 수 있습니다.
106
+
`user` 객체는 다른 코드베이스에 속해 있으므로, 함부로 새로운 필드(프로퍼티)를 추가하는 것은 안전하지 않습니다. 해당 코드베이스에 미리 정의된 동작에 영향을 줄 수 있기 때문입니다. 하지만 심볼은 우연히 접근하는 것이 불가능합니다. 서드파티 코드는 새롭게 정의된 심볼을 알지 못하므로, `user` 객체에 심볼을 추가하는 것은 안전합니다.
105
107
106
108
상황 하나를 더 가정해보겠습니다. 제3의 스크립트(자바스크립트 라이브러리 등)에서 `user`를 식별해야 하는 상황이 벌어졌다고 해보죠. `user`의 원천인 서드파티 코드, 현재 작성 중인 스크립트, 제3의 스크립트가 각자 서로의 코드도 모른 채 `user`를 식별해야 하는 상황이 벌어졌습니다.
107
109
110
+
111
+
108
112
또한, 또 다른 스크립트가 자기만의 목적을 위해 `user` 안에 자체 식별자를 추가해야 하는 상황을 가정해 봅시다.
109
113
110
114
제3의 스크립트에선 아래와 같이 `Symbol("id")`을 이용해 전용 식별자를 만들어 사용할 수 있습니다.
@@ -280,7 +284,8 @@ alert( localSymbol.description ); // name
280
284
281
285
심볼의 주요 유스 케이스는 다음과 같습니다.
282
286
283
-
1. 객체의 '숨김' 프로퍼티 --
287
+
1. 객체의 '숨김' 프로퍼티
288
+
284
289
외부 스크립트나 라이브러리에 '속한' 객체에 새로운 프로퍼티를 추가해 주고 싶다면 심볼을 만들고, 이를 프로퍼티 키로 사용하면 됩니다. 키가 심볼인 경우엔 `for..in`의 대상이 되지 않아서 의도치 않게 프로퍼티가 수정되는 것을 예방할 수 있습니다. 외부 스크립트나 라이브러리는 심볼 정보를 갖고 있지 않아서 프로퍼티에 직접 접근하는 것도 불가능합니다. 심볼형 키를 사용하면 프로퍼티가 우연히라도 사용되거나 덮어씌워 지는 걸 예방할 수 있습니다.
285
290
286
291
이런 특징을 이용하면 원하는 것을 객체 안에 '은밀하게' 숨길 수 있습니다. 외부 스크립트에선 우리가 숨긴 것을 절대 볼 수 없습니다.
0 commit comments