ES6에서 새롭게 도입된 원시형 타입.
객체의 속성으로 사용한다.
let arr =[1,2,3,4,5];
alert(arr.length) // 5
arr.length = 50; // arr배열에 length 속성을 정의하고 50을 할당
alert(arr.length) // 50 —> 덮어씌워짐
let test = [1, 2, 3, 4, 5];
const a = Symbol("length");
test[a] = 50;
console.log(test.length); // 5
console.log(test[a]); // 50
객체에 속성을 추가하거나 덮어써질 우려가 있다면?
충돌을 피하기 위한 수단으로 심볼(Symbol)을 사용할 수 있다.
심볼은 new 연산자를 사용하지 않는다.
let symbol = Symbol();
괄호 안은 비워두거나 문자열을 넣어서 생성해도 된다.
이때의 문자열은 단순 디버깅 용도이거나 단순 설명일 뿐, 고유한 값을 가지는데 있어서 어떤 영향을 끼치거나 하지는 않는다.
description 인자는 심볼의 고유값을 구분하지 못한다. —> 심볼함수 호출시 매번 새로운 심볼 값을 생성해내기 때문
let symbol2 = Symbol('person');
let symbol3 = Symbol('person');
alert(symbol2 === symbol3); // false
심볼 값은 문자열 형태로 변환할 수 없다.
let symbol = Symbol('age');
console.log(symbol); // Symbol(age)
for ..in 구문으로 반복시 출력되지 않는다. (은닉성을 갖고 있다)
let arr= [1,2,3,4,50];
arr.somProperty = 10;
for(let i in arr){
console.log(i); // 0,1,2,3,4,someProperty
}
//---------------------------
let arrSymbol = [1,2,3,4,5];
let someProperty = Symbol('someProperty');
arrSymbol[someProperty] = 10;
for(let i in arrSymbol){
console.log(i); // 0,1,2,3,4
}
배열 객체에 어떤 속성을 넣고자 한다면, 동시에 반복문에서 속성이 나타나지 않게 하고자 한다면 (=== 속성을 은닉화 하고자 할 때)