
μ¬λ³Ό(symbol)μ ES6μμ μλ‘κ² μΆκ°λ 7λ²μ§Έ νμ μΌλ‘ λ³κ²½ λΆκ°λ₯νμμ νμμ κ°μ΄λ€. μ¬λ³Όμ μ£Όλ‘ μ΄λ¦μ μΆ©λ μνμ΄ μλ μ μΌν κ°μ²΄μ νλ‘νΌν° ν€(property key)λ₯Ό λ§λ€κΈ° μν΄ μ¬μ©νλ€.
Symbolμ Symbol() ν¨μλ‘ μμ±νλ€. Symbol()ν¨μλ νΈμΆλ λλ§λ€ Symbol κ°μ μμ±νλ€. μ΄λ μμ±λ Symbolμ κ°μ²΄κ° μλλΌ λ³κ²½ λΆκ°λ₯ν μμνμ μ΄ λλκ²μ΄λ€.
μ¬κΈ°μ μμνμ μ΄λ μλ κ·Έλλ‘ μ μ₯λλ λ°μ΄ν°λ₯Ό νννλ€. μμκ°μ λ³μμ ν λΉνλ©΄ κ°μ΄ 볡μ¬λμ΄ λ€μ΄κ°λ€.
let one = 1; // μμκ° let two = 2; // μμκ° console.log(one) // μΆλ ₯: 1 μλ κ·Έλλ‘μ λ°μ΄ν°λ₯Ό νν one = two; // μμκ° λ³΅μ¬ one = 3; console.log(one); // 3 console.log(two); // 2 => twoκ°μ΄ λ³νμ§ μλ κ²μ λ³Ό μ μλ€.
let mySymbol = Symbol() //Symbolμμ±
console.log(mySymbol); // Symbol
console.log(typeof mySymbol) // symbol
Symbol()ν¨μλ μΈμμ λ¬Έμμ΄μ μ λ¬ν μ μμΌλ μ΄ λ¬Έμμ΄μ ν΄λΉ μ¬λ³Όμ λν μ€λͺ
μ λ΄κΈ° μν μ£ΌμμΈ description μμ±λ§μ μλ―Έν λΏ μ¬λ³Ό μ체μλ μ무 μν₯μ μ£Όμ§ μλλ€.
const symbol1 = Symbol("λ μ£Όμ");
const symbol2 = Symbol("λ μ£Όμ");
console.log(symbol1.description); // λ μ£Όμ
console.log(symbol2.description); // λ μ£Όμ
console.log(symbol1 === symbol2); // false
console.log(symbol1 == symbol2); // false
κ°μ²΄μ νλ‘νΌν° ν€λ₯Ό μμ±ν λ μ¬λ³Όμ μ¬μ©νλ©΄ λ€λ₯Έ μ΄λ ν νλ‘νΌν°μλ μΆ©λνμ§ μλ ν€λ₯Ό μμ±ν μ μλ€.
const obj = {};
const mySymbol = Symbol("λ μ£Όμ");
obj[mySymbol] = "λ μ¬λ³Όκ°";
console.log(obj); // { [Symbol(λ μ£Όμ)]: "λ μ¬λ³Όκ°"}
console.log(obj[mySymbol]); // "λ μ¬λ³Όκ°"
Symbol κ°λ κ°μ²΄μ νλ‘νΌν° ν€λ‘ μ¬μ©ν μ μλ€. Symbol κ°μ μ μΌν κ°μ΄λ―λ‘ Symbol κ°μ ν€λ‘ κ°λ νλ‘νΌν°λ λ€λ₯Έ μ΄λ ν νλ‘νΌν°μλ μΆ©λνμ§ μλλ€.
μ¬λ³Όλ‘ λ§λ€μ΄μ§ ν€λ for ... in 루ν, Object.keys(), Object.getOwnPropertyNames()μ κ°μ κ°μ²΄ μ‘°μ¬ λ©μλμμ 무μλλ©°, Object.getOwnPropertySymbols()λ₯Ό ν΅ν΄μλ§ κ°μ Έμ¬ μ μλ€. μ΄ νΉμ±μ νμ©νλ©΄ μ¬λ³Όλ‘ μ μΈλ ν€ κ°λ€μ κ°μΆλ κ²λ κ°λ₯νλ€.
const obj = {};
const sym = Symbol("λ μ£Όμ");
obj[sym] = "λ μ¬λ³Όκ°";
obj["str"] = "string";
obj.hello = "hello";
for (let i in obj) {
console.log(i); // "str" "hello"
}
console.log(Object.getOwnPropertySymbols(obj)); //[ Symbol(λ μ£Όμ) ]
β¬οΈμμμ Symbol κ°μ Symbol()ν¨μλ‘ μμ±νλ€. μ΄κ²μ Symbolμ΄ ν¨μ κ°μ²΄λΌλ μλ―Έλ€.

