๐จ ์๋ ๋๋ณด๊ธฐ๋ ๊ฐ์ธ์ ๊ณต๋ถ๋ฅผ ์ํด ๊ธฐ๋กํ ํ์ ์ ๋๋ค.
์ฑ ์ ์ฝ๊ธฐ ์ ์์๋๋ Symbol
Symbol์ ์๋ก์ด type์ผ๋ก ๊ฐ์ฒด ์์ฑ์ ์๋ณ์๋ก ์ฌ์ฉ๋ ์ ์๋ ๊ณ ์ ํ๊ณ ๋ณ๊ฒฝํ ์ ์๋ ๋ฐ์ดํฐ ํ์.
Symbol์ ๋๋ฒ๊น ๋ชฉ์ ์ผ๋ก๋ง ์ฌ์ฉ๋จ.
Symbol()๋ก ํธ์ถ ํ ๋๋ง๋ค ๋ค๋ฅธ ๋ชจ๋ ๊ธฐํธ์ ์์ ํ ๋ค๋ฅธ ์๋ก์ด ๊ณ ์ ํ ๊ธฐํธ๋ฅผ ์ป๊ฒ ๋จ.
Symbol()์ ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ฌํ ์ ์๊ณ Symbol()์ ๊ธฐํธ ์ค๋ช ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค๊ณ ํจ.
Symbol์ ๊ฐ์ฒด์ key๋ก ์ฌ์ฉ๋ ์ ์์ผ๋, getOwnPropertynames, for in ๊ฐ์ ๋ฉ์๋๋ก๋ ์ ๊ทผํ ์ ์๊ณ , getOwnPropertySymbols()๋ฅผ ํตํด์๋ง Symbol๋ก ๋ key์ ์ ๊ทผํ ์ ์์.
๐ ์ฌ๋ฒ์ด๋?
- ์ฌ๋ฒ์ es6์์ ๋์ ๋ 7๋ฒ์งธ ๋ฐ์ดํฐ ํ์ ์ผ๋ก ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ์์ ํ์ ์ ๊ฐ์ด๋ค.
- ์ฌ๋ฒ ๊ฐ์ ๋ค๋ฅธ ๊ฐ๊ณผ ์ค๋ณต๋์ง ์๋ ์ ์ผ๋ฌด์ดํ ๊ฐ์ด๋ค.
- ์ด๋ฆ์ ์ถฉ๋ ์ํ์ด ์๋ ์ ์ผํ ํ๋กํผํฐ ํค๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
๐ ์ฌ๋ฒ ๊ฐ์ ์์ฑ
symbol ํจ์
- ๋ค๋ฅธ ์์๊ฐ๊ณผ๋ ๋ฌ๋ฆฌ Symbol ํจ์๋ฅผ ํธ์ถํ์ฌ ์์ฑํ๋ค.
- ์์ฑ๋ ์ฌ๋ฒ ๊ฐ์ ์ธ๋ถ๋ก ๋
ธ์ถ๋์ง ์์ ํ์ธํ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ๊ฐ๊ณผ ์ ๋ ์ค๋ณต๋์ง ์๋ ์ ์ผ๋ฌด์ดํ ๊ฐ์ด๋ค.
const only = Symbol(); console.log(typeof only); // symbol //์คํ ๊ฐ์ ์ธ๋ถ๋ก ๋ ธ์ถ๋์ง ์์ ํ์ธํ ์ ์์. console.log(only); //Symbol()โ
- Symbol ํจ์์๋ ๋ฌธ์์ด์ ์ธ์๋ก ์ ๋ฌํ ์ ์๊ณ ,์ด ๋ฌธ์์ด์ ์์ฑ๋ ์ฌ๋ฒ ๊ฐ์ ๋ํ ์ค๋ช ์ผ๋ก ๋๋ฒ๊น ์ฉ๋๋ก๋ง ์ฌ์ฉ๋๋ฉฐ
- ์ฌ๋ฒ ๊ฐ ์์ฑ์ ์ด๋ ํ ์ํฅ๋ ์ฃผ์ง ์์.
- ์ธ์๋ก ๋ค์ด๊ฐ ๋ฌธ์์ด์ด ๊ฐ๋๋ผ๋ ์์ฑ๋ ์ฌ๋ฒ ๊ฐ์ ์ ์ผ๋ฌด์ดํ ๊ฐ์.
const me = Symbol("daniel"); const metoo = Symbol("daniel"); console.log(me === metoo) // falseโโ
- ์ฌ๋ฒ ๊ฐ๋ ๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ๊ณผ ๊ฐ์ด ๊ฐ์ฒด์ฒ๋ผ ์ ๊ทผํ๋ฉด ๋ํผ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
๐ฑ ๋ํผ ๊ฐ์ฒด๋? ์์๊ฐ์ธ ๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ ๊ฐ์ ๊ฒฝ์ฐ ์ด๋ค ์์๊ฐ์ ๋ํด ๋ง์น ๊ฐ์ฒด์ฒ๋ผ ๋ง์นจํ ํ๊ธฐ๋ฒ(or ๋๊ดํธ ํ๊ธฐ๋ฒ)์ผ๋ก ์ ๊ทผํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ด ์ผ์์ ์ผ๋ก ์์๊ฐ์ ์ฐ๊ด๋ ๊ฐ์ฒด๋ก ๋ณํํด ์ค๋ค. ์ฆ, ์์๊ฐ์ ๊ฐ์ฒด์ฒ๋ผ ์ฌ์ฉํ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ์๋ฌต์ ์ผ๋ก ์ฐ๊ด๋ ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์์ฑ๋ ๊ฐ์ฒด๋ก ํ๋กํผํฐ์ ์ ๊ทผํ๊ฑฐ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ๋ค์ ์์๊ฐ์ผ๋ก ๋๋๋ฆฐ๋ค. ์ด์ ๊ฐ์ด ๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ํด ๊ฐ์ฒด์ฒ๋ผ ์ ๊ทผํ๋ฉด ์์ฑ๋๋ ์์ ๊ฐ์ฒด๋ฅผ ๋ํผ ๊ฐ์ฒด๋ผ๊ณ ํ๋ค.
const me = Symbol('daniel');
console.log(me.description); // daniel
console.log(me.toString()); // Symbol(daniel)
// ์ description ํ๋กํผํฐ์ toString ๋ฉ์๋๋ Symbol.prototype์ ํ๋กํผํฐ๋ค.
- ์ฌ๋ฒ ๊ฐ์ ์๋ฌต์ ์ผ๋ก ๋ฌธ์์ด์ด๋ ์ซ์ ํ์
์ผ๋ก๋ ๋ณํ๋์ง ์์ผ๋, ๋ถ๋ฆฌ์ธ ํ์
์ผ๋ก๋ ์๋ฌต์ ์ผ๋ก ํ์
๋ณํ์ด๋์ด if๋ฌธ์ ํตํด ์กด์ฌ ํ์ธ์ด ๊ฐ๋ฅํ๋ค.
const me = Symbol(); if(me) console.log("me is not empty") // me is not empty
Symbol.for / Symbol.keyfor ๋ฉ์๋
- Symbol.for ๋ฉ์๋๋ ์ธ์๋ก ์ ๋ฌ๋ฐ์ ๋ฌธ์์ด์ ํค๋ก ์ฌ์ฉํ์ฌ ํค์ ์ฌ๋ฒ ๊ฐ์ ์๋ค์ด ์ ์ฅ๋์ด ์๋ ์ ์ญ ์ฌ๋ฒ ๋ ์ง์คํธ๋ฆฌ(global symbol registry)์์ ํด๋น ํค์ ์ผ์นํ๋ ์ฌ๋ฒ ๊ฐ์ ๊ฒ์ํ๋ค.
- ๊ฒ์์ ์ฑ๊ณตํ๋ฉด ์๋ก์ด ์ฌ๋ฒ ๊ฐ์ ์์ฑํ์ง ์๊ณ ๊ฒ์๋ ์ฌ๋ฒ ๊ฐ์ ๋ฐํ
- ๊ฒ์์ ์คํจํ๋ฉด ์ฌ๋ฒ ๊ฐ์ ์์ฑํ์ฌ Symbol.for ๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌ๋ ํค๋ก ์ ์ญ ์ฌ๋ฒ ๋ ์ง์คํธ๋ฆฌ์ ์ ์ฅํ ํ ์์ฑ๋ ์ฌ๋ฒ ๊ฐ์ ๋ฐํ
// ์ ์ญ ์ฌ๋ฒ ๋ ์ง์คํธ๋ฆฌ์ me๋ผ๋ ํค๋ก ์ ์ฅ๋ ์ฌ๋ฒ ๊ฐ์ด ์๋์ง ๊ฒ์ํ์ฌ ์๋ค๋ฉด ์ ์ฌ๋ฒ ๊ฐ์ ์์ฑ const me = Symbol.for("daniel"); // ์ ์ญ ์ฌ๋ฒ ๋ ์ง์คํธ๋ฆฌ์ me๋ผ๋ ํค๋ก ์ ์ฅ๋ ์ฌ๋ฒ ๊ฐ์ด ์์ผ๋ฉด ํด๋น ์ฌ๋ฒ ๊ฐ์ ๋ฐํ const metoo = Symbol.for("daniel"); console.log(me === metoo) // true
- Symbol ํจ์๋ ํธ์ถ๋ ๋๋ง๋ค ์ ์ผ๋ฌด์ดํ ์ฌ๋ฒ ๊ฐ์ ์์ฑํ์ง๋ง ์ ์ญ ์ฌ๋ฒ ๋ ์ง์คํธ๋ฆฌ์์ ์ฌ๋ฒ ๊ฐ์ ๊ฒ์ํ ์ ์๋ ํค๋ฅผ ์ง์ ํ ์ ์์ผ๋ฏ๋ก ์ ์ญ ์ฌ๋ฒ ๋ ์ง์คํธ๋ฆฌ์ ์ ์ฅ๋์ง ์์.
- Symbol.keyFor ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ ์ญ ์ฌ๋ฒ ๋ ์ง์คํธ๋ฆฌ์ ์ ์ฅ๋ ์ฌ๋ฒ ๊ฐ์ ํค๋ฅผ ์ถ์ถํ ์ ์์.
const me = Symbol.for('daniel'); Symbol.keyFor(me); // 'daniel' const metoo = Symbol('park'); Symbol.keyFor(metoo); // undefinedโ
๐ ์ฌ๋ฒ๊ณผ ํ๋กํผํฐ ํค
- ์ฌ๋ฒ ๊ฐ์ ํ๋กํผํฐ ํค๋ก ์ฌ์ฉํ๋ ค๋ฉด ํ๋กํผํฐ ํค๋ก ์ฌ์ฉํ ์ฌ๋ฒ ๊ฐ์ ๋๊ดํธ๋ฅผ ์ฌ์ฉํด์ผ ํ๊ณ ํ๋กํผํฐ์ ์ ๊ทผํ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋๊ดํธ๋ฅผ ์ฌ์ฉํด์ผ ํจ.
const obj = { [Symbol.for('daniel')] : 1 }; obj[Symbol.for('daniel')]; // 1โ
๐ ์ฌ๋ฒ๊ณผ ํ๋กํผํฐ ์๋
- ์ฌ๋ฒ ๊ฐ์ ํ๋กํผํฐ ํค๋ก ์ฌ์ฉํ์ฌ ์์ฑํ ํ๋กํผํฐ๋ for...in ๋ฌธ์ด๋ Object.keys, Object.getOwnPropertyNames ๋ฉ์๋๋ก ์ฐพ์ ์ ์๋ค. ์ด์ฒ๋ผ ์ฌ๋ฒ ๊ฐ์ ํ๋กํผํฐ ํค๋ก ์ฌ์ฉํ์ฌ ํ๋กํผํฐ๋ฅผ ์์ฑํ๋ฉด ์ธ๋ถ์ ๋
ธ์ถํ ํ์๊ฐ ์๋ ํ๋กํผํฐ๋ฅผ ์๋ ๊ฐ๋ฅ(์๋ฒฝํ๊ฒ ์จ๊ธธ ์ ์๋ ๊ฒ์ ์๋ ์ด์ ๋ ํ๊ธฐ์ ๊ฐ์)ํ๋ Object.getOwnPropertySymbols ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฒ ๊ฐ์ ํ๋กํผํฐ ํค๋ก ์ฌ์ฉํ์ฌ ์์ฑํ ํ๋กํผํฐ๋ฅผ ์ฐพ์ ์ ์์.
const obj = { [Symbol('daniel')] : 1 }; console.log(Object.keys(obj)); // [] console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(daniel)] const symbolKey = Object.getOwnPropertySymbols(obj)[0]; // ํด๋น ๋ฉ์๋์ ๋ฐํ๊ฐ์ ๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ [0] console.log(obj[symbolKey]); // 1โ
๐ ์ฌ๋ฒ๊ณผ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด ํ์ฅ
ํ์ค ์ฌ์์ผ๋ก ์ถ๊ฐ๋ ๋ฉ์๋์ ์ค๋ณต๋ ๊ฐ๋ฅ์ฑ์ผ๋ก ์ธํด ํ์ค ๋นํธ์ธ ๊ฐ์ฒด์ ์ฌ์ฉ์ ์ ์ ๋ฉ์๋๋ฅผ ์ง์ ์ถ๊ฐํ์ฌ ํ์ฅํ๋ ๊ฒ์ ๊ถ์ฅ๋์ง ์๋๋ฐ, ์ค๋ณต๋ ๊ฐ๋ฅ์ฑ์ด ์๋ ์ฌ๋ฒ ๊ฐ์ผ๋ก ํ๋กํผํฐ ํค๋ฅผ ์์ฑํ์ฌ ํ์ค ๋นํธ์ธ ๊ฐ์ฒด๋ฅผ ํ์ฅํ๋ฉด ์ถฉ๋์ด ์ผ์ด๋์ง ์๋๋ก ๋ฐฉ์งํ ์ ์์.
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์ด๋ผ ๋ถ๋ฅด๊ณ ์ด๋ console.dir(Symbol)์ ํตํด ํ์ธ์ ํ ์ ์์. Well-known Symbol์ ์๋ฐ์คํฌ๋ฆฝํธ ์์ง์ ๋ด๋ถ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉ๋๋ค.
์๋ฅผ๋ค์ด for...of๋ฌธ์ผ๋ก ์ํ ๊ฐ๋ฅํ ๋นํธ์ธ ์ดํฐ๋ฌ๋ธ์ Well-known Symbol์ธ Symbol.iterator๋ฅผ ํค๋ก ๊ฐ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๋ฉฐ, Symbol.iterator ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ดํฐ๋ ์ดํฐ๋ฅผ ๋ฐํํ๋๋ก ECMAScript ์ฌ์์ ๊ท์ ๋์ด ์์. ๋นํธ์ธ ์ดํฐ๋ฌ๋ธ์ ์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ์ ์ค์ํจ.
์ฌ๋ฒ์ ์ค๋ณต๋์ง ์๋ ์์ ๊ฐ์ ์์ฑํ๋ ๊ฒ์ ๋ฌผ๋ก ๊ธฐ์กด์ ์์ฑ๋ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์๋ก์ด ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด, ์ฆ ํ์ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋์ ๋์๋ค.
++ ์ฐธ๊ณ ๋ก Object.getOwnPropertySymbols()๋ ์๋ ์ฌ์ง์์ ํ์ธํ ์ ์๋ฏ์ด es6์์ ์ถ๊ฐ๋์๋ค.
๊ทธ๋ฆฌ๊ณ console.dir(Symbol)์ ํตํด well-known Symbol์ ํ์ธํ ์ ์๋ ์ด์ ๋ ํจ์๋ ๊ฐ์ฒด์ด๊ธฐ์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ํ๋กํผํฐ๋ ์ผ๋ฐ ๊ฐ์ฒด์๋ ์๋ ํจ์ ๊ฐ์ฒด ๊ณ ์ ์ ํ๋กํผํฐ๋ก __proto__ ์ ๊ทผ์ ํ๋กํผํฐ๋ฅผ ํตํด ์์๋ฐ๋ ๊ฒ์ด ์๋๋ค.
์ถ์ฒ : ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฅ๋ค์ด๋ธ
'JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JavaScript] ์์ฑ์ ํจ์ (0) | 2021.11.21 |
---|---|
[JavaScript] ๋นํธ์ธ ๊ฐ์ฒด (0) | 2021.11.05 |
[JavaScript]์ ์ญ ๋ณ์์ ๋ฌธ์ ์ (0) | 2021.10.06 |
Detail of prototype in Javascript (0) | 2021.10.06 |
[๋ฒ์ญ] Introduction to Promises in JavaScript ์๋ฐ์คํฌ๋ฆฝํธ์์์ promise ์๊ฐ (0) | 2021.09.18 |