๋ฌธ์์ด, ์ซ์, ๋ถ๋ฆฌ์ธ, undefined, null, ๊ฐ์ฒด
7๋ฒ์งธ ํ์
๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅ
ํ ์์ ํ์
์ ๊ฐ๊ฐ์ฒด์ ์ ์ผํ ํ๋กํผํฐ ํค
๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉ1. ์ฌ๋ณผ ๊ฐ์ Symbol ํจ์๋ฅผ ํธ์ถํ์ฌ ์์ฑ ๊ฐ๋ฅ
// ๋ค๋ฅธ ํ์
์ ๊ฐ์ ๋ฆฌํฐ๋ด ํ๊ธฐ๋ฒ์ ํตํด ๊ฐ ์์ฑ ๊ฐ๋ฅ
const myString = 'Hello';
const mySymbol = Symbol();
console.log(typeof mySymbol); // symbol
console.log(mySymbol); // Symbol()
2. ๋ค๋ฅธ ๋ฐ์ดํฐ ํ์
์ ๊ฒฝ์ฐ new ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๋ํผ ๊ฐ์ฒด
๋ก์ ๋ณํ์ด ๊ฐ๋ฅํ์ง๋ง, symbol์ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ์์ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ
const strObj = new String('Hello');
const symObj = new Symbol(); // TypeError: Symbol is not a constructor
console.log(strObj); // [String: 'Hello']
3. Symbol ํจ์์๋ ์ ํ์ ์ผ๋ก ๋ฌธ์์ด ์ธ์ ์ ๋ฌ ๊ฐ๋ฅ
const mySymbol1 = Symbol('mySymbol');
const mySymbol2 = Symbol('mySymbol');
console.log(mySymbol1.description === mySymbol2.description); // true
console.log(mySymbol1 === mySymbol2); // false
4. ์ฌ๋ณผ ๊ฐ์ ๋ฌธ์์ด์ด๋ ์ซ์ ํ์
์ผ๋ก ๋ณํ๋์ง์์ผ๋ ๋ถ๋ฆฌ์ธ ํ์
์ผ๋ก๋ ๋ณํ๋๋ค
const mySymbol = Symbol();
// TypeError: Cannot convert a Symbol value to a string
console.log(mySymbol + 'Hello!');
//TypeError: Cannot convert a Symbol value to a number
console.log(mySymbol + 5);
if (mySymbol) {
console.log('mySymbol์ด ์กด์ฌํฉ๋๋ค.'); // mySymbol์ด ์กด์ฌํฉ๋๋ค.
}
์ํฉ ๊ฐ์
target, A, B
๋ผ๋ 3๊ฐ์ ์คํฌ๋ฆฝํธ๊ฐ ์กด์ฌํ๋ค.- target์ด๋ผ๋ ์คํฌ๋ฆฝํธ๊ฐ
user ๊ฐ์ฒด
๋ฅผ ๊ฐ์ง๊ณ ์๋ค.- A, B ์คํฌ๋ฆฝํธ์์๋ ๊ฐ์ ์๋ก์ ์ฝ๋๋ฅผ ๋ชจ๋ฅธ ์ฑ
์๋ณ์๋ฅผ ์ด์ฉํด user๋ฅผ ์๋ณํด์ผํ๋ ์ํฉ
์ด๋ค.
๋ฌธ์์ด id๋ฅผ ์ด์ฉํด ์๋ณ์๋ฅผ ๋ง๋ ๋ค๋ฉด?
let user = {
name: 'daseul',
};
user.id = 'A ์คํฌ๋ฆฝํธ์ id ๊ฐ';
user.id = 'B ์คํฌ๋ฆฝํธ์ id ๊ฐ ';
console.log(user); // { name: 'daseul', id: 'B ์คํฌ๋ฆฝํธ์ id ๊ฐ ' }
// ์คํฌ๋ฆฝํธ A์์ ๋ง๋ ์๋ณ์๋ ๋ฌด์๋ฏธํด์ง๋ค.
์ฌ๋ณผ์ ์ด์ฉํด ์๋ณ์๋ฅผ ๋ง๋ ๋ค๋ฉด?
let user = {
name: 'daseul',
};
user[Symbol('id')] = 'A ์คํฌ๋ฆฝํธ์ id';
user[Symbol('id')] = 'B ์คํฌ๋ฆฝํธ์ id';
console.log(user);
/* {
name: 'daseul',
[Symbol(id)]: 'A ์คํฌ๋ฆฝํธ์ id',
[Symbol(id)]: 'B ์คํฌ๋ฆฝํธ์ id'
} */
์ฌ๋ณผ์ for..in๋ฌธ, Object.keys ๋ฉ์๋์์ ๋ฐฐ์ ๋๋ค
for (let key in user) {
console.log(key); // name
}
console.log(Object.keys(user)); // ['name']
๋ฐ๋ผ์ ์ฌ๋ณผ์ ์ด์ฉํ๋ฉด
target ์คํฌ๋ฆฝํธ๊ฐ ๋ชจ๋ฅด๊ฒ user์ ์๋ณ์๋ฅผ ๋ถ์ฌ
ํ ์ ์์ผ๋ฉฐ, ๊ฐ์ ํค๋ฅผ ์ฌ์ฉํ์์ ๋๊ฐ์ด ๋ฎ์ด์์ด์ง๋ ์ํฉ๋ ๋ฐฉ์ง
ํ ์ ์๋ค.
๊ฒ์์ ์ฑ๊ณต
ํ๋ฉด ์๋ก์ด ์ฌ๋ฒ ๊ฐ์ ์์ฑํ์ง ์๊ณ ๊ฒ์๋ ์ฌ๋ฒ ๊ฐ์ ๋ฐํ
๊ฒ์์ ์คํจ
ํ๋ฉด ์๋ก์ด ์ฌ๋ฒ ๊ฐ์ ์์ฑํ์ฌ ํด๋น ํค๋ก ์ ์ญ ์ฌ๋ฒ ๋ ์ง์คํธ๋ฆฌ์ ์ ์ฅ ํ ์์ฑ๋ ์ฌ๋ฒ ๊ฐ์ ๋ฐํ
const globalSym = Symbol.for('id');
const sym = Symbol.for('id');
console.log(globalSym === sym); // true
const globalSym = Symbol.for('id');
const sym = Symbol('id');
console.log(globalSym === sym); // false
์ ํ๋ฆฌ์ผ์ด์
์ ์ญ์์ ์ค๋ณต๋์ง ์๋ ์ ์ผ๋ฌด์ดํ ์์์ธ ์ฌ๋ณผ ๊ฐ์ ๋จํ๋๋ง ์์ฑ
ํ์ฌ, ์ ์ญ ์ฌ๋ฒ ๋ ์ง์คํธ๋ฆฌ
๋ฅผ ํตํด ๊ณต์ ๊ฐ๋ฅ
์ฌ๋ณผ ๊ฐ์ ํค๋ฅผ ์ถ์ถ
๊ฐ๋ฅconst globalSym = Symbol.for('id');
const sym = Symbol('id');
const globalSymKey = Symbol.keyFor(globalSym);
console.log(globalSymKey); // id
const symKey = Symbol.keyFor(sym);
console.log(symKey); // undefined
const obj = {
[Symbol.for('name')]: 'daseul',
[Symbol('id')]: 1,
};
console.log(obj[Symbol.for('name')]); // daseul
console.log(obj[Symbol('id')]); // undefined
console.log(Object.getOwnPropertySymbols(obj));
// [ Symbol(name), Symbol(id) ]
const symbolValue = Object.getOwnPropertySymbols(obj)[1];
console.log(obj[symbolValue]); // 1
๋นํธ์ธ ์ฌ๋ฒ ๊ฐ
Symbol.iterator๋ฅผ ํค๋ก ๊ฐ๋ ๋ฉ์๋
๋ฅผ ๊ฐ์ง๋ฉฐ, ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ฉด ์ดํฐ๋ ์ดํฐ ๊ฐ์ฒด๋ฅผ ๋ฐํ
ํ๋๋ก ๊ท์ ๋์ด์๋ค.next
๋ผ๋ ๋ฉ์๋๋ฅผ ๊ฐ์ต๋๋ค.next
ย ๋ฉ์๋๋ ๋ค์ ๋ ์์ฑ์ ๊ฐ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค.done
ย - ๋ฐ๋ณต์ด ๋ชจ๋ ๋๋ฌ๋์ง๋ฅผ ๋ํ๋
๋๋ค.value
ย - ํ์ฌ ์์์ ๊ฐ์ ๋ํ๋
๋๋ค.const iterable = {
[Symbol.iterator]() {
let cur = 1;
const max = 5;
return {
next() {
return { value: cur++, done: cur > max + 1 };
},
};
},
};
const iter = iterable[Symbol.iterator]();
const it2 = iter.next();
const it3 = iter.next();
console.log(iter); // { next: [Function: next] }
console.log(it2); // { value: 1, done: false }
console.log(it3); // { value: 2, done: false }
์ดํฐ๋ ์ด์ ํ๋กํ ์ฝ์ ์ฌ์ฉํ๊ธฐ์ํด ์ผ๋ฐ ๊ฐ์ฒด์ ์ถ๊ฐํด์ผํ๋ ๋ฉ์๋ ํค Symbol.iterator๋ ๊ธฐ์กด ํ๋กํผํฐ ํค ๋๋ ๋ฏธ๋์ ์ถ๊ฐ๋ ํค์ ์ ๋๋ก ์ค๋ณต๋์ง ์์ ๊ฒ์ด๋ค.
Symbol์ ๊ธฐ์กด์ ์์ฑ๋ ์ฝ๋์ ์ํฅ์ ์ฃผ์ง์๊ณ ์๋ก์ด ํ๋กํผํฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ํด ๋์ ๋์๋ค.