μ μ°Έμ‘° κ²°κ³Όμμ μ μ μλ―μ΄ Symbol κ°μ²΄λ νλ‘νΌν°μ λ©μλλ₯Ό κ°μ§κ³ μλ€.
Symbol κ°μ²΄μ νλ‘νΌν° μ€μlengthμprototypeμ μ μΈν νλ‘νΌν°λ₯ΌWell-Known Symbolμ΄λΌ λΆλ₯Έλ€.
console.dirμ μμλ₯Ό JSONκ³Ό κ°μ νΈλ¦¬ κ΅¬μ‘°λ‘ μΆλ ₯ νκ³ ,DOM JS κ°μ²΄μ μ 체 ννμ λ³΄λ €κ³ ν λ μ μ©.κ°μ²΄λ dir, λλ¨Έμ§λ logλ‘ λ‘κΉ νλ©΄ νΈνλ€.
μ΄ν°λ μ΄μ
Well-Known Symbolμ μλ°μ€ν¬λ¦½νΈ μμ§μ μμλ‘ μ‘΄μ¬νλ©° μλ°μ€ν¬λ¦½νΈ μμ§μWell-Known Symbolμ μ°Έμ‘°νμ¬ μΌμ ν μ²λ¦¬λ₯Ό νλ€. μλ₯Ό λ€μ΄ μ΄λ€ κ°μ²΄κ°Symbol.iteratorλ₯Ό νλ‘νΌν° keyλ‘ μ¬μ©ν λ©μλ κ°μ§κ³ μμΌλ©΄ μλ°μ€ν¬λ¦½νΈ μμ§μ μ΄ κ°μ²΄κ°μ΄ν°λ μ΄μ νλ‘ν μ½μ λ°λ₯΄λ κ²μΌλ‘ κ°μ£Όνκ³μ΄ν°λ μ΄ν°λ‘ λμνλλ‘ νλ€.
Symbol.iteratorλ₯Ό νλ‘νΌν° keyλ‘ μ¬μ©νμ¬ λ©μλλ₯Ό ꡬννκ³ μλ λΉνΈμΈ κ°μ²΄( λΉνΈμΈ μ΄ν°λ¬λΈ )λ μλμ κ°λ€. μλμ κ°μ²΄λ€μ μ΄ν°λ μ΄μ
νλ‘ν μ½μ μ€μνκ³ μμΌλ©° μ΄ν°λ¬μ΄ν°λ₯Ό λ°ννλ€.
// μ΄ν°λ¬λΈ
// Symbol.iteratorλ₯Ό νλ‘νΌν° keyλ‘ μ¬μ©ν λ©μλλ₯Ό ꡬννμ¬μΌ νλ€.
// λ°°μ΄μλ Array.prototype[Symbol.iterator] λ©μλκ° κ΅¬νλμ΄ μλ€.
const iterable = ['a', 'b', 'c'];
// μ΄ν°λ μ΄ν°
// μ΄ν°λ¬λΈμ Symbol.iteratorλ₯Ό νλ‘νΌν° keyλ‘ μ¬μ©ν λ©μλλ μ΄ν°λ μ΄ν°λ₯Ό λ°ννλ€.
const iterator = iterable[Symbol.iterator]();
// μ΄ν°λ μ΄ν°λ μν κ°λ₯ν μλ£ κ΅¬μ‘°μΈ μ΄ν°λ¬λΈμ μμλ₯Ό νμνκΈ° μν ν¬μΈν°λ‘μ value, done νλ‘νΌν°λ₯Ό κ°λ κ°μ²΄λ₯Ό λ°ννλ next() ν¨μλ₯Ό λ©μλλ‘ κ°λ κ°μ²΄μ΄λ€. μ΄ν°λ μ΄ν°μ next() λ©μλλ₯Ό ν΅ν΄ μ΄ν°λ¬λΈ κ°μ²΄λ₯Ό μνν μ μλ€.
console.log(iterator.next()); // { value: 'a', done: false }
console.log(iterator.next()); // { value: 'b', done: false }
console.log(iterator.next()); // { value: 'c', done: false }
console.log(iterator.next()); // { value: undefined, done: true }
Symbol.for λ©μλλ μΈμλ‘ μ λ¬λ°μ λ¬Έμμ΄μ ν€λ‘ μ¬μ©νμ¬ Symbol κ°λ€μ΄ μ μ₯λμ΄ μλ μ μ Symbol λ μ§μ€νΈλ¦¬μμ ν΄λΉ ν€μ μΌμΉνλ μ μ₯λ Symbol κ°μ κ²μνλ€. μ΄λ κ²μμ μ±κ³΅νλ©΄ κ²μλ Symbol κ°μ λ°ννκ³ , κ²μμ μ€ν¨νλ©΄ μλ‘μ΄ Symbol κ°μ μμ±νμ¬ ν΄λΉ ν€λ‘ μ μ Symbol λ μ§μ€νΈλ¦¬μ μ μ₯ν ν, Symbol κ°μ λ°ννλ€.
// μ μ Symbol λ μ§μ€νΈλ¦¬μ fooλΌλ ν€λ‘ μ μ₯λ Symbolμ΄ μμΌλ©΄ μλ‘μ΄ Symbol μμ±
const s1 = Symbol.for('foo');
// μ μ Symbol λ μ§μ€νΈλ¦¬μ fooλΌλ ν€λ‘ μ μ₯λ Symbolμ΄ μμΌλ©΄ ν΄λΉ Symbolμ λ°ν
const s2 = Symbol.for('foo');
console.log(s1 === s2); // true
Symbol ν¨μλ λ§€λ² λ€λ₯Έ Symbol κ°μ μμ±νλ κ²μ λ°ν΄, Symbol.for λ©μλλ νλμ Symbolμ μμ±νμ¬ μ¬λ¬ λͺ¨λμ΄ ν€λ₯Ό ν΅ν΄ κ°μ Symbolμ 곡μ ν μ μλ€.
Symbol.for λ©μλλ₯Ό ν΅ν΄ μμ±λ Symbol κ°μ λ°λμ ν€λ₯Ό κ°μ§λ§ Symbol ν¨μλ₯Ό ν΅ν΄ μμ±λ Symbol κ°μ ν€κ° μλ€.
const shareSymbol = Symbol.for('myKey');
const key1 = Symbol.keyFor(shareSymbol);
console.log(key1); // myKey
const unsharedSymbol = Symbol('myKey');
const key2 = Symbol.keyFor(unsharedSymbol);
console.log(key2); // undefined