const symbol = Symbol();
console.log(sym) // Symbol();
console.log(typeof sym) // symbol
const one = Symbol();
const two = Symbol();
console.log(one === two) // false
let sym = Symbol();
try {
const add = sym + 5;
} catch {
console.log("연산 불가);
}
// 위 경우는 연산 불가 메세지가 노출되는데, 이유는 sym값이 노출될수 있어서 symbol이 sym의 값을 주지 않아 연산이 되지 않기 떄문이다.
const sym = Symbol("설명");
const obj = {[sym]: 100}
console.log(obj[sym]); // 100
console.log(obj.sym); // undefined
const sym = Symbol("함수 이름");
const obj = {
[sym](param){
return param;
}
};
console.log(obj[sym](200)); // 200
const obj = {
[Symbol("100")]: 100,
two: 200
}
for (let key in obj){
console.log(key) // two
}
// Symbol은 Enumerable이 false이기 때문에 열거 되지 않아서 two만 출력된다.
const list = [Symbol("100")];
for (let value of list){
console.log(value) // Symbol(100)
}
const sym = Symbol("JSON");
const result = JSON.stringify([sym]: "ABC");
console.log(result); // {}
// Symbol 값은 외부에 노출되지 않기 위해 stringify로도 변환되지 않아서 빈값이 출력된다.
const Book = function(){};
const obj = new Book();
console.log(obj.toString()); // [object Object]
console.log({}.toString()); // [object Object]
// 위 처럼 결과값의 차이를 구분지을 수 없음
const Book = function(){};
const obj = new Book();
console.log(obj.toString(); // [object Object]
Book.prototype[Symbol.toStringTag] = "해리포터";
console.log(obj.toString(); // [object 해리포터]
// Book의 prototype에 Symbol.toStringTag를 오버라이드하면 tag한 값이 나타난다
const one = [10, 20], two = ["A", "B"];
const show = () => {
console.log(one.concat(two));
};
show(); // [10, 20, A, B]
two[Symbol.isConcatSpreadable] = true;
show(); // [10, 20, A, B]
two[Symbol.isConcatSpreadable] = false;
show(); // [10, 20, [A, B]]
@@species
가 오버라이드 된다.class Sports extends Array {
static get [Symbol.species](){
return Array;
}
};
const obj = new Sports(10, 20);
const book = {
toString() {
return "책";
}
};
console.log(`${book}) //책
const book = {
valueOf() {
return 30;
}
}
console.log(book * 20) // 600
Symbol.toPrimitive의 사용
const obj = {
[Symbol.toPrimitive](hint){
return hint === "number" ?30;
hint === "string" ? "책" : "default";
}
};
console.log(20 * obj) // 600
console.log(`${obj}` + 100) // 책100 (`` 템플릿리터럴로 인해)
console.log(obj + 50) // default50
console.log("default" == obj) // true
const list = [10, 20];
const obj = list[Symbol.iterator]();
obj.next() // {value: 10, done: false}
obj.next() // {value: 20, done: false}
obj.next() // {value: undefined, done: true}
const list "AB";
const obj = list[Symbol.iterator]();
obj.next() // {value: A, done: false}
obj.next() // {value: B, done: false}
obj.next() // {value: undefined, done: true}
const obj = {
[Symbol.iterator](){
return {
count: 0,
maxCount: this.maxCount,
next(){
if (this.count < this.maxCount){
return {value: this.count++, done: false}
};
return {value: undefined, done: true}
}
};
}
};
obj.maxCount = 2;
for (const value of obj){
console.log(value); // 0, 1
};
const one = Symbol.for("sports")
console.log(one) // Symbol(sports)
const one = Symbol.for("sports");
const two = Symbol.for("sports"); // one이 같은 key를 등록했으므로 two가 등록하지 않음
console.log(one === two); // true
const one = Symbol.for("book");
const six = Symbol.keyFor(one);
console.log(six) // book
console.log(Symbol("100").toString(); // Symbol(100)
const sym = Symbol.for("book");
console.log(sym.toString()); // Symbol(book)
try {
console.log(Symbol() + "ABC");
} catch {
console.log("+로 연결 불가"); // +로 연결 불가
};
console.log(Symbol("100").valueOf()); // Symbol(100)
console.log(Symbol.for("200").valueOf()); // Symbol(200)