자바스크립트 중급 - 3. 심볼(Symbol)

김민재·2023년 1월 8일
0

TIL, Core JavaScript

목록 보기
8/11

property key: 문자형

const obj={
	1: '1임',
  fasle : '거짓'
}
Object.keys(obj) // ['1','fasle']
obj['1'] 
obj['fasle]
  • 객체 프로퍼티 키는 문자형으로 만드는데 Object.keys를 사용해도 문자열로 반환, 접근할 때도 문자열로 접근 가능하다

  • 이렇게 객체 프로퍼티 키는 문자열로 접근 가능한데 하나 더 가능한 형태가 심볼 형태이다.

const a = Symbol()

const b = Symbol()
console.log(a) // Symbol()
console.log(b) // Symbol()
a ===b // false
a ==b // false

const id = Symbol('id') // 심볼 내부에 문자열로 설명을 붙여줄 수 있다

심볼

  • 심볼은 유일한 식별 자료를 만들 때 사용되며 심볼형을 사용하면 유일성이 보장된다. 유일 성이 보장됌은 전체 코드 중 딱 하나임을 의미

  • 심볼을 객체의 키로 사용하여 Object.key, values, entries 메서드를 사용하면 키가 심벌형인 것들은 건너 뛰게 된다. (for in도 마찬가지)

  • 심볼은 이렇게 특정 객체에 원본 데이터는 건들지 않고 특정 속성을 추가할 때 사용된다.

const id = Symbol('id')

const user = {
    name :'min',
    age: 25,
    [id]:'myid'
}
// user
// {name: 'min', age: 25, Symbol(id): 'myid'}

Object.keys(user)
(2) ['name', 'age']
Object.values(user)
(2) ['min', 25]
Object.entries(user)
(2) [Array(2), Array(2)]
  • 이렇게 심볼은 이름이 같아도 모두 다른 존재이지만 가끔 전역 변수처럼 이름이 같으면
    같은 객체를 가리킬 때 사용 되는 것이 Symbol.for(), 전역 심볼이다.

    Symbol.for()

  • 하나의 심볼만 보장받음

  • 없으면 만들고 있으면 가져옴

  • Symbol 함수는 매번 다른 Symbol 값을 생성하지만 Symbol.for() 메소드는 하나를 생성한 뒤 키를 통해 같은 Symbol을 공유

const id1 = Symbol.for('id')
const id2 = Symbol.for('id')
id === id2 // true
Symbol.ketFor(id1) // id

const id = Symbol('id임')
id.description; // id임

Object.getOwnPropertySymbols(user)
// [Symbol(id)]
Reflect.ownKeys(user)
// (3) ['name', 'age', Symbol(id)]
  • Symbol.for()를 사용하면 전역 심볼로 사용가능하고 코드 어디에서든 사용 가능
  • 이름을 얻고싶을 땐 Symbol.ketFor()에 변수를 넣어 접근 가능
  • 전역 심볼이 아닌 경우엔 Symbol.ketFor() 대신 dscripion으로 접근 가능
  • Object.getOwnPropertySymbols()에 객체를 넣으면 심볼만 볼 수 있고 Reflect.ownKeys()
    에 객체를 넘기면 심볼형 키를 포함한 객체의 모든 키를 보여준다

// 다른 개발자가 만든 객체
const user = {
    name :'min',
    age: 25,
}

// 내 작업 
// user.showName = function(){}
const showName = Symbol('showName')
user[showName] = function () {
    console.log(this.name)    
}

user[showName]()
// 사용자 접속 시 보는 메세지
for(let key in user){
    console.log(`his ${key} is ${user[key]}`)
}
  • 위 처럼 객체 내부에 심볼형으로 만들면 다른 작업자가 만든 코드에 영향을 미치지않고 새로운 프로퍼티 및 메서드 추가도 가능
profile
자기 신뢰의 힘을 믿고 실천하는 개발자가 되고자합니다.

0개의 댓글