var myPrivateMethod = Symbol(); //myPrivateMethod가 심볼값
this[myPrivateMethod] = function() {...};
Symbol.keyFor(Symbol.for("tokenString"));
/// "tokenString" 출력
익명에 이름을 부여하는 몇 가지 정적인 속성을 가지고 있음.
특정 내장 객체에 존재하는 몇개의 선택된 메서드 속성을 가리키는 심볼
Symbol.iterator, Symbol.search
심볼함수와 이 함수가 생성하는 심볼값은 프로그래머가 사용자 지정 클래스를 설계할 때 유용함.
심볼값은 사용자 지정 클래스가 전용 멤버를 만들고 바로 그 클래스와 관련된 심볼 레지스트리를 유지 관린하는 방법을 제공
사용자 지정 클래스는 심볼값을 이용하여 의도하지 않는 노출로부터 보호할 수 있는 "자신만의" 속성을 만들 수 있음.
클래스 정의 내에서 동적으로 생성된 심볼값은 그 클래스 정의 내에서만 사용할 수 있는 스코프변수에 저장됨.
토큰 문자열은 없지만, 그 스코프 변수는 토큰과 동일한 역할을 함.
Symbol("foo") !== Symbol("foo") //true
// Symbol() 익명의 고유한 값을 가짐
const foo = Symbol();
const bar = Symbol();
typeof foo === "symbol"; //true
typeof bar === "symbol"; //true
let obj = {};
obj[foo] = "foo"; //Symbol함수를 객체의 속성으로 씀
obj[bar] = "bar";
JSON.stringify(obj); //{}
Object.keys(obj); //[]
Object.getOwnPropertyNames(obj) // []
Object.getOwnPropertySymbols(obj) // [Symbol(),Symbol()]
// 심볼함수를 속성으로 썼을때는 getOwnPropertySymbols()로만 접근가능
1. L-Value와 R-Value
- 공간(장소)를 의미함
- R-Value는 읽어 들이는 것을 의미.
- L-Value의 경우 데이터가 저장된 메모리 영역을 추적할 수 있는 값을 말하며, a=123에서 a라는 변수명은 os가 메모리에 123이라는 값을 보관하기 위한 메모리 주소의 별칭이므로 a 라는 변수를 통해 123이라는 값이 저장된 메모리 주소를 추적이 가능하므로 a는 L-Value
- R-Value, 123의 경우 메모리 주소에 값을 넣기 위한 임시 데이터이므로 이는 cpu의 레지스터를 통해 메모리에 직접 기록되게 됨. 따라서 123값만으로 메모리를 주소를 추적할수 없으므로 R-Value
const foo = function() {
console.log(this.name);
}
var name ='ad';
let a ={name:'vv'}, b={name:'ff'};
a.foo = foo;
b.foo = foo;
(a.foo)(); // 'vv'
(b.foo)(); // 'ff'
(a.foo = b.foo)(); // 'ad'
//(a.foo=b.foo)는 R-Value로 취급되어 foo 함수 객체의 데이터 그 자레를 의미하게 되며 이를 즉시 실행하므로 객체추적을 하지못해 전역변수 name의 값인 'ad'를 출력
(a.foo = b.foo) = foo;
//Invalid left-hand side in assignment 라는 오류가 발생한 것을 알수 있으며 이는 L-Value 가 아니므로 대입연산이 수행되지 않아 실패된다는 의미로 해석이 가능
2. Symbol 관련해서 참고할만한 자료