ECMAScriptλ‘ νμ€νλ μλ°μ€ν¬λ¦½νΈμλ λ¬Έμμ΄, μ«μ, λΆμΈ, null, undefined μ΄ 6κ°μ κ°μ²΄ νμ μ΄ μμλ€.
μ¬λ²μ ES6μμ λμ
λ 7λ²μ§Έ λ°μ΄ν° νμ
μΌλ‘ λ³κ²½ λΆκ°λ₯ν μμ νμ
μ κ°μ΄λ€. μ¬λ² κ°μ λ€λ₯Έ κ°κ³Ό μ€λ³΅λμ§ μλ μ μΌλ¬΄μ΄ν κ°μ΄λ€. λ°λΌμ μ£Όλ‘ μ΄λ¦μ μΆ©λ μνμ΄ μλ μ μΌν νλ‘νΌν° ν€λ₯Όλ§λ€κΈ° μν΄ μ¬μ©νλ€.
μ¬λ² κ°μ Symbol ν¨μλ₯Ό νΈμΆνμ¬ μμ±νλ€. μ΄λ μμ±λ μ¬λ² κ°μ μΈλΆλ‘ λ ΈμΆλμ§ μμ νμΈν μ μμΌλ©°, λ€λ₯Έ κ°κ³Ό μ λ μ€λ³΅λμ§ μλ μ μΌλ¬΄μ΄ν κ°μ΄λ€.
// Symbol ν¨μλ₯Ό νΈμΆνμ¬ μ μΌλ¬΄μ΄ν μ¬λ² κ°μ μμ±νλ€.
const mySymbol = Symbol();
console.log(typeof mySymbol); // symbol
// μ¬λ² κ°μ μΈλΆλ‘ λ
ΈμΆλμ§ μμ νμΈν μ μλ€.
console.log(mySymbol); // Symbol()
Symbol ν¨μμλ μ νμ μΌλ‘ λ¬Έμμ΄μ μΈμλ‘ μ λ¬ν μ μμΌλ μ΄λ μ¬λ² κ° μμ±μ μ΄λ ν μν₯λ μ£Όμ§ μλλ€.
// μ¬λ² κ°μ λν μ€λͺ
μ΄ κ°λλΌλ μ μΌλ¬΄μ΄ν μ¬λ² κ°μ μμ±νλ€.
const mySymbol1 = Symbol('mySymbol');
const mySymbol2 = Symbol('mySymbol');
console.log(mySymbol1 === mySymbol2); // false
μ¬λ² κ°μ μ묡μ μΌλ‘ λ¬Έμμ΄μ΄λ μ«μ νμ μΌλ‘ λ³νλμ§ μμΌλ λΆλ¦¬μΈ νμ μΌλ‘λ λ³νλλ€.
const mySymbol = Symbol();
// μ¬λ² κ°μ μ묡μ μΌλ‘ λ¬Έμμ΄μ΄λ μ«μ νμ
μΌλ‘ λ³νλμ§ μλλ€.
console.log(mySymbol + ''); // TypeError: Cannot convert a Symbol value to a string
console.log(+mySymbol); // TypeError: Cannot convert a Symbol value to a string
// λΆλ¦¬μΈ νμ
μΌλ‘λ μ묡μ μΌλ‘ νμ
λ³νλλ€.
console.log(!!mySymbol); // true
// if λ¬Έ λ±μμ μ‘΄μ¬ νμΈμ μν΄ μ¬μ©ν μ μλ€.
if (mySymbol) console.log('mySymbol is not empty.');
Symbol.for λ©μλλ μΈμλ‘ μ λ¬ λ°μ λ¬Έμμ΄μ ν€λ‘ μ¬μ©νμ¬ ν€μ μ¬λ² κ°μ μλ€μ΄ μ μ₯λμ΄ μλ μ μ μ¬λ² λ μ§μ€νΈλ¦¬μμ ν΄λΉ ν€μ μΌμΉνλ μ¬λ² κ°μ κ²μνλ€.
// μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ mySymbolμ΄λΌλ ν€λ‘ μ μ₯λ μ¬λ² κ°μ΄ μμΌλ©΄ μλ‘μ΄ μ¬λ² κ°μ μμ±
const s1 = Symbol.for('mySymbol');
// μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ mySymbolμ΄λΌλ ν€λ‘ μ μ₯λ μ¬λ² κ°μ΄ μμΌλ©΄ ν΄λΉ μ¬λ² κ°μ λ°ν
const s2 = Symbol.for('mySymbol');
console.log(s1 === s2); // true
Symbol.keyFor λ©μλλ₯Ό μ¬μ©νλ©΄ μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ μ μ₯λ μ¬λ² κ°μ ν€λ₯Ό μΆμΆν μ μλ€.
// μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ mySymbolμ΄λΌλ ν€λ‘ μ μ₯λ μ¬λ² κ°μ΄ μμΌλ©΄ μλ‘μ΄ μ¬λ² κ°μ μμ±
const s1 = Symbol.for('mySymbol');
// μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ μ μ₯λ μ¬λ² κ°μ ν€λ₯Ό μΆμΆ
Symbol.keyFor(s1); // -> mySymbol
// Symbol ν¨μλ₯Ό νΈμΆνμ¬ μμ±ν μ¬λ² κ°μ μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ λ±λ‘λμ΄ κ΄λ¦¬λμ§ μλλ€.
const s2 = Symbol('foo');
// μ μ μ¬λ² λ μ§μ€νΈλ¦¬μ μ μ₯λ μ¬λ² κ°μ ν€λ₯Ό μΆμΆ
Symbol.keyFor(s2); // -> undefined
// μ, μλ, μΌμͺ½, μ€λ₯Έμͺ½μ λνλ΄λ μμλ₯Ό μ μνλ€.
// μ΄λ κ° 1, 2, 3, 4μλ νΉλ³ν μλ―Έκ° μκ³ μμ μ΄λ¦μ μλ―Έκ° μλ€.
const Direction = {
UP: 1,
DOWN: 2,
LEFT: 3,
RIGHT: 4
};
// λ³μμ μμλ₯Ό ν λΉ
const myDirection = Direction.UP;
if (myDirection === Direction.UP) {
console.log('You are going UP.');
}
μ μμ μ κ°μ΄ κ°μλ νΉλ³ν μλ―Έκ° μκ³ μμ μ΄λ¦ μ체μ μλ―Έκ° μλ κ²½μ°κ° μλ€. μ΄λ λ¬Έμ λ μμ κ° 1, 2, 3, 4κ° λ³κ²½λ μ μμΌλ©°, λ€λ₯Έ λ³μ κ°κ³Ό μ€λ³΅λ μλ μλ€λ κ²μ΄λ€. μ΄λ¬ν κ²½μ° λ³κ²½/μ€λ³΅λ κ°λ₯μ±μ΄ μλ 무μλ―Έν μμ λμ μ€λ³΅λ κ°λ₯μ±μ΄ μλ μ μΌλ¬΄μ΄ν μ¬λ² κ°μ μ¬μ©ν μ μλ€.
// μ, μλ, μΌμͺ½, μ€λ₯Έμͺ½μ λνλ΄λ μμλ₯Ό μ μνλ€.
// μ€λ³΅λ κ°λ₯μ±μ΄ μλ μ¬λ² κ°μΌλ‘ μμ κ°μ μμ±νλ€.
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.');
}
κ°μ²΄μ νλ‘νΌν° ν€λ λΉ λ¬Έμμ΄μ ν¬ν¨νλ λ¬Έμμ΄ λλ μ¬λ² κ°μΌλ‘ λ§λ€μ μμΌλ©° λμ μμ±ν μ μλ€. μ¬λ² κ°μ νλ‘νΌν° ν€λ‘ μ¬μ©νλ €λ©΄ νλ‘νΌν° ν€λ‘ μ¬μ©ν μ¬λ² κ°μ λκ΄νΈλ₯Ό μ¬μ©ν΄μΌ νλ€. μ¬λ²κ°μ μ μΌλ¬΄μ΄ν κ°μ΄λ―λ‘ μ¬λ² κ°μΌλ‘ νλ‘νΌν° ν€λ₯Ό λ§λ€λ©΄ λ€λ₯Έ νλ‘νΌν° ν€μ μ λ μΆ©λνμ§ μλλ€.
const obj = {
// μ¬λ² κ°μΌλ‘ νλ‘νΌν° ν€λ₯Ό μμ±
[Symbol.for('mySymbol')]: 1
};
obj[Symbol.for('mySymbol')]; // -> 1
νλ‘νΌν° ν€κ° μ¬λ² κ°μΌλ‘ μμ±λ κ²½μ° for β¦ in λ¬Έμ΄λ Object.keys. Object.getOwnPropertyNames λ©μλλ‘ μ°Ύμ μ μλ€. μ΄μ²λΌ μ¬λ² κ°μ νλ‘νΌν° ν€λ‘ μ¬μ©νμ¬ νλ‘νΌν°λ₯Ό μμ±νλ©΄ νλ‘νΌν°λ₯Ό μλν μ μλ€.
const obj = {
// μ¬λ² κ°μΌλ‘ νλ‘νΌν° ν€λ₯Ό μμ±
[Symbol('mySymbol')]: 1
};
for (const key in obj) {
console.log(key); // μ무κ²λ μΆλ ₯λμ§ μλλ€.
}
console.log(Object.keys(obj)); // []
console.log(Object.getOwnPropertyNames(obj)); // []
νμ§λ§ Object.getOwnPropertySymbols λ©μλλ₯Ό μ¬μ©νλ©΄ μ°Ύμμ μλ€.
const obj = {
// μ¬λ² κ°μΌλ‘ νλ‘νΌν° ν€λ₯Ό μμ±
[Symbol('mySymbol')]: 1
};
// getOwnPropertySymbols λ©μλλ μΈμλ‘ μ λ¬ν κ°μ²΄μ μ¬λ² νλ‘νΌν° ν€λ₯Ό λ°°μ΄λ‘ λ°ννλ€.
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(mySymbol)]
// getOwnPropertySymbols λ©μλλ‘ μ¬λ² κ°λ μ°Ύμ μ μλ€.
const symbolKey1 = Object.getOwnPropertySymbols(obj)[0];
console.log(obj[symbolKey1]); // 1
μΌλ°μ μΌλ‘ νμ€ λΉνΈμΈ κ°μ²΄μ μ¬μ©μ μ μ λ©μλλ₯Ό μ§μ μΆκ°νμ¬ νμ₯νλ κ²μ κΆμ₯νμ§ μλλ€. νμ€ λΉνΈμΈ κ°μ²΄λ μ½κΈ° μ μ©μΌλ‘ μ¬μ©νλ κ²μ΄ μ’λ€. κ·Έ μ΄μ λ κ°λ°μκ° μ§μ μΆκ°ν λ©μλμ λ―Έλμ νμ€ μ¬μμΌλ‘ μΆκ°λ λ©μλμ μ΄λ¦μ΄ μ€λ³΅λ μ μκΈ° λλ¬Έμ΄λ€.
νμ§λ§ μ€λ³΅λ κ°λ₯μ±μ΄ μλ μ¬λ²κ°μΌλ‘ νλ‘νΌν° ν€λ₯Ό μμ±νμ¬ νμ€ λΉνΈμΈ κ°μ²΄λ₯Ό νμ₯νλ©΄ νμ€ λΉνΈμΈ κ°μ²΄μ κΈ°μ‘΄ νλ‘νΌν° ν€μ μΆ©λνμ§ μλ κ²μ λ¬Όλ‘ , νμ€ μ¬μμ λ²μ μ΄ μ¬λΌκ°μ λ°λΌ μΆκ°λ μ§ λͺ¨λ₯΄λ μ΄λ€ νλ‘νΌν° ν€μλ μΆ©λν μνμ΄ μμ΄ μμ νκ² νμ€ λΉνΈμΈ κ°μ²΄λ₯Ό νμ₯ν μ μλ€.
// μ¬λ² κ°μΌλ‘ νλ‘νΌν° ν€λ₯Ό λμ μμ±νλ©΄ λ€λ₯Έ νλ‘νΌν° ν€μ μ λ μΆ©λνμ§ μμ μμ νλ€.
Array.prototype[Symbol.for('sum')] = function () {
return this.reduce((acc, cur) => acc + cur, 0);
};
[1, 2][Symbol.for('sum')](); // -> 3
μλ°μ€ν¬λ¦½νΈκ° κΈ°λ³Έ μ 곡νλ λΉνΈμΈ μ¬λ²κ°μ΄ μλ€. λΉνΈμΈ μ¬λ² κ°μ Symbol ν¨μμ νλ‘νΌν°μ ν λΉλμ΄ μλ€. μλ°μ€ν¬λ¦½νΈκ° κΈ°λ³Έ μ 곡νλ λΉνΈμΈ μ¬λ² κ°μ ECMAScript μ¬μμμλ Well-known Symbol μ΄λΌ λΆλ₯Έλ€. μ΄λ μλ°μ€ν¬λ¦½νΈ μμ§μ λ΄λΆ μκ³ λ¦¬μ¦μ μ¬μ©λλ€.