<aside> ๐ก
๋ค๋ฅธ ๊ฐ๊ณผ ์ค๋ณต๋์ง ์๋ ์ ์ผ๋ฌด์ดํ ๊ฐ
๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ, ๊ฐ์ฒด, null, undefined, Symbol
์๋ 6๊ฐ๋ง ๋ฐ์ดํฐ ํ์ ์ด์๋๋ฐ ES6๋ถํฐ Symbol ํ์ ์ด ์ถ๊ฐ๋์ด ๋ฐ์ดํฐ ํ์ ์ ์ด 7๊ฐ๋ค.
</aside>
// ์ฌ๋ณผ ์์ฑํ๊ธฐ
let id1 = Symbol();
let id2 = Symbol();
// ์ฌ๋ณผ ๊ฐ๊ฐ์ ์ ์ผํ๊ธฐ์ ๋ค์ ์์์ false๋ก ํ๊ฐ๋๋ค
console.log(id1 == id2);
// ์ด๋ ๊ฒ new๋ฅผ ์ฐ๋ฉด TypeError ๋ฐ์
let newSymbol = new Symbol();
Symbol() ํจ์๋ฅผ ํตํด ์์ฑ ๊ฐ๋ฅํ๋ค.
new Symbol()์ ํ์ฉํ์ง ์๋๋ค.
let id1 = Symbol("id");
console.log(id1); // Symbol(id)
Symbol์ String ๊ฐ์ ์ ๋ฌํ์ฌ ์์ฑํ ์ ์๋ค. ์ด๋ฅผ ์ค๋ช ์ธ์๋ผ ๋ถ๋ฅธ๋ค.
์์ ๊ฐ์ด ์ฌ๋ณผ์ ์์ฑํ๋ฉด ๋์ง๋ง, ์ ๊ทผํ๊ธฐ ์ด๋ ค์ด ๊ตฌ์กฐ์ด๋ค. ๊ฐ์ฒด์ ํค๋ก Symbol์ ์ง์ ํ๋ฉด ์ด๋ป๊ฒ ์ ๊ทผํ ์ ์์๊น?
// ์ ์ญ ์ฌ๋ณผ ๋ ์ง์คํธ๋ฆฌ์ id ์ฌ๋ณผ ๋ฑ๋ก๋จ
let id = Symbol.for("id");
// ์ด๋ฏธ ๋ฑ๋ก๋ ์ฌ๋ณผ์ ๋ฐํํจ
let id2 = Symbol.for("id");
console.log(id === id2); // true
Symbol.for ๋งค์๋๋ฅผ ํตํด ์ฌ๋ณผ์ ์์ฑํ๋ฉด, ์ ์ญ ์ฌ๋ณผ ๋ ์ง์คํธ๋ฆฌ์ ๋ฑ๋ก๋๋ค. ๋ง์ฝ ์ ์ญ ์ฌ๋ณผ ๋ ์ง์คํธ๋ฆฌ์ ํด๋น ํค๊ฐ ๋ฑ๋ก๋์ด ์๋ค๋ฉด, ์ด๋ฏธ ๋ฑ๋ก๋ ์ฌ๋ณผ์ ๋ฐํํ๋ค.
let id = Symbol.for("id");
let witch = Symbol.for("witch");
console.log(Symbol.keyFor(id)); // id
console.log(Symbol.keyFor(witch)); // witch
Symbol.keyFor() ๋งค์๋๋ฅผ ํตํด ์ฌ๋ณผ ํค๋ฅผ ๊ฒ์ํ ์ ์๋ค.
๋๋ ์ค๋ฌด์์ ๊ฐ๋ฐํ๋ฉด์ Symbol ํค์๋๋ก ๋ฌด์ธ๊ฐ๋ฅผ ๋ง๋ค์ด๋ณธ ์ ์ด ๋จ ํ๋ฒ๋ ์๋ค. ์ด๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ด๊ฒ ์ ํ์ํ์ง? ๋ผ๋ ์๊ฐ์ด ๋ค์์ง๋ง, ํฌ๊ฒ ๋ ๊ฐ์ง์ ์ฅ์ ์ด ์๋ค.
<aside> ๐ก
์ฌ๋ณผ์ ์ฅ์ : ๊ณ ์ ์ฑ ๋ณด์ฅ, ๋น๊ณต๊ฐ ์์ฑ ๊ตฌํ
</aside>
const Direction = Object.freeze({
UP: "up",
DOWN: "down",
LEFT: "left",
RIGHT: "right",
});
const Mood = Object.freeze({
UP: "up",
DOWN: "down",
HAPPY: "happy",
});
console.log(Direction.UP === Mood.UP); // true
๋ค์ ์์ ์์, Direction์ ๋ฐฉํฅ์, Mood๋ ๊ธฐ๋ถ์ ์๋ฏธํ๋ค. value์ ๋ณ ์ฌ์ฉ์ฒ๊ฐ ์๊ธฐ์ ์ ๋นํ ๊ฐ์ ์ผ์ ๋ฟ์ธ๋ฐ ์ ํ ๋ค๋ฅธ ๊ฐ์ฒด์ ๊ฐ์ด ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๋ค.
const Direction = Object.freeze({
UP: Symbol("up"),
DOWN: Symbol("down"),
LEFT: Symbol("left"),
RIGHT: Symbol("right"),
});
const Mood = Object.freeze({
UP: Symbol("up"),
DOWN: Symbol("down"),
HAPPY: Symbol("happy"),
});
console.log(Direction.UP === Mood.UP); // false
์ด๋ฅผ Symbol()๋ก ์ ์ํ๋ฉด ๊ฐ์ด ๊ณ ์ ํ ๊ฐ์ ๊ฐ๋ฆฌํจ๋ค.
๊ทธ๋ฐ๋ฐ ๊ณ ์ ์ฑ ๋ณด์ฅํ๋ ค๊ณ ๊ตณ์ด Symbol()์ ์ถ๊ฐํ์๊น? uuid ์จ๋ ๊ณ ์ ์ฑ์ ๋ณด์ฅ๋๋ค.
const { v4: uuidv4 } = require('uuid');
const Direction = Object.freeze({
UP: uuidv4(),
DOWN: uuidv4(),
LEFT: uuidv4(),
RIGHT: uuidv4(),
});
const Mood = Object.freeze({
UP: uuidv4(),
DOWN: uuidv4(),
HAPPY: uuidv4(),
});
console.log(Direction.UP === Mood.UP); // false
๋ง์ฝ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋๋ฐ ํน์ ๊ฐ์ ์ํ๋ฅผ ํ์ง ์๊ณ ์ถ์ผ๋ฉด ์ด๋ป๊ฒํ ๊น?
const obj = {};
Object.defineProperties(obj, {
name: {
value: 'jihyup',
enumerable: true,
},
age: {
value: '31',
enumerable: true,
},
year: {
value: '1993',
enumerable: false,
}
});
for (let i in obj) {
console.log(i); // name age
}
์์ ๋ฐฐ์ด Object.defineProperties() ํจ์๋ฅผ ํตํด enumerable ์์ฑ์ false๋ก ์ง์ ํ์ฌ ์ํํ์ง ์๊ฒ ํ ์ ์๋ค.
๊ทธ๋ฌ๋ Symbol๋ก ๊ฐ์ฒด์ ํค๋ฅผ ์ง์ ํ๋ฉด enumerable ์์ฑ์ด ์๋์ผ๋ก false์ด๊ธฐ์ ์ ์ฝ๋๋ฅผ ๊ตฌํํ ์ ์๋ค.
const obj = {
name: 'jihyup',
age: '31',
[Symbol('year')]: '1993'
}
for (let i in obj) {
console.log(i); // name age
}
๋ธ๋ผ์ฐ์ ์์ ๊ฐ์ฒด, ๋ฐฐ์ด, Map()์ ์กฐํํด๋ณด๊ฒ ๋ค.

