JS/Javascript

[JS] 자바스크립트 Symbol ? : 새로운 원시 데이터형, 심볼 (ES6)

emayom 2022. 3. 6. 14:51

ES6에서 새롭게 추가된 자바스크립트의 7번째 자료형!

Symbol type에 대해서 알아보자앙

🤨


 

Symbol  ?

Symbol은 자바스크립트의 Primitive data type으로

ES6에서 새롭게 추가된 자료형이다.

 

 

Symbol 생성

 

심볼 또한 다른 내장 객체처럼 new Symbol()과 같이 new 생성자를 사용할 것 같지만,

Symbol() 함수로 생성하게 된다.

 

const lets = Symbol();
const make = Symbol.for('target');
const symbol = Symbol.iterator();

//1. Symbol() 
//심볼은 String type의 ** optional ** parameter를 받는데,
//해당 심볼 자체에 접근하거나, 자체의 고유한 값에 영향을 미치지않는다! 디버깅용!

const recipe = Symbol('howToMake');
const manual = Symbol('howToMake');
console.log(recipe === manual);		//false

//+) 만약 해당 심볼의 description을 확인하고싶다?!!!
recipe.description;			//'howToMake'

 

그렇다면 왜,

그리고 어떤 때에 Symbol 타입을 사용하게 될깡?

 

//공부하며 강의에서 들었던 예시를 보면,,,
//배열은 length라는 속성을 이미 가지고 있다!
const sample = [1, 2, 3, 4, 5];
console.log(sample.length);	//5

//여기서 length 속성은 mutable하다!
//고로 해당 속성값은 누구나 직접 접근할 수 있고, 값을 수정할 수 있다!
sample.length = 10;
console.log(sample.length);	//10 
console.log(sample);		//[1, 2, 3, 4, 5, empty × 5]


//해당 배열에 일반적인 방식으로다른 속성을 추가해보자 (물론 접근 가능하고, 수정 가능하당)
sample.since = '2022';
console.log(sample.since);	//2022

sample.since = '1999';
console.log(sample.since);	//1999

//for in으로 반복문을 돌려보면, 해당 속성까지 콘솔창에 출력되는 결과를 확인할 수 있다.
for(const i in sample){
    console.log(`${i} : ${sample[i]}`);
}

 

만약 프라이빗한? 숨겨진? 속성으로 만들어

다른 누군가가 쉽게 접근을 하거나 바꾸는 것을 어렵도록 하려면,,,

자바처럼 private로 선언할 수 없는 자바스크립트에서는 심볼을 사용하면 유사하게 사용할 수 있다!

 

다른 어떠한 프로퍼티와 충돌하지 않으며, 은닉성을 가진! 유일한 식별자가 되어지게된다.

외부 코드에서 접근이 불가능하며, 값을 덮어쓸 수도 없다!

 

//하지만, Symbol type으로 속성을 추가하게 되면,
const type = Symbol();
sample[type] = type;
sample[type] = 'my private props';

//for in을 돌려보면 심볼로 추가된 속성을 출력되지않는 것을 확인할 수 있다앙~
for(const i in sample){
    console.log(`${i} : ${sample[i]}`);
}

//만약, 같은 이름의 속성을 심볼이 아닌 방식으로 추가하면 어떻게 될까?
sample.type = 'im public props';

console.log(sample.type);	//'im public props'
console.log(sample[type]);	//'my private props'

 

 

//예를 들어,
//yuri라는 객체는 name, email, id, pw 속성을 가진다.
let yuri = {
    name : 'yuri Choi',
    email : 'private@MyMail.com'
    id : 'sampleid01',
    password : 'password',
}

console.log(yuri);

//여기서 password 속성을 외부에서 접근하거나 수정을 막고싶다면?

 

//배열은 length라는 속성을 이미 가지고 있다!
const sample = [1, 2, 3, 4, 5];
console.log(sample.length);	//5

//만약 여기서 length라는 속성을 immutable한 고유의 값으로 고정하고싶다고 가정했을 때
//해당 속성값은 누구나 직접 접근해 값을 수정할 수 있다!
sample.length = 10;
console.log(sample.length);	//10 
console.log(sample);		//[1, 2, 3, 4, 5, empty × 5]

 

 

 

Object.keys(), for .. in 과 같은 

결과에서 배제된다!

const symbol1 = Symbol('');

⚠️ 아래 내용은 모두 개인적인 참고 / 기록을 위한 용도입니다. 참고해주시고 편안하게 봐주세요 :)  ⚠️
***    혹시라도 잘못된 정보가 있다면  언제든지 알려주시면 감사하겠습니다  !    ***