- Published on
Javascript Symbol
- Author
- Name
- yceffort
Javascript Primitive
๊ธฐ์กด์ ์๋ฐ์คํฌ๋ฆฝํธ๋ 6๊ฐ์ง์ primitive๊ฐ ์์๋ค.
- Object
- string
- number
- boolean
- null
- undefined
๊ทธ๋ฌ๋ es6๊ฐ ๋ค์ด์๋ฉด์ symbol
์ด๋ผ๋ 7๋ฒ์งธ primitive๊ฐ ์ถ๊ฐ๋์๋ค.
Symbol
const helloSymbol = Symbol()
const hiSymbol = Symbol()
์๋ก์ด ์ฌ๋ณผ ๊ฐ์ ์์ฑํ๋ค. ์ด ์ฌ๋ณผ๋ก ์์ฑํ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฏ๋ก const์ ํ ๋น์๋ ์๊ด์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ ์์ฑ๋ ์ฌ๋ณผ ๊ฐ์ ํ๋ก๊ทธ๋จ ๋ด์์ ์ ์ผํจ์ ๋ณด์ฅํด ์ค๋ค.
let obj = {}
obj[helloSymbol] = 'hello'
obj[hiSymbol] = 'hi'
console.log(obj)
{Symbol(): "hello", Symbol(): "hi"}
๋ฌผ๋ก ๋ฌธ์์ด์ด๋ ์ซ์๋ฅผ key๋ก ์ฌ์ฉํ ์ ์์ง๋ง, symbol์ ์ ์ผํจ์ ๋ณด์ฅํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ํค๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
const welcomeSymbol = Symbol('ํ์ํฉ๋๋ค')
console.log(welcomeSymbol)
Symbol(ํ์ํฉ๋๋ค)
Symbol
์์ ์๋ ๋ฌธ์์ด์ ์ผ์ข
์ ์ฃผ์์ผ๋ก ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๋ค.
์์
const isBlocked = Symbol('is blocked element?')
if (element[isBlocked]) {
openElement(element)
} else {
element[isBlocked] = true
}
element
๋ isBlocked
๋ผ๋ ์ฌ๋ณผ์ ํค๋ก ๊ฐ๋ object๋ค. ๋ฌธ์์ด์ด๋ ์ซ์๊ฐ ์๋ ์ฌ๋ณผ์ key๋ก ๊ฐ๋ ์์ฑ์ด๋ค. ์ด๋ ์ ์ผ์ฑ์ ๋ณด์ฅํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ํค๋ค๊ณผ์ ์ถฉ๋์ ๋ฐฉ์งํ ์ ์๋ค. ๋ค๋ง obj.name
๊ณผ ๊ฐ์ด dot์ ์ด์ฉํด์ ์ ๊ทผํ ์ ์๋ค. ๋ฐ๋์ []
๋ฅผ ํ์ฉํด์ ์ ๊ทผํด์ผ ํ๋ค.
ํ๊ฐ์ง ์ฃผ์ ํด์ผํ ๊ฒ์ isBlocked
์ฌ๋ณผ ๊ฐ์ด ์ค์ฝํ ๋ด์ ์กด์ฌ ํ ๋๋ง ์ด๋ฌํ ํ์๊ฐ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค. ์ด๋ค ๋ชจ๋์ด ์ฌ๋ณผ์ ์ค์ค๋ก ๋ง๋๋ ๊ฒฝ์ฐ, ํด๋น ๋ชจ๋์ ํด๋น ์ฌ๋ณผ์ ๋ชจ๋ ๊ฐ์ฒด์ ์ ์ฉํ ์ ์๋ค. ์ฆ ๋ค๋ฅธ ์์ฑ๊ณผ์ ์ถฉ๋์ ๊ฑฑ์ ํ ํ์๊ฐ ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ฌ๋ณผ ํค๋ ์ด๋ฌํ ์ถฉ๋์ ๋ฐฉ์งํ๊ธฐ ์ํด์ ๋ง๋ค์ด ์ง ๊ฒ์ด๋ฏ๋ก, ์ผ๋ฐ์ ์ธ javascript ๊ฐ์ฒด ์กฐ์ฌ๋ Symbol
์ ๋ฌด์ํ๋ค. ๋ฌด์จ ์๋ฆฌ๋๋ฉด...
let ๋ฉ์ = {}
๋ฉ์['์๋ฌธ๋ช
'] = 'Lionel Messi'
๋ฉ์['๋ณ๋ช
'] = '๋ผ์ด์ค๋ฌ ๋ฉง์'
const Nationality = Symbol('์ ์์ ๊ตญ์ ')
๋ฉ์[Nationality] = '์น ๋ '
for (let i in ๋ฉ์) {
console.log(i)
}
for (let i of Object.keys(๋ฉ์)) {
console.log(i)
}
for (let i of Object.getOwnPropertyNames(๋ฉ์)) {
console.log(i)
}
"์๋ฌธ๋ช
"
"๋ณ๋ช
"
"์๋ฌธ๋ช
"
"๋ณ๋ช
"
"์๋ฌธ๋ช
"
"๋ณ๋ช
"
์ด์ฒ๋ผ ์ฌ๋ณผ Nationality
ํค๋ ์ผ๋ฐ์ ์ธ ์ํฉ์์ ๋ชจ๋ ๋ฌด์ ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ๋ฌผ๋ก ์ด๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ๋ ์๋ค.
Object.getOwnPropertySymbols(๋ฉ์)
[Symbol(์ ์์ ๊ตญ์ )]
ํน์ ์ฌ๋ณผ์ ํฌํจํด์ ๋ชจ๋ ํค๋ฅผ ์กฐํํ๊ณ ์ถ๋ค๋ฉด
Reflect.ownKeys(๋ฉ์)
["์๋ฌธ๋ช
", "๋ณ๋ช
", Symbol(์ ์์ ๊ตญ์ )]
Reflect.ownKeys
๋ฅผ ํ์ฉํ๋ฉด ๋๋ค.
์ฌ๋ณผ์ ํน์ง
- ์ผ๋จ ์์ฑ๋๋ฉด ๋ณ๊ฒฝ๋์ง ์๋๋ค
- ์์ฑ์ ๋ถ์ฌํ ์ ์๋ค
- object์ key ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
- ๋ชจ๋ ์ฌ๋ณผ์ ๊ณ ์ ํ๋ค. ์ฃผ์์ด ๋์ผํ๋ค ํ๋๋ผ๋ ์ผ๋จ ์์ฑ๋๋ฉด ๋ค๋ฅด๊ฒ ๊ตฌ๋ณ๋๋ค.
- ๋ฌธ์์ด๋ก ์๋์ผ๋ก ๋ณํ๋์ง ์๋๋ค.
const newSymbol = Symbol(
'this symbol',
)`symbol is ${newSymbol}` //Uncaught TypeError: Cannot convert a Symbol value to a string
`symbol is ${String(newSymbol)} ${newSymbol.toString()}`
// symbol is Symbol(this symbol) Symbol(this symbol)
์ฌ๋ณผ์ ๊ฐ๋ ๋ฐฉ๋ฒ
Symbol()
์ ํธ์ถํ๋ค. ์ด๋ ํธ์ถํ ๋ ๋ง๋ค ์๋กญ๊ณ ๊ณ ์ ํ ์ฌ๋ณผ์ ๋ง๋ค์ด ์ค๋ค.Symbol.for(string)
์ ํธ์ถํ๋ค. ์ด ๋ฉ์๋๋Symbol Registry
๋ผ๋ ์ฌ๋ณผ๋ชฉ๋ก์ ์ฐธ์กฐํ์ฌ ๋ฆฌํดํ๋๋ฐ, ์์์๋ ๋ค๋ฅด๊ฒ ์ฌ๋ณผ ๋ชฉ๋ก์ ๊ณต์ ํ๋ค.Symbol.for('ํธ๋ ๋')
๋ฅผ ๊ณ์ํด์ ํธ์ถํ๋ค๋ฉด, ๋งค๋ฒ ๊ฐ์ ์ฌ๋ณผ์ ๋ฆฌํดํ๋ค. ์ด๋ ์ฌ๋ณผ์ด ๊ณต์ ๋์ด์ผ ํ๋ ์ํฉ์์ ์ ์ฉํ๋ค.Symbol.length
์ฒ๋ผ ํ์ค์ ์ ์๋ ์ฌ๋ณผ์ ๊ฐ์ ธ์ค๋ ๋ฒ