๋ฐฐ์ด ์กฐํ

๊ฐ์ฒด ์กฐํ

Map ์กฐํ
๊ณตํต์ ์ผ๋ก Symbol(Symbol.iterator) ์์ฑ์ด ์กด์ฌํ๋ค.
// Map ์์
const map = new Map([['a', 1], ['b', 2], ['c', 3]]);
console.log("Map iteration:");
for (const [key, value] of map) {
console.log(key, value); // a 1 b 2 c3
}
// ๋ฐฐ์ด ์์
const array = [1, 2, 3, 4, 5];
console.log("\\nArray iteration:");
for (const item of array) {
console.log(item); // 1 2 3 4 5
}
// ๊ฐ์ฒด ์์ (์๋ฌ ๋ฐ์)
const obj = {a: 1, b: 2, c: 3};
console.log("\\nObject iteration (will throw an error):");
try {
for (const item of obj) {
console.log(item);
}
} catch (error) {
console.log("Error:", error.message); // Error: obj is not iterable
}
Symbol(Symbol.iterator) ์์ฑ์ for โฆ of ๋ฌธ์ ๊ฐ๋ฅํ๊ฒ ํด์ค๋ค. ์ฌ๊ธฐ์ Map๊ณผ ๊ฐ์ฒด์ ์ฐจ์ด์ ์ด ๋ฐ์ํ๋ค. ๊ฐ์ฒด๋ iterator ์์ฑ์ด ์๊ณ , Map์ iterator ์์ฑ์ด ์์ด for โฆ of ๋ฌธ์์ ์ฐจ์ด๊ฐ ๋ฐ์ํ๋ค.
console.dir(Symbol)์ ํตํด ์ ์๋ ค์ง ์ฌ๋ณผ์ ์ถ๋ ฅํ ์ ์๋ค.

์ ์๋ ค์ง ์ฌ๋ณผ ํ๋กํผํฐ ๋ฐ Symbol ๋งค์๋
try {
let newSymbol = new Symbol();
console.log("์ ์์ ์ผ๋ก ์์ฑ๋จ");
} catch {
console.log("์๋ฌ ๋ฐ์");
}
let id = Symbol.for("id");
let id2 = Symbol.for("id");
console.log(id === id2);
<aside> ๐
https://witch.work/posts/javascript-symbol-usage#12-์ฌ๋ณผ์-์ค๋ช -์ธ์
</aside>