ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • μžλ°”μŠ€ν¬λ¦½νŠΈμ— 7번째 μ›μ‹œν˜• νƒ€μž…μ΄ μžˆλ‹€λ˜λ°(Symbol)
    μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ 2023. 2. 13. 04:09

    TLDR;

    심볼은 ES6μ—μ„œ λ„μž…λœ 7번째 데이터 νƒ€μž…μœΌλ‘œ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μ›μ‹œ νƒ€μž…μ˜ 값이닀. 심볼은 λ‹€λ₯Έ κ°’κ³Ό μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μœ μΌλ¬΄μ΄ν•œ κ°’μœΌλ‘œ, 이름 좩돌이 μ—†λŠ” μœ μΌν•œ ν”„λ‘œνΌν‹° ν‚€λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄μ‹¬λ³Όμ€ ES6μ—μ„œ λ„μž…λœ 7번째 데이터 νƒ€μž…μœΌλ‘œ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μ›μ‹œ νƒ€μž…μ˜ 값이닀. 심볼은 λ‹€λ₯Έ κ°’κ³Ό μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μœ μΌλ¬΄μ΄ν•œ κ°’μœΌλ‘œ, 이름 좩돌이 μ—†λŠ” μœ μΌν•œ ν”„λ‘œνΌν‹° ν‚€λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μ‚¬μš©λœλ‹€.

    심볼 μ‚¬μš©λ²•

    Symbol 생성

    • Symbol ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜μ—¬ 생성
    • ( )κ΄„ν˜Έ μ•ˆμ˜ λ¬Έμžμ—΄μ€ 디버깅 μš©λ„λ‘œλ§Œ μ‚¬μš©λ˜λŠ” μ‹¬λ²Œκ°’μ— λŒ€ν•œ μ„€λͺ…μž„
    • 아무리 같은 μ΄λ¦„μœΌλ‘œ 많이 λ§Œλ“€μ–΄λ„ μ ˆλŒ€ κ°™μ€κ²Œ λ§Œλ“€μ–΄μ§€μ§€ μ•ŠμŒ(μ‹¬λ²Œμ€ μœ μΌλ¬΄μ΄ν•œ κ°’)
    const mySymbol = Symbol();      //  Symbol ν•¨μˆ˜ ν˜ΈμΆœν•˜λ©΄ λœλ‹€.
    const mySymbol2 = Symbol('mySymbol2'); // 디버깅 μš©λ„λ‘œ μ‚¬μš©λ˜λŠ” μ‹¬λ²Œκ°’μ— λŒ€ν•œ μ„€λͺ…
    const mySymbol3 = Symbol('mySymbol2');
    const mySymbol4 = Symbol(); 
    
    console.log(mySymbol == mySymbol4); // false

    μ „μ—­ Symbol 생성

    심볼은 λͺ¨λ‘ 이름이 같더라도 λͺ¨λ‘ λ³„κ°œλ‘œ μ·¨κΈ‰λœλ‹€. 그러면, 이름이 같은 심볼이 같은 개체λ₯Ό 가리킀도둝 ν•˜κ³  앂을 λ•Œμ—λŠ” μ–΄λ–»κ²Œ ν•΄μ•Όν•˜λ‚˜? 예λ₯Ό λ“€μ–΄, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 곳곳에 심볼 "id"λ₯Ό μ΄μš©ν•΄ νŠΉμ • ν”„λ‘œνΌν‹°μ— μ ‘κ·Όν•΄μ•Όν•œλ‹€λ©΄?

     

    이럴 λ•Œλ₯Ό μœ„ν•΄ λ§Œλ“€μ–΄μ§„ 것이 μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬μΈλ°, μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬ μ•ˆμ— 심볼을 λ§Œλ“€κ³  ν•΄λ‹Ή 심볼에 μ ‘κ·Όν•˜λ©΄, 이름이 같은 경우 항상 λ™μΌν•œ 심볼을 λ°˜ν™˜ν•΄μ€€λ‹€.

     

    Symbol.for
    인수둜 전달받은 λ¬Έμžμ—΄μ„ ν‚€λ‘œ μ‚¬μš©ν•˜μ—¬ 킀와 μ‹¬λ²Œ κ°’μ˜ μŒλ“€μ΄ μ €μž₯λ˜μ–΄ μžˆλŠ” μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬μ—μ„œ ν•΄λ‹Ή 킀와 μΌμΉ˜ν•˜λŠ” μ‹¬λ²Œ 값을 검색 μ—†μœΌλ©΄ μƒˆλ‘œ 등둝, 있으면 κΈ°μ‘΄ 값을 μ½μ–΄μ˜΄

    const s1 = Symbol.for('id');     // 기쑴에 μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬μ— 'id'λž€ ν‚€λ‘œ μ €μž₯된 μ•  μ—†μœΌλ©΄ μƒˆλ‘œ 생성
    
    const s2 = Symbol.for('id');     // 기쑴에 λ§Œλ“€μ–΄μ Έ μžˆλŠ” 'id'λž€ ν‚€λ‘œ 된 μ‹¬λ²Œ κ°’ λ°˜ν™˜
    
    // 확인!
    console.log(s1 === s2);  //true

    Symbol.keyFor
    μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬μ— μ €μž₯된 μ‹¬λ²Œ κ°’μ˜ ν‚€λ₯Ό μΆ”μΆœν•  수 μžˆλ‹€.

    const s1 = Symbol.for('id');  
    
    Symbol.keyFor(s1);     // 'id'

    μ‹¬λ²Œ ν”„λ‘œνΌν‹° 객체 ν‚€λ‘œ μ‚¬μš©ν•˜κΈ°

    • λŒ€κ΄„ν˜Έλ₯Ό μ΄μš©ν•˜μ—¬ 생성 및 μ‚¬μš©ν•œλ‹€.
      const obj = {
        [Symbol.for('mySymbol')] : 1,  // λŒ€κ΄„ν˜Έ μ‚¬μš©ν•˜μ—¬ 생성
      }
      
      obj[Symbol.for('mySymbol')]; // λ§ˆμ°¬κ°€μ§€λ‘œ λŒ€κ΄„ν˜Έλ‘œ 생성. λ™μ μœΌλ‘œ 생성
      
      const id = Symbol('id');
      obj[id] = 123;
      console.log(obj); // { Symbol(mySymbol) : 1, Symbol(id) : 123 }

     

    ν”„λ‘œνΌν‹°λ₯Ό μ™„μ „νžˆ 숨길 수 μžˆλŠ” 것은 μ•„λ‹ˆκ³ , Object.getOwnPropertySymbolsλ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ‹¬λ²Œ 값을 ν”„λ‘œνΌν‹° ν‚€λ‘œ μ‚¬μš©ν•˜μ—¬ μƒμ„±ν•œ ν”„λ‘œνΌν‹°λ₯Ό 찾을 수 μžˆλ‹€.

    const obj = 1 {
        // μ‹¬λ²Œ κ°’μœΌλ‘œ ν”„λ‘œνΌν‹° ν‚€λ₯Ό 생성
        [Symbol('mySymbol')] : 1
    };
    
    console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(mySymbol)]
    
    const symbolKey = Object.getOwnPropertySymbols(obj)[0];
    console.log(obj[symbolKey]);  // 1

    Well-known Symbol

    μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ κΈ°λ³Έ μ œκ³΅ν•˜λŠ” 빌트인 μ‹¬λ²Œ 값이 μžˆλ‹€.

    • Symbol.hasInstance
    • Symbol.isConcatSpreadable
    • Symbol.iterator
    • Symbol.toPrimitive
    • 기타 λ“±λ“±

     

    μ°Έκ³ 

     

    λŒ“κΈ€

Designed by Tistory.