Symbol : 유일성 보장
const a = Symbol(); // new를 붙이지 않음!
const b = Symbol();
console.log(a) -> Symbol()
console.log(b) -> Symbol() a와 b가 같아보여도 같지않음.
a === b; false
a == b; false
property Key : 심볼형
const id = Symbol("id");
const user = {
name : "Mike",
age : 30,
[id] : "myid"
}
user -> {name: "Mike", age: 30, Symbol(id): "myid"}
user[id] -> "myid"
object.keys(user); -> ["name","age"]
object.values(user); -> ["Mike",30]
object.entries(user); -> [Array(2), Array(2)]
for(let a in user){}
얘네들은 심볼은 건너뜀
const user = {
name : "Mike",
age : 30
}
const id = Symbol("id");
user[id] "myid"; 특정개체에 원본데이터는 건들이지 않고 속성을 추가할수 있음
user.name = "myname";
Symbol.for() : 전역 심볼 코드 어디에서든 사용할수 있음
하나의 심볼만 보장받을 수 있음
없으면 만들고, 있으면 가져오기 때문
Symbol 함수는 매번 다른 Symbol 값을 생성하지만,
Symbol.for 메소드는 하나를 생성한 뒤 키를 통해 같은 Symbol을 공유
const id1 = Symbol.for("id");
const id2 = Symbol.for("id");
id1 === id2; -> true // 그냥 Symbol과 큰 차이점.
**Symbol.keyfor(id1)** // "id" 이름을 얻고 싶을땐 .keyfor() 사용
description 전역심볼이 아닌 코드는 keyfor대신 .description 사용
const id = Symbol("id 입니다.");
**id.description;** >. "id 입니다."
숨겨진 Symbol key 보는법
const id = Symbol("id");
const user = {
name : "Mike",
age : 30,
[id] : "myid"
}
**object.getOwnPropertySymbols(user)**; -> [Symbol(id)] 숨겨진 Symbol key를 볼때
**Reflect.ownKeys(user);** -> ["name", "age", Symbol(id) ] Symbol key값을 포함한
모든 key값을 보여줌
// 다른 개발자가 만들어 놓은 객체
const user = {
name : "Mike",
age : 30,
};
// 내가 작업
// user.showName = function () {}; -> His ShowName is function () {}.
const showName = Symbol("show name");
user[showName] = function () {
console.log(this.name);
}
user[showName](); -> Mike 이런식으로 작업해야지 다른 개발자가 작성한 내용에 영향을 끼치지않음
// 사용자가 접속하면 보는 메세지
for (let key in user) {
console.log("His ${key} id $(user[key])."); -> His name is Mike.
His age is 30.
}