7λ²μ§Έ λ°μ΄ν° νμ Symbol
μ¬λ²μ΄λ?
- μλ°μ€ν¬λ¦½νΈμλ 6κ°μ λ°μ΄ν° νμ
μ΄ μμ΅λλ€.
- λ¬Έμμ΄
- μ«μ
- λΆλ¦¬μΈ
- undefined
- null
- κ°μ²΄ νμ
- μ¬λ²(
symbol
)μ ES6μμ λμ λ 7λ²μ§Έ λ°μ΄ν° νμ μΌλ‘ λ³κ²½ λΆκ°λ₯ν μμνμ μ κ° - λ€λ₯Έ κ°κ³Ό μ€λ³΅λμ§ μλ μ μΌ λ¬΄μ΄ν κ°μΌλ‘ μ΄λ¦ μΆ©λ μνμ΄ μλ μ μΌν νλ‘νΌν° ν€λ₯Ό λ§λ€κΈ° μν΄ μ¬μ©νλ€.
νλ‘νΌν° ν€λ‘ μ¬μ©ν μ μλ κ°μ λΉ λ¬Έμμ΄μ ν¬ν¨νλ λͺ¨λ λ¬Έμμ΄ λλ μ¬λ² κ°μ΄λ€.
μ¬λ² κ°μ μμ±
Symbol ν¨μ
Symbol
κ°μ λ€λ₯Έ μμκ°κ³Ό λ€λ₯΄κ² 리ν°λ΄ νκΈ°λ²μ΄ μκ³ Symbol ν¨μλ₯Ό ν΅ν΄ μμ±ν©λλ€- μ΄λ μμ±λ μ¬λ²κ°μ μΈλΆλ‘ λ ΈμΆλμ§ μκ³ , λ€λ₯Έ κ°κ³Ό μ λ μ€λ³΅λμ§ μλ μ μΌλ¬΄μ΄ν κ°
// ν¨μ νΈμΆμ ν΅ν΄ μμ±
const mySymbol = Symbol();
console.log(type of my Symbol); // symbol
// μ¬λ² κ°μ μΈλΆλ‘ λ
ΈμΆλμ§ μμ νμΈμ΄ λΆκ°
console.log(mySymbol); // Symbol()
// μμ±μ ν¨μμ²λΌ 보μ΄μ§λ§
// new μ°μ°μμ ν¨κ» μ¬μ©μ κ°μ²΄λ μμ±λμ§λ§ μ¬λ² κ°μ λ³κ²½λΆκ°λ₯ν μμκ°
new Symbol(); // TypeError : Symbol is not a constructor
- Symbol ν¨μμλ μ νμ μΌλ‘ λ¬Έμμ΄ μΈμλ₯Ό μ λ¬ν μ μμ΅λλ€.
- μ λ¬λ λ¬Έμμ΄μ μμ±λ μ¬λ² κ°μλν μ€λͺ μΌλ‘ λλ²κΉ μ©λλ‘λ§ μ¬μ©λ©λλ€.
- μ¬λ² κ°λ λ¬Έμμ΄, μ«μ , λΆλ¦¬μΈ κ³Ό κ°μ΄ κ°μ²΄μ²λΌ μ κ·Ό μ μ묡μ μΌλ‘ λνΌκ°μ²΄λ₯Ό μμ±ν©λλ€.
const mySymbol = Symbol('mySymbol');
// κ°μ²΄ μ²λΌ μ κ·Ό μ λνΌ κ°μ²΄λ₯Ό μμ±ν©λλ€.
console.log(mySymbol.description); // mySymbol
console.log(mySymbol.toString()); // Symbol(mySymbol)
- μ¬λ² κ°μ μ묡μ μΌλ‘ λ¬Έμμ΄μ΄λ μ«μ νμ μΌλ‘ λ³νλμ§ μλλ€. λ¨, λΆλ¦¬μΈ νμ μΌλ‘λ μ묡μ μΌλ‘ νμ λ³ν λλ€.
const mySymbol = Symbol();
// λΆλ¦¬μΈμΌλ‘ μ묡μ νμ
λ³νμ΄ λλ―λ‘ ifλ¬ΈμΌλ‘ μ‘΄μ¬ νμΈ κ°λ₯
if(mySymbol) console.log('My Symbol is not empty');
Symbol.for / Symbol.keyFor λ©μλ
Symbol.for
Symbol.for
λ©μλλ μΈμλ‘ μ λ¬λ°μ λ¬Έμμ΄μ ν€λ‘ μ¬μ©νμ¬ ν€μ μ¬λ² κ°μ μλ€μ΄ μ μ₯λμ΄ μλ μ μ μ¬λ² λ μ§μ€νΈλ¦¬ μμ ν΄λΉ ν€μ μΌμΉνλ μ¬λ² κ°μ κ²μνλ€.- κ²μμ μ±κ³΅νλ©΄ μλ‘μ΄ μ¬λ² κ°μ μμ±νμ§ μκ³ κ²μλ€ μ¬λ² κ°μ λ°ν νλ€.
- κ²μμ μ€ν¨νλ©΄ μλ‘μ΄ μ¬λ²κ°μ μμ±νμ¬ Symbol.for λ©μλμ μΈμλ‘ μ λ¬λ ν€λ‘ μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ μ μ₯ν ν,μμ±λ μ¬λ² κ°μ λ°ν νλ€.
// μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ mySymbolμ΄λΌλ ν€λ‘ μ μ₯λ μ¬λ² κ°μ΄ μμΌλ©΄ μλ‘μ΄ μ¬λ² κ°μ μμ±
const s1 = Symbol.for('mySymbol');
// μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ mySymbolμ΄λΌλ ν€λ‘ μ μ₯λ μ¬λ² κ°μ΄ μμΌλ©΄ ν΄λΉ μ¬λ² κ°μ λ°ν
const s2 = Symbol.for('mySymbol');
console.log(s1 === s2); // true
Symbol.for
λ₯Ό μ¬μ©νλ©΄ μ ν리μΌμ΄μ μ μμμ μ€λ³΅λμ§ μλ μ μΌ λ¬΄μ΄ν μμμΈ μ¬λ²κ°μ λ¨ νλλ§ μμ±νμ¬ μ μ μ¬λ² λ μ§μ€νΈλ¦¬λ₯Ό ν΅ν΄ 곡μ ν μ μλ€.
Symbol.keyFor
Symbol.keyFor
λ©μλλ₯Ό μ¬μ©νλ©΄ μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ μ μ₯λ μ¬λ² κ°μ ν€λ₯Ό μΆμΆν μ μλ€.
// μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ mySymbolμ΄λΌλ ν€λ‘ μ μ₯λ μ¬λ² κ°μ΄ μμΌλ©΄ μλ‘μ΄ μ¬λ² κ°μ μμ±
const s1 = Symbol.for('mySymbol');
// μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ μ μ₯λ μ¬λ² κ°μ ν€λ₯Ό μΆμΆ
Symbol.keyFor(s1); // -> mySymbol
// Symbol ν¨μλ₯Ό νΈμΆνμ¬ μμ±ν μ¬λ² κ°μ μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ λ±λ‘λμ΄ κ΄λ¦¬λμ§ μλλ€.
const s2 = Symbol('foo');
// μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ μ μ₯λ μ¬λ² κ°μ ν€λ₯Ό μΆμΆ
Symbol.keyFor(s2); // -> undefined
μ¬λ²κ³Ό μμ
- μμλ₯Ό μ μ ν λ κ°μλ νΉλ³ν μλ―Έκ° μκ³ μμ μ΄λ¦ μ체μ μλ―Έκ° μλ κ²½μ°κ° μλ€.
- μ΄λ λ¬Έμ λ μμ κ°μ΄ λ³κ²½λκ±°λ λ€λ₯Έ λ€λ₯Έ λ³μ κ°κ³Ό μ€λ³΅ λ μ μλ€λ κ²
- μ΄λ° κ²½μ° μ€λ³΅λ κ°λ₯ μ±μ΄ μλ μ¬λ² κ°μ μ¬μ©ν μ μλ€.
// μ, μλ, μΌμͺ½, μ€λ₯Έμͺ½μ λνλ΄λ μμλ₯Ό μ μνλ€.
// μ€λ³΅λ κ°λ₯μ±μ΄ μλ μ¬λ² κ°μΌλ‘ μμ κ°μ μμ±νλ€.
const Direction = {
UP: Symbol('up'),
DOWN: Symbol('down'),
LEFT: Symbol('left'),
RIGHT: Symbol('right')
};
const myDirection = Direction.UP;
if (myDirection === Direction.UP) {
console.log('You are going UP.');
}
μ°Έκ³
enum
- enumμ λͺ
λͺ
λ μ«μ μμμ μ§ν©μΌλ‘ μ΄κ±°ν(
enumerated type
)μ΄λΌκ³ λΆλ₯Έλ€. - μλ°μ€ν¬λ¦½νΈμμλ enumμ μ§μνμ§ μμ§λ§ νμ μ€ν¬λ¦½νΈλ c, java λ± λ€λ₯Έ μΈμ΄μμ μ§μ
- μλ°μ€ν¬λ¦½νΈμμ κ°μ²΄ λκ²°μ ν΅ν΄ κ°μ²΄λ³κ²½μ λ°©μ§ν΄ enumμ νλ΄λ΄μ΄ μ¬μ©κ°λ₯
const Direction = Object.freeze({
UP : Symbol('up'),
DOWN: Symbol('down'),
LEFT: Symbol('left'),
RIGHT: Symbol('right')
});
μ¬λ²κ³Ό νλ‘νΌν° ν€
νλ‘νΌν° ν€λ λΉ λ¬Έμμ΄μ ν¬ν¨νλ λͺ¨λ λ¬Έμμ΄ λλ μ¬λ² κ°μΌλ‘ λ§λ€ μ μλ€.
- μ¬λ² κ°μ νλ‘νΌν° ν€λ‘ μ¬μ©νλ €λ©΄ νλ‘νΌν° ν€λ‘ μ¬μ©ν μ¬λ² κ°μ λκ΄νΈλ₯Ό μ¬μ©ν΄μΌ νλ€.
- μ¬λ²λ‘ μμ±ν νλ‘νΌν°μ μ κ·Όν λλ λ§μ°¬κ°μ§λ‘ λκ΄νΈλ₯Ό μ¬μ©ν΄μΌ νλ€.
const obj = {
// μ¬λ² κ°μΌλ‘ νλ‘νΌν° ν€λ₯Ό μμ±
[Symbol.for('mySymbol')]: 1
};
obj[Symbol.for('mySymbol')]; // -> 1
- μ¬λ² κ°μ μ μΌλ¬΄μ΄ν κ°μ΄λ―λ‘ μ¬λ² κ°μΌλ‘ νλ‘νΌν° ν€λ₯Ό λ§λ€λ©΄ λ€λ₯Έ νλ‘νΌν° ν€μ μ λ μΆ©λνμ§ μλλ€.
μ¬λ²κ³Ό νλ‘νΌν° μλ
- μ¬λ² κ°μ νλ‘νΌν° ν€λ‘ μ¬μ©νμ¬ μμ±ν νλ‘νΌν°λ
for ... in
λ¬Έμ΄λObject.keys
,Object.getOwnPropertyNames
λ©μλλ‘ μ°Ύμ μ μλ€. - μΈλΆμ λ ΈμΆν νμκ° μλ νλ‘νΌν°λ₯Ό μ¬λ² νλ‘νΌν°λ₯Ό ν΅ν΄ μλ ν μ μμ΅λλ€.
- ES6μμ λμ
λ
Object.getOwnPropertySymbols
λ©μλλ₯Ό μ¬μ©νλ©΄ μ¬λ² κ°μ νλ‘νΌν° ν€λ‘ μ¬μ©νμ¬ μμ±ν νλ‘νΌν°λ₯Ό μ°Ύμ μ μμ
μ¬λ²κ³Ό νμ€ λΉνΈμΈ κ°μ²΄ νμ₯
- νμ€ λΉνΈμΈ κ°μ²΄λ₯Ό νμ₯νλ κ²μ μ΄ν μΆκ°λ λ©μλμ μ΄λ¦κ³Ό μ€λ³΅λ κ°λ₯μ±μ΄ μμΌλ―λ‘ κΆμ₯ λμ§ μμ΅λλ€.
- μ΄λ μ¬λ² νλ‘νΌν° ν€λ₯Ό μμ±νμ¬ νμ€ λΉνΈμΈ κ°μ²΄λ₯Ό νμ₯νλ©΄ νμ€ λΉνΈμΈ κ°μ²΄μ κΈ°μ‘΄ νλ‘νΌν° ν€μ μΆ©λνμ§ μλ κ²μ λ¬Όλ‘ , μ΄ν μΆκ°λ μ΄λ€ νλ‘νΌν° ν€μλ μΆ©λ μνμ΄ μμ΄ μμ νκ² νμ€ λΉνΈμΈ κ°μ²΄λ₯Ό νμ₯ κ°λ₯ ν©λλ€.
// μ¬λ² κ°μΌλ‘ νλ‘νΌν° ν€λ₯Ό λμ μμ±νλ©΄ λ€λ₯Έ νλ‘νΌν° ν€μ μ λ μΆ©λνμ§ μμ μμ νλ€.
Array.prototype[Symbol.for('sum')] = function () {
return this.reduce((acc, cur) => acc + cur, 0);
};
[1, 2][Symbol.for('sum')](); // -> 3
Well-known Symbol
- μλ°μ€ν¬λ¦½νΈκ° κΈ°λ³Έ μ 곡νλ λΉνΈμΈ μ¬λ² κ°μ ECMAScript μ¬μμμλ
Well-known Symbol
μ΄λΌκ³ λΆλ₯Έλ€. Well-known Symbol
μ μλ°μ€ν¬λ¦½νΈ μμ§μ λ΄λΆ μκ³ λ¦¬μ¦μ μ¬μ©λλ€.- λΉνΈμΈ μ¬λ² κ°μ
Symbol
ν¨μμ νλ‘νΌν°μ ν λΉλμ΄ μλ€. Array
,String
,map
,set
λ±for ... of
λ¬ΈμΌλ‘ μν κ°λ₯ν λΉνΈμΈ μ΄ν°λ¬λΈμ Well-known SymbolμΈSymbol.iterator
λ₯Ό ν€λ‘ κ°λ λ©μλλ₯Ό κ°μ§λ€.Symbol.iterator
λ©μλλ₯Ό νΈμΆνλ©΄ μ΄ν°λ μ΄ν°λ₯Ό λ°ννλλ‘ ECMAScript μ¬μμ κ·μ λμ΄ μλ€.- λ§μ½ μΌλ° κ°μ²΄λ₯Ό μ΄ν°λ¬λΈ μ²λΌ λμνλλ‘ κ΅¬ννκ³ μΆλ€λ©΄ μ΄ν°λ μ΄μ νλ‘ν μ½μ μ€μνμ¬ Symbol.iteratorλ₯Ό ν€λ‘ κ°λ λ©μλλ₯Ό κ°μ²΄μ μΆκ°νκ³ μ΄ν°λ μ΄ν°λ₯Ό λ°ννλλ‘ κ΅¬ννλ©΄ λ¨
μ΄μ²λΌ μ¬λ²μ μ€λ³΅λμ§ μλ μμκ°μ μμ±νλ κ²μ λ¬Όλ‘ κΈ°μ‘΄μ μμ±λ μ½λμ μν₯μ μ£Όμ§ μκ³ μλ‘μ΄ νλ‘νΌν°λ₯Ό μΆκ°νκΈ° μν΄, μ¦ νμ νΈνμ±μ 보μ₯νκΈ° μν΄ λμ λμλ€.
'javascript > π study' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[7μ£Όμ°¨ μ€ν°λ]35μ₯-μ€νλ λ λ¬Έλ² (0) | 2022.03.27 |
---|---|
[7μ£Όμ°¨ μ€ν°λ]34μ₯-μ΄ν°λ¬λΈ (0) | 2022.03.27 |
[5μ£Όμ°¨ μ€ν°λ]26μ₯-ES6 ν¨μ μΆκ° κΈ°λ₯ (0) | 2022.03.27 |
[5μ£Όμ°¨ μ€ν°λ]25μ₯-ν΄λμ€ (0) | 2022.03.27 |
[5μ£Όμ°¨ μ€ν°λ]24μ₯-ν΄λ‘μ (0) | 2022.03.27 |
λκΈ