심벌이란?
다른 값과 중복되지 않는 유일무이한 값이며 주로 충돌위험이 없게 유일한 프로퍼티 키를 만들기 위해 사용함
심벌 값의 생성
const mySymbol = Symbol();
console.log(mySymbol); // Symbol()
// 심벌 값은 외부로 노출되지 않아 확인할 수 없다.
언뜻 보면 생성자 함수로 심볼객체를 생성하는 것처럼 보이지만
new 연산자와 함께 호출하지 않고, 객체대신 원시값인 심볼이 생성된다.
Symbom 함수에는 문자열을 인수로 전달할 수 있으며 이 인수는 키 값/설명으로써 사용된다.
const symbol1 = Symbol("1");
const symbol2 = Symbol("2");
console.log(symbol1===symbol2); // false
심벌 값의 생성 - for 메서드
Symbol에 키 값/설명으로 사용한 인수를 이용해 Symbol을 검색할 수 도 있음.
Symbol.for 메서드는 인수로 넣은 키 값의 심볼객체가 없다면 새로운 심볼객체를 생성하고,
이미 존재한다면 해당 심볼객체를 반환함
const symbol1 = Symbol.for("test");
const symbol2 = Symbol.for("test");
console.log(symbol1 === symbol2) // true
Symbol.for 메서드 사용시 주의해야할 점은
단순 Symbol 함수를 이용해 생성한 값은 전역 심벌 레지스트리에 등록되지않아
나중에 Symbol.for메서드로 찾는다 한들 검색이 되지 않는다.
const symbol1 = Symbol("test");
const symbol2 = Symbol.for("test");
console.log(symbol1 === symbol2) // false
심벌 값의 생성 - keyFor메서드
keyFor메서드를 이용해 전역 심벌 레지스트리 심볼값의 키를 찾을 수 있음
const symbol1 = Symbol("keyFor1");
const symbol2 = Symbol.for("keyFor2");
console.log(Symbol.keyFor(symbol1)) // undefined
console.log(Symbol.keyFor(symbol2)) // keyFor2
// for 메서드를 이용해야 전역 심벌 레지스트리에서 관리해 줌
심벌과 프로퍼티 키
심벌값을 이용하여 프로퍼티 키를 고유하게 만들 수 있음
const obj = {
[Symbol.for('mySymbol')]: 1
};
console.log(obj[Symbol.for('mySymbol')]); // 1
중복방지가 됨
심벌과 프로퍼티 은닉
심벌 값을 프로퍼티 키로 사용하면 Object.key와 같은 메서드에 노출되지 않음
const symbol1 = {
name: "abc",
[Symbol.for("secret")]: "value"
}
console.log ( Object.keys(symbol1) ) // ['name']
추가로 심볼 값을 생성할 때 사용한 키 값/설명을 모른다면 심볼에 접근할 수 없음
const symbol1 = {
name: "abc",
[Symbol.for("secret")]: "value"
}
console.log(symbol1); // {name: 'abc', Symbol(symbol): 'value'} // Symbol의 키가 숨겨져 있음
symbol1[Symbol.for("secret")] = 'value2';
console.log(symbol1); // {name: 'abc', Symbol(symbol): 'value2'} // Symbol의 키를 이용해 수정완료됨
그런데 요새는 Object.getOwnPropertySymbols 메서드의 존재때문에 접근 할 수 있다 함
const symbol1 = {
name: "abc",
[Symbol.for("secret")]: "value"
}
Object.getOwnPropertySymbols(symbol1); // [Symbol(secret)];
const symbols = Object.getOwnPropertySymbols(symbol1);
symbol1[symbols[0]] = "value2";
console.log(symbol1) // {name: 'abc', Symbol(secret): 'value2'}
심벌과 표준 빌트인 객체 확장
심벌을 쓸 수 있는 아주 좋은 예시가 나옴
빌트인 객체에 이미 존재하는 메서드를 수정하면 당연히 문제가 될 수 있음
그래서 만일 필요하다면 새로 추가를 할꺼임
그런데 나중에 내가 a프로젝트에 추가했던 abc라는 전역객체, 또는 어딘가의 메소드가 후에,
빌트인객체에 추가된다면. 해당 빌트인 객체에 문제가 생기는 것
이럴 때 심벌을 이용하여 내가 원하는 전역객체, 또는 메서드를 추가한다면 위의 중복문제를 방지할 수 있음
'js > 개발' 카테고리의 다른 글
js 프로퍼티 어트리뷰트 (0) | 2022.12.03 |
---|---|
js 함수내부에서의 this 바인딩 (0) | 2022.12.03 |
js set 데이터 타입 (0) | 2022.10.17 |
js 즉시실행함수 (2) | 2022.05.31 |
js ajax로 비동기 통신하기 (0) | 2022.02.04 |
댓글