이챙의 개발 log
[es6] Symbol 이란 ..? 자세히 알아보자
자바스크립트 es6 에서 Symbol 이라는 원시 데이터 유형을 추가하였습니다
자바스크립트에는 밑에와 같은 원시데이터를 가지고있죠
1.Boolean
2.Null
3.Undefined
4.Number
5.String
6.Symbol +new
Symbol()
Symbol([description])
Symbol은 고유한 데이터입니다.
여러개의 Symbol에 동일한 description을 넣어도 각 다른 존재로 인식됩니다.
const a = Symbol("id");
const b = Symbol("id");
console.log(a == b); // false
같은 문자열을 넣었는데 결과 값이 false 로 나오죠?
Symbol은 고유한 존재 이기 때문에 문자열이 같아도 영향을 미치지 않습니다
Object key 로 사용
객체에서 Symbol로도 객체의 property를 만들 수 있습니다
let obj = {
name: "cy"
};
let id = Symbol("id");
obj[id] = 1;
console.log( obj[id] )
Symbol을 key를 사용하여 데이터에 접근할 수 있습니다
그러면 string을 사용하면 되지 왜 굳이 Symbol을 사용할까요?
만약 obj객체에 name 속성 외에 다른 속성이 무수히 있다고 칩시다.
협업을 하다가 한 팀원이 obj객체에 name 속성이 있는지 모르고
또 name 속성을 추가해서 덮어씌어버린다면 ...?
코드가 오류가 나버리겠죠.
이 속성 값은 건들지마! 하고 싶을 경우 Symbol을 사용합니다.
같은 속성이름으로 값을 추가하더라도 Symbol은 다른 존재로 인식 하기 때문에 충돌이 없겠죠?
string 값으로 속성을 추가 하면 바로 덮어 씌어버릴테니깐요.
아것이 string 과 symbol의 차이입니다.
Object literal 안에서의 Symbol
객체 리터럴에서 Symbol을 사용하려면 [] 안에 써줘야 합니다.
그리고 상수개념으로 쓰이기 때문에 대문자를 사용합니다.
const ID = Symbol("id");
let user = {
name: "John",
[ID]: 123
};
Symbol은 열거되지 않는다 skip!
보통 객체를 loop돌고 싶을때 for in 문을 많이쓰죠 ?
하지만 Symbol은 for in 문과 Object.keys 에서 열거되지 않습니다.
const ID = Symbol("id");
let obj = {
name: "cy",
[ID]: 123
};
for(key in obj) console.log(key) // name
Object.getOwnPropertySymbols()
symbol만 열거해주는 메소드 입니다.
Object.getOwnPropertySymbols(obj).forEach(el=>console.log(el))
Symbol.for()
Symbol을 같은 description으로 어느 변수에 동일하게 할당하고 싶은경우 사용합니다.
const ID = Symbol.for("x1234");
const ID2 = Symbol.for("x1234");
console.log(ID === ID2) // true
위의 코드를 보면 변수 ID에서 Symbol.for를 호출 할 경우 안에 문자열 "x1234"를 전역에서 찾습니다.
ID 변수 시점에선 동일한 문자열이 없으니 새 Symbol을 만듭니다.
ID2변수는 해당 문자열을 ID 변수가 가지고 있으니 그대로 할당해서 반환하는거죠
Symbol.keyFor()
keyFor은 Symbol.For() 의 키값을 반환해줍니다.
그냥 Symbol은 출력이 안됩니다.
const a = Symbol.for('안녕하세요')
console.log(Symbol.keyFor(a))//'안녕하세요'
'javascript > es6' 카테고리의 다른 글
화살표 함수(arrowFunction)와 일반함수(function)의 차이점 알아보기 (0) | 2022.06.16 |
---|---|
TDZ(Temporal Dead Zone) 란..? TDZ로 인한 var,let,const 알아보기 (0) | 2020.12.11 |
[es6]Set(),WeakSet(),set 메소드,set 으로 중복없는 배열 만들기, set 배열로 만들기 (0) | 2020.08.20 |
[es6] Destructuring assignment 구조분해할당 (0) | 2020.08.12 |
[es6]특정 문자열로 시작하는지 끝나는지 알 수 있는 메서드 startsWith() , endsWith() (0) | 2020.07.31 |
이챙(leechaeng)
프론트엔드 개발도 하고 뛰기도 하고