Skip to content

Latest commit

Β 

History

History

26.String,Symbol

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Β 
Β 

String πŸŽ―πŸ’‘πŸ”₯πŸ“Œβœ…

  • ν‘œμ€€ 빌트인 객체인 String은 μ›μ‹œνƒ€μž… λ¬Έμžμ—΄μ„ λ‹€λ£° λ•Œ μœ μš©ν•œ ν”„λ‘œνΌν‹°μ™€ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.




String μƒμ„±μž ν•¨μˆ˜

  • ν‘œμ€€ 빌트인 객체인 String κ°μ²΄λŠ” μƒμ„±μž ν•¨μˆ˜μ΄λ‹€.
    • λ”°λΌμ„œ new μ—°μ‚°μžμ™€ ν•¨κ»˜ 호좜 ν•΄μ•Ό ν•œλ‹€.
  • String μƒμ„±μž ν•¨μˆ˜μ— 인수λ₯Ό μ „λ‹¬ν•˜μ§€ μ•Šκ³ , new μ—°μ‚°μžμ™€ 호좜 μ‹œ [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— λΉˆλ¬Έμžμ—΄μ„ ν• λ‹Ήν•œ String 래퍼 객체λ₯Ό μƒμ„±ν•œλ‹€.
  • λ°˜λŒ€λ‘œ, String μƒμ„±μž ν•¨μˆ˜μ˜ 인수둜 λ¬Έμžμ—΄μ„ μ „λ‹¬ν•˜λ©΄μ„œ new μ—°μ‚°μžμ™€ ν•¨κ»˜ 호좜 μ‹œ 인수둜 전달 받은 λ¬Έμžμ—΄μ„ [[StringData]] λ‚΄λΆ€ μŠ¬λ‘―μ— 래퍼 객체둜 생성
  • new μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  String μƒμ„±μžλ₯Ό ν˜ΈμΆœν•˜λ©΄ String μΈμŠ€ν„΄μŠ€κ°€ μ•„λ‹Œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€( λͺ…μ‹œμ  νƒ€μž… λ³€ν™˜μ—λ„ μ‚¬μš© 됨 )
    • image

πŸ’‘ String 래퍼 κ°μ²΄λŠ” λ°°μ—΄κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ length ν”„λ‘œνΌν‹°λ₯Ό 가지며, μœ μ‚¬ λ°°μ—΄μ΄λ©΄μ„œ μ΄ν„°λŸ¬λΈ”μ΄λ‹€.

//λ¬Έμžμ—΄μ€ μ›μ‹œκ°’μ΄κΈ° λ•Œλ¬Έμ— λ³€κ²½ν•  수 μ—†λ‹€. μ—λŸ¬ λ°œμƒXX
래퍼객체[0] = "S"

예제 μ½”λ“œ λ¬Έμžμ—΄ 전달 X

const strObj = new string();
console.log(strObj); //String {length:0, [[StringData]]:""}

예제 μ½”λ“œ λ¬Έμžμ—΄ 전달 O

const strObj = new String("KIM");
console.log(Object.getOwnPropertyDescriptors(strObj));
// {
//   '0': { value: 'K', writable: false, enumerable: true, configurable: false },
//   '1': { value: 'I', writable: false, enumerable: true, configurable: false },
//   '2': { value: 'M', writable: false, enumerable: true, configurable:
// }



String μ—¬λŸ¬ λ©”μ„œλ“œ

  • String κ°μ²΄μ—λŠ” 원본 String 래퍼 객체λ₯Ό 직접 λ³€κ²½ν•˜λŠ” λ©”μ„œλ“œλŠ” μ—†λ‹€.
    • λ¬Έμžμ—΄μ€ λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μ›μ‹œκ°’μ΄κΈ° λ•Œλ¬Έμ— String 래퍼 객체도 읽기 μ „μš© 객체둜 제곡됨
  • String 객체의 λͺ¨λ“  λ©”μ„œλ“œλŠ” String 래퍼 객체λ₯Ό 직접 λ³€κ²½ λΆˆκ°€λŠ₯
  • String 객체의 λ©”μ„œλ“œλŠ” μ–Έμ œλ‚˜ μƒˆλ‘œμš΄ λ¬Έμžμ—΄μ„ μƒμ„±ν•΄μ„œ λ°˜ν™˜ ν•œλ‹€.

예제 μ½”λ“œ

const strObj = new String("kim");
console.log(Object.getOwnPropertyDescriptors(strObj));
// {
//   '0': { value: 'k', writable: false, enumerable: true, configurable: false },
//   '1': { value: 'i', writable: false, enumerable: true, configurable: false },
//   '2': { value: 'm', writable: false, enumerable: true, configurable: false },
// }



String.prototype.indexOf (String λ©”μ„œλ“œ δΈ­)

  • 인수둜 전달받은 λ¬Έμžμ—΄μ„ κ²€μƒ‰ν•΄μ„œ 첫번째 λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
    • 검색 μ‹€νŒ¨μ‹œ -1
    • index.of λ©”μ„œλ“œμ˜ 2번째 인수둜 검색을 μ‹œμž‘ν•  인덱슀 전달 κ°€λŠ₯
    • image
  • λŒ€μƒ λ¬Έμžμ—΄μ— νŠΉμ • λ¬Έμžμ—΄μ΄ μ‘΄μž¬ν•˜λŠ”μ§€ 확인할 λ•Œ μœ μš©ν•˜λ‹€.
const str = "Hello World";

console.log(str.indexOf("l")); // 2

// 2개 이상 λ¬Έμžμ—΄ 검색 κ°€λŠ₯
console.log(str.indexOf("or")); // 7

// μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λ¬Έμžμ—΄ 검색
console.log(str.indexOf("z")); // -1

// 6번째 μΈλ±μŠ€λΆ€ν„° 검색
console.log(str.indexOf("l", 6)); // 9

// ES6 includes λ©”μ„œλ“œ => 가독성 증가
console.log(str.includes("l")); // true



String.prototype.search (String λ©”μ„œλ“œ δΈ­)

  • 인수둜 전달받은 μ •κ·œν‘œν˜„μ‹κ³Ό λ§€μΉ˜ν•˜λŠ” λ¬Έμžμ—΄μ„ κ²€μƒ‰ν•˜μ—¬ μΌμΉ˜ν•˜λŠ” λ¬Έμžμ—΄ 인덱슀λ₯Ό λ°˜ν™˜
    • 검색 μ‹€νŒ¨ μ‹œ -1

μ˜ˆμ‹œ μ½”λ“œ

const str = "Hello World";

console.log(str.search(/o/)); // 4
console.log(str.search(/z/)); // -1



String.prototype.includes (String λ©”μ„œλ“œ δΈ­)

  • λ¬Έμžμ—΄μ— 인수둜 전달받은 λ¬Έμžμ—΄μ΄ 포함 λ˜μ–΄μžˆλŠ”μ§€ 확인 ν›„ boolean으둜 λ°˜ν™˜
  • λ©”μ„œλ“œμ˜ 2번째 인수둜 검색을 μ‹œμž‘ν•  인덱슀 전달 κ°€λŠ₯
    • image

μ˜ˆμ‹œ μ½”λ“œ

const str = "Hello World";

console.log(str.includes("World")); // true
console.log(str.includes("")); // true
console.log(str.includes("z")); // false
console.log(str.includes()); // false



String.prototype.startsWith (String λ©”μ„œλ“œ δΈ­)

  • λŒ€μƒ λ¬Έμžμ—΄μ΄ 인수둜 전달받은 λ¬Έμžμ—΄λ‘œ μ‹œμž‘ν•˜λŠ”μ§€ 확인 ν›„ boolean λ°˜ν™˜
  • λ©”μ„œλ“œμ˜ 2번째 인수둜 검색을 μ‹œμž‘ν•  인덱슀 전달 κ°€λŠ₯
    • image

μ˜ˆμ‹œ μ½”λ“œ

const str = "Hello World";

console.log(str.startsWith("Hell")); // true
console.log(str.startsWith("")); // true
console.log(str.startsWith("z")); // false
console.log(str.startsWith()); // false



String.prototype.endsWith (String λ©”μ„œλ“œ δΈ­)

  • λŒ€μƒ λ¬Έμžμ—΄μ΄ 인수둜 전달받은 λ¬Έμžμ—΄λ‘œ λλ‚˜λŠ”μ§€ 확인 ν›„ boolean λ°˜ν™˜
    • λ©”μ„œλ“œμ˜ 2번째 인수둜 검색할 λ¬Έμžμ—΄μ˜ 길이 전달 κ°€λŠ₯

μ˜ˆμ‹œ μ½”λ“œ

const str = "Hello World";

console.log(str.endsWith("rld")); // true
console.log(str.endsWith("")); // true
console.log(str.endsWith("z")); // false
console.log(str.endsWith()); // false



String.prototype.charAt (String λ©”μ„œλ“œ δΈ­)

  • λŒ€μƒ λ¬Έμžμ—΄μ—μ„œ 인수둜 전달받은 μΈλ±μŠ€μ— μœ„μΉ˜ν•œ 문자λ₯Ό κ²€μƒ‰ν•΄μ„œ ``ν•œλ‹€.
    • 인덱슀의 λ¬Έμžμ—΄ λ²”μœ„ : 0 ~ (λ¬Έμžμ—΄ 길이-1)
    • μΈλ±μŠ€κ°€ λ¬Έμžμ—΄μ˜ λ²”μœ„λ₯Ό λ²—μ–΄ 났을 λ•Œ : 빈 λ¬Έμžμ—΄ λ°˜ν™˜

μ˜ˆμ‹œ μ½”λ“œ

const str = "Hello World";

console.log(str.charAt(4)); // o
console.log(str.charAt(0)); // H
console.log(str.charAt(-1)); //
console.log(str.charAt(1000)); //



String.prototype.substring (String λ©”μ„œλ“œ δΈ­)

  • λŒ€μƒ λ¬Έμžμ—΄μ—μ„œ 첫 번째 인수둜 전달받은 인덱슀 -> 두 번째 인수둜 전달받은 μΈλ±μŠ€μ— μœ„μΉ˜ν•˜λŠ” 문자의 λ°”λ‘œ μ΄μ „κΉŒμ§€μ˜ λ¬Έμžμ—΄ λ°˜ν™˜
  • image

  • 두 번째 μΈμˆ˜λŠ” μƒλž΅ κ°€λŠ₯

    • image
  • μ „λ‹¬ν•˜λŠ” μΈμˆ˜μ— λŒ€ν•΄ λ‹€μŒκ³Ό 같은 νŠΉμ§•μ΄ 쑴재

    • 첫 번째 인수 > 두 번째 인수 : 두 μΈμˆ˜λŠ” κ΅ν™˜
    • 인수 < 0 or NaN : 0으둜 μ·¨κΈ‰
    • 인수 > 전체 λ¬Έμžμ—΄ 길이 : μΈμˆ˜λŠ” 전체 λ¬Έμžμ—΄ 길이둜 μ·¨κΈ‰



String.prototype.slice (String λ©”μ„œλ“œ δΈ­)

  • substringλ©”μ„œλ“œμ™€ λ™μΌν•˜κ²Œ λ™μž‘ν•¨
  • sliceλŠ” 음수인 인수λ₯Ό 전달 κ°€λŠ₯ν•˜λ‹€.
    • 음수인 인수λ₯Ό μ „λ‹¬ν•˜λ©΄ λŒ€μƒ λ¬Έμžμ—΄μ˜ κ°€μž₯ λ’€μ—μ„œ λΆ€ν„° μ‹œμž‘ν•˜μ—¬ λ¬Έμžμ—΄μ„ μž˜λΌλ‚΄μ–΄ λ°˜ν™˜ν•œλ‹€.

μ˜ˆμ‹œ μ½”λ“œ

const str = "hello world";

//substring slice λ©”μ„œλ“œμ™€ λ™μΌν•˜κ²Œ μž‘λ™
//0번째 λΆ€ν„° 5번째 이전 λ¬ΈμžκΉŒμ§€ μž˜λΌλ‚΄μ–΄ λ°˜ν™˜
str.substring(0, 5); // 'hello'
str.slice(0, 5); // 'hello'

//인수 < 0 or NaN인 경우 0으둜 μ·¨κΈ‰ν•œλ‹€
str.substring(-5); // 'hello world'
//slice λ©”μ„œλ“œλŠ” 음수인 인수λ₯Ό 전달할 수 μžˆλ‹€. λ’€μ—μ„œ 5자기λ₯Ό μž˜λΌλ‚΄μ–΄ λ°˜ν™˜ν•œλ‹€.
str.slice(-5); // 'world'



String.prototype.toUpperCase (String λ©”μ„œλ“œ δΈ­)

  • λŒ€μƒ λ¬Έμžμ—΄μ„ λͺ¨λ‘ λŒ€λ¬Έμžλ‘œ λ³€κ²½ν•΄μ„œ λ°˜ν™˜

μ˜ˆμ‹œ μ½”λ“œ

const str = "Hello World";

console.log(str.toUpperCase()); // HELLO WORLD



String.prototype.toLowerCase (String λ©”μ„œλ“œ δΈ­)

  • λŒ€μƒ λ¬Έμžμ—΄μ„ λͺ¨λ‘ μ†Œλ¬Έμžλ‘œ λ³€κ²½ν•΄μ„œ λ°˜ν™˜

μ˜ˆμ‹œ μ½”λ“œ

const str = "Hello World";

console.log(str.toLowerCase()); // hello world



String.prototype.trim (String λ©”μ„œλ“œ δΈ­)

  • λŒ€μƒ λ¬Έμžμ—΄ μ•žλ’€μ— κ³΅λ°±λ¬Έμžκ°€ μžˆμ„ 겨우 이λ₯Ό 제거 ν›„ λ¬Έμžμ—΄ λ°˜ν™˜

μ˜ˆμ‹œ μ½”λ“œ

const str = "   Hello World          ";

console.log(str.trim()); // Hello World
console.log(str.trimRight()); //    Hello World
console.log(str.trimLeft()); // Hello World
console.log(str.trimStart()); // Hello World
console.log(str.trimEnd()); //   Hello World



String.prototype.repeat (String λ©”μ„œλ“œ δΈ­)

  • 인수둜 전달받은 μ •μˆ˜λ§ŒνΌ λ°˜λ³΅ν•΄ μ—°κ²°ν•œ μƒˆλ‘œμš΄ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•œλ‹€.
    • 인수 0 : λΉˆλ¬Έμžμ—΄ λ°˜ν™˜
    • 인수 < 0 : RangeError λ°œμƒ
    • 인수 μƒλž΅ : κΈ°λ³Έκ°’ 0 이 λœλ‹€.

μ˜ˆμ‹œ μ½”λ“œ

const str = "Hello ";

console.log(str.repeat()); //
console.log(str.repeat(2)); // Hello Hello
console.log(str.repeat(0)); //
console.log(str.repeat(2.5)); // Hello Hello
console.log(str.repeat(-2)); // RangeError: Invalid count value



String.prototype.replace (String λ©”μ„œλ“œ δΈ­)

  • 첫번째 인수둜 전달 받은 λ¬Έμžμ—΄ or μ •κ·œν‘œν˜„μ‹μ„ κ²€μƒ‰ν•˜μ—¬ 두 번째 μ „λ‹¬ν•œ λ¬Έμžμ—΄λ‘œ μΉ˜ν™˜
    • μ—¬λŸ¬ λ¬Έμžμ—΄μ΄ μ‘΄μž¬ν•  경우 첫번째둜 κ²€μƒ‰λœ λ¬Έμžμ—΄λ§Œ μΉ˜ν™˜λœλ‹€.

예제 μ½”λ“œ

const str = "Hello World";

console.log(str.replace("World", "word")); // Hello word
console.log(str.replace(/^hello/i, "Hell")); // Hell World

  • λ‘λ²ˆμ§Έ 인수둜 μΉ˜ν™˜ ν•¨μˆ˜ 전달 κ°€λŠ₯ν•˜λ‹€
  • λ§€μΉ˜λ˜μ–΄ μΉ˜ν™˜λœ κ²°κ³Όλ₯Ό 두 번째 인수둜 μ „λ‹¬ν•œ μΉ˜ν™˜ ν•¨μˆ˜μ˜ 인수둜 μ „λ‹¬ν•˜λ©΄μ„œ ν˜ΈμΆœν•˜κ³  μΉ˜ν™˜ ν•¨μˆ˜κ°€ λ°˜ν™˜ν•œ 결과와 맀치 κ²°κ³Όλ₯Ό μΉ˜ν™˜

예제 μ½”λ“œ

// String.prototype.replace μΉ˜ν™˜ ν•¨μˆ˜ 적용 예

// 카멜 μΌ€μ΄μŠ€ -> μŠ€λ„€μ΄ν¬ μΌ€μ΄μŠ€λ‘œ
function camelToSnake(camelCase) {
  return camelCase.replace(/.[A-Z]/g, (match) => {
    console.log(match); // oW
    return match[0] + "_" + match[1].toLowerCase();
  });
}

const camelCase = "helloWorld";
console.log(camelToSnake(camelCase)); // helloWorld

// μŠ€λ„€μ΄ν¬ μΌ€μ΄μŠ€ -> 카멜 μΌ€μ΄μŠ€λ‘œ
function snakeToCamel(snakeCase) {
  return snakeCase.replace(/_[a-z]/g, (match) => {
    console.log(match); // _w
    return match[1].toUpperCase();
  });
}

const snakeCase = "hello_world";
console.log(snakeToCamel(snakeCase)); // hello_world



String.prototype.split (String λ©”μ„œλ“œ δΈ­)

  • 첫 번째 인수둜 μ „λ‹¬ν•œ λ¬Έμžμ—΄ or μ •κ·œ ν‘œν˜„μ‹μ„ κ²€μƒ‰ν•΄μ„œ λ¬Έμžμ—΄μ„ κ΅¬λΆ„ν•œ ν›„ λΆ„λ¦¬λœ 각 λ¬Έμžμ—΄λ‘œ 이루어진 배열을 λ°˜ν™˜ν•œλ‹€.
    • λΉˆλ¬Έμžμ—΄ 전달 : 문자λ₯Ό λͺ¨λ‘ 뢄리
    • 인수λ₯Ό μƒλž΅ : λŒ€μƒ λ¬Έμžμ—΄ 전체λ₯Ό 단일 μš”μ†Œλ‘œ ν•˜λŠ” λ°°μ—΄ λ°˜ν™˜
    • 두 번째 인수둜 λ°°μ—΄μ˜ 길이λ₯Ό 지정할 수 μžˆλ‹€. λ°°μ—΄μ˜ 길이가 κΈΈλ©΄ 잘림
      • image

예제 μ½”λ“œ

const str = "How are you doing?";

console.log(str.split(" ")); // [ 'How', 'are', 'you', 'doing?' ]
console.log(str.split(/\s/)); // [ 'How', 'are', 'you', 'doing?' ]
console.log(str.split("")); // ["H", "o", "w", " ", "a", "r", "e", " ", "y", "o", "u", " ", "d", "o", "i", "n", "g", "?"]
console.log(str.split()); // [ 'How are you doing?' ]










Symbol πŸŽ―πŸ’‘πŸ”₯πŸ“Œβœ…

  • λ³€κ²½ λΆˆκ°€λŠ₯ν•œ μ›μ‹œ νƒ€μž…μ˜ κ°’
  • λ‹€λ₯Έ κ°’κ³Ό μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” 유일 λ¬΄μ˜ν•œ κ°’
  • μ΄λ¦„μ˜ 좩돌 μœ„ν—˜μ΄ μ—†λŠ” μœ μΌν•œ ν”„λ‘œνΌν‹° ν‚€λ₯Ό λ§Œλ“€κΈ° μœ„ν•΄ μ‚¬μš©




Symbolκ°’μ˜ 생성

  • μƒμ„±μž ν•¨μˆ˜κ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— new μ‚¬μš© μ‹œ : TypeError λ°œμƒ

  • Symbol ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•΄μ„œ μƒμ„±ν•œλ‹€. (λ¦¬ν„°λŸ΄ ν‘œκΈ°λ²•μœΌλ‘œ 생성 λΆˆκ°€λŠ₯)

    • μ΄λ•Œ μƒμ„±λœ Symbol 값은 μ™ΈλΆ€λ‘œ λ…ΈμΆœλ˜μ§€ μ•Šμ•„ 확인 ν•  수 μ—†κ³ , λ‹€λ₯Έ κ°’κ³Ό μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μœ μΌλ¬΄μ΄ν•œ 값이닀.

μ˜ˆμ‹œ μ½”λ“œ (Symbol κ°’ ν™•μ•ˆ λΆˆκ°€)

// μ‹¬λ²Œ κ°’ 생성 - Symbol ν•¨μˆ˜
const symbol = Symbol();
console.log(typeof symbol); // symbol

// μ‹¬λ²Œ 값은 μ™ΈλΆ€λ‘œ λ…ΈμΆœλ˜μ§€ μ•Šμ•„ 확인 λΆˆκ°€
console.log(symbol); // Symbol()

  • Symbol ν•¨μˆ˜μ—λŠ” μ„ νƒμ μœΌλ‘œ λ¬Έμžμ—΄ 인수 전달 κ°€λŠ₯
    • μ„€λͺ…(디버깅) μš©λ„λ‘œλ§Œ ν™œμš©λ˜λ©°, Symbol ν•¨μˆ˜μ— μ „λ‹¬λœ μΈμˆ˜κ°€ 같더라도 Symbol은 항상 μœ μΌλ¬΄μ΄ν•œ 값이닀.

μ˜ˆμ‹œ μ½”λ“œ (Symbol ν•¨μˆ˜μ— 문자 전달)

const symbol1 = Symbol("symbol1");
const symbol2 = Symbol("symbol1");

console.log(symbol1 === symbol2); // false
console.log(symbol1.description === symbol2.description); // true
console.log(symbol1, symbol2); // Symbol(symbol1) Symbol(symbol1)

  • Symbol값도 객체 처럼(.) μ ‘κ·Ό μ‹œ μ•”λ¬΅μ μœΌλ‘œ 래퍼 객체 μƒμ„±ν•œλ‹€.

μ˜ˆμ‹œ μ½”λ“œ (Symbol 래퍼 객체)

const mySymbol = Symbol("mySymbol");

// μ‹¬λ²Œ 값도 객체처럼 μ‚¬μš© μ‹œ 래퍼 객체λ₯Ό 생성
console.log(mySymbol.description); // mySymbol
console.log(mySymbol.toString()); // Symbol(mySymbol)

  • Symbol값은 μ•”λ¬΅μ μœΌλ‘œ 숫자 νƒ€μž…, λ¬Έμžμ—΄λ‘œ λ³€ν™˜λ˜μ§€ μ•ŠλŠ”λ‹€.
    • booleanμœΌλ‘œλŠ” 암묡적 νƒ€μž… λ³€ν™˜λœλ‹€.

μ˜ˆμ‹œ μ½”λ“œ (Symbol 암묡적 νƒ€μž… λ³€ν™˜)

const mySymbol = Symbol();

console.log(!!mySymbol); // true
console.log(mySymbol + ""); // TypeError: Cannot convert a Symbol value to a string



Symbol.for / Symbol.keyfor λ©”μ„œλ“œ

πŸ’‘ 인수둜 전달받은 λ¬Έμžμ—΄μ„ ν‚€λ‘œ μ‚¬μš©ν•˜μ—¬ { ν‚€ : μ‹¬λ²Œ κ°’ }의 μŒλ“€μ΄ μ €μž₯λ˜μ–΄ μžˆλŠ” μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬μ—μ„œ ν•΄λ‹Ή 킀와 μΌμΉ˜ν•˜λŠ” μ‹¬λ²Œ 값을 검색

πŸ’‘ Symbol.keyFor λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•΄μ„œ μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬μ— μ €μž₯된 μ‹¬λ²Œ κ°’μ˜ ν‚€λ₯Ό μΆ”μΆœν•  수 μžˆλ‹€.
  • 인수둜 전달 받은 λ¬Έμžμ—΄μ„ ν‚€λ‘œ μ‚¬μš©ν•˜μ—¬ 킀와 μ‹¬λ²Œ κ°’μ˜ μŒλ“€μ΄ μ €μž₯λ˜μ–΄ μžˆλŠ” μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬μ—μ„œ ν•΄λ‹Ή 킀와 μΌμΉ˜ν•˜λŠ” μ‹¬λ²Œκ°’ κ²€μƒ‰ν•œλ‹€.

    • 검색 성곡 : κ²€μƒ‰λœ μ‹¬λ²Œ κ°’ λ°˜ν™˜ν•œλ‹€.
    • 검색 μ‹€νŒ¨ : μƒˆλ‘œμš΄ μ‹¬λ²Œ 값을 생성 ν›„ Symbol.for λ©”μ„œλ“œμ˜ 인수둜 μ „λ‹¬λœ ν‚€λ‘œ μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬μ— μ €μž₯ 된 ν›„ , μƒμ„±λœ μ‹¬λ²Œκ°’ λ°˜ν™˜


  • Symbol.for λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ μ „μ—­μ—μ„œ μœ μΌλ¬΄μ΄ν•œ μ‹¬λ²Œ 값을 단 ν•˜λ‚˜λ§Œ μƒμ„±ν•˜μ—¬ μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬λ₯Ό 톡해 곡유 κ°€λŠ₯

예제 μ½”λ“œ Symbol.for

const symbol1 = Symbol.for("symbol");
const symbol2 = Symbol.for("symbol");

// μƒλ‹¨μ—μ„œ symbol μ΄λ¦„μ˜ μ‹¬λ²Œ 값을 symbol1 μƒμ„±μ‹œ 이미 μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬μ— λ“±λ‘ν–ˆλ‹€.
// symbol2 μ—μ„œ Symbol.for ν˜ΈμΆœν•  경우, 이미 μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬μ—λŠ” symbol μ΄λΌλŠ” 이름을 ν‚€λ‘œ κ°€μ§€λŠ” μ‹¬λ²Œ 값이 μ‘΄μž¬ν•œλ‹€.
// λ”°λΌμ„œ, symbol1 κ³Ό symbol2 에 ν• λ‹Ήλœ μ‹¬λ²Œ 값은 같은 μ‹¬λ²Œ 값이닀.
console.log(symbol1 === symbol2); // true

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

    예제 μ½”λ“œ Symbol.keyfor

// Symbol.for λ©”μ„œλ“œλ‘€ μƒμ„±λœ μ‹¬λ²Œ 값은 μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬μ— μ‘΄μž¬ν•˜μ§€ μ•Šμ„ 경우 생성 ν›„ λ“±λ‘λ˜μ–΄ κ΄€λ¦¬λœλ‹€.
const symbol1 = Symbol.for("symbol1");
console.log(Symbol.keyFor(symbol1)); // symbol1

// Symbol ν•¨μˆ˜λ‘œ μƒμ„±ν•œ μ‹¬λ²Œ 값은 μ „μ—­ μ‹¬λ²Œ λ ˆμ§€μŠ€νŠΈλ¦¬μ— λ“±λ‘λ˜μ–΄ κ΄€λ¦¬λ˜μ§€ μ•ŠλŠ”λ‹€.
const symbol2 = Symbol("symbol2");
console.log(Symbol.keyFor(symbol2)); // undefined




Symbol κ³Ό μƒμˆ˜

  • κ°’μ—λŠ” νŠΉλ³„ν•œ μ˜λ―Έκ°€ μ—†κ³  μƒμˆ˜ 이름 μžμ²΄μ— μ˜λ―Έκ°€ μžˆλŠ” 경우
    • λ‹€λ₯Έ λ³€μˆ˜ κ°’κ³Ό 쀑볡될 수 도 μžˆλ‹€.
  • λ³€κ²½/쀑볡될 κ°€λŠ₯μ„± μžˆλŠ” λ¬΄μ˜λ―Έν•œ μƒμˆ˜
    • 쀑볡될 κ°€λŠ₯성이 μ—†λŠ” μœ μΌλ¬΄μ΄ν•œ μ‹¬λ²Œ 값을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŒ

예제 μ½”λ“œ

// { ν‚€: κ°’(μƒμˆ˜) } ν˜•νƒœλ‘œ 4λ°©ν–₯을 μ˜λ―Έν•˜λŠ” Direction 객체
// 1,2,3,4 λΌλŠ” μƒμˆ˜λŠ” νŠΉλ³„ν•œ μ˜λ―Έλ„ μ—†κ³ , 이후 λ‹€λ₯Έ λ³€μˆ˜μ— κ°’κ³Ό 쀑볡될 κ°€λŠ₯성이 크닀.
const Direction = {
  UP: 1,
  DOWN: 2,
  LEFT: 3,
  RIGHT: 4,
};

// { ν‚€ : κ°’(μ‹¬λ²Œ κ°’) } ν˜•νƒœλ‘œ λ³€κ²½ν•œ Direction 객체
// ν‚€μ˜ 값듀이 μ‹¬λ²Œ κ°’μœΌλ‘œ, 쀑볡될 κ°€λŠ₯성이 μ—†λŠ” μƒμˆ˜ 값이 λ˜μ—ˆλ‹€.
const Direction = {
  UP: Symbol("up"),
  DOWN: Symbol("down"),
  LEFT: Symbol("left"),
  RIGHT: Symbol("right"),
};




Symbolκ³Ό ν”„λ‘œνΌν‹° ν‚€

  • 유일 λ¬΄μ˜ν•œ ν”„λ‘œνΌν‹° ν‚€κ°’ 생성가λŠ₯
    • for...in, Objects.keys λ©”μ„œλ“œλ‘œ 찾을 수 μ—†μ–΄μ„œ ν”„λ‘œνΌν‹°λ₯Ό 은닉할 수 μžˆλ‹€.
  • 객체의 ν”„λ‘œνΌν‹° ν‚€λŠ” 빈 λ¬Έμžμ—΄μ„ ν¬ν•¨ν•˜λŠ” λͺ¨λ“  λ¬Έμžμ—΄ λ˜λŠ” μ‹¬λ²Œ κ°’μœΌλ‘œ λ§Œλ“€ 수 μžˆλ‹€.
    • μ‹¬λ²Œ 값을 ν”„λ‘œνΌν‹° ν‚€λ‘œ μ‚¬μš©ν•˜λ €λ©΄ ν”„λ‘œνΌν‹° ν‚€λ‘œ μ‚¬μš©ν•  μ‹¬λ²Œ 값에 λŒ€κ΄„ν˜Έλ₯Ό μ‚¬μš© ν•΄μ•Ό ν•œλ‹€.

μ˜ˆμ œμ½”λ“œ

// μ‹¬λ²Œμ€ μœ μΌλ¬΄μ΄ν•œ κ°’μœΌλ‘œ μ‹¬λ²Œ κ°’μœΌλ‘œ ν”„λ‘œνΌν‹° ν‚€λ₯Ό λ§Œλ“€λ©΄ λ‹€λ₯Έ ν”„λ‘œνΌν‹° 킀와 μ ˆλŒ€ μΆ©λŒν•˜μ§€ μ•ŠλŠ”λ‹€.
const obj = {
  [Symbol.for("mySymbol")]: 1,
};
obj[Symbol.for("mySymbol")];




Symbol κ³Ό 빌트인 객체 ν™•μž₯

πŸ’‘ 일반적으둜 ν‘œμ€€ 빌트인 객체에 μ‚¬μš©μž μ •μ˜ λ©”μ„œλ“œλ₯Ό 직접 μΆ”κ°€ν•˜λŠ” 것은 ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. (미래의 ν‘œμ€€ 사양 λ©”μ„œλ“œμ™€ 쀑볡될 수 있기 λ•Œλ¬Έ)

πŸ’‘ ν•˜μ§€λ§Œ, 쀑볡될 κ°€λŠ₯성이 μ—†λŠ” μ‹¬λ²Œ κ°’μœΌλ‘œ ν”„λ‘œνΌν‹° ν‚€ 값을 μƒμ„±ν•˜μ—¬ 객체λ₯Ό ν™•μž₯ν•˜λ©΄ μ–΄λ–€ ν”„λ‘œνΌν‹° 킀와도 μΆ©λŒν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— μ•ˆμ „ν•˜κ²Œ ν™•μž₯이 κ°€λŠ₯ν•˜λ‹€.

// Array ν‘œμ€€ 빌트인 객체에 λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ ν™•μž₯ν•˜λŠ” 것 => ꢌμž₯ X
Array.prototype.sum = function () {
  return this.reduce((acc, cur) => acc + cur, 0);
}[(1, 2, 3)].sum(); // 6

// μ‹¬λ²Œ κ°’μœΌλ‘œ ν”„λ‘œνΌν‹° ν‚€λ₯Ό κ°–λŠ” λ©”μ„œλ“œλ‘œ ν™•μž₯ν•˜λŠ” 경우 => ν˜Έν™˜μ„± μΈ‘λ©΄μ—μ„œ O
Array.prototype[Symbol.for("sum")] = function () {
  return this.reduce((acc, cur) => acc + cur, 0);
}[
  // 단, 호좜 μ‹œμ— μ–΄μƒ‰ν•œ 상황이 μ—°μΆœ
  (1, 2, 3)
][Symbol.for("sum")](); // 6




Well-known Symbol


πŸ’‘ μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ κΈ°λ³Έ μ œκ³΅ν•˜λŠ” 빌트인 μ‹¬λ²Œ 값을 ECMAScript μ‚¬μ–‘μ—μ„œλŠ” Well-known Symbol 이라 λΆ€λ₯Έλ‹€. (μžλ°”μŠ€ν¬λ¦½νŠΈ λ‚΄λΆ€ μ•Œκ³ λ¦¬μ¦˜μ— μ‚¬μš©λ¨)
  • for - of 문으둜 순회 κ°€λŠ₯ν•œ μ΄ν„°λŸ¬λΈ”μ€ Well-known Symbol 인 Symbol.iteratorλ₯Ό ν‚€λ‘œ κ°–λŠ” λ©”μ„œλ“œλ₯Ό 가진닀.
    • Symbol.iterator λ©”μ„œλ“œλ₯Ό 호좜 β†’ μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ ( μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œ )
  • λ§Œμ•½, 일반 객체λ₯Ό μ΄ν„°λŸ¬λΈ”μ²˜λŸΌ λ™μž‘ν•˜λ„λ‘ κ΅¬ν˜„ν•˜κ³  μ‹Άλ‹€λ©΄ μ΄ν„°λ ˆμ΄μ…˜ ν”„λ‘œν† μ½œμ„ λ”°λ₯΄λ©΄ λœλ‹€.
    • 즉, Symbol.iterator λ₯Ό ν‚€λ‘œ κ°–λŠ” λ©”μ„œλ“œλ₯Ό 객체에 μΆ”κ°€ν•˜κ³  μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•˜λ„λ‘ κ΅¬ν˜„ν•˜λ©΄, κ·Έ 객체λ₯Ό μ΄ν„°λŸ¬λΈ”μ΄ λœλ‹€.

예제 μ½”λ“œ

const iterable = {
  // Symbol.itertor λ©”μ„œλ“œλ₯Ό κ΅¬ν˜„ν•˜μ—¬ μ΄ν„°λŸ¬λΈ” ν”„λ‘œν† μ½œμ„ μ€€μˆ˜
  [Symbol.iterator]() {
    let cur = 1;
    const max = 5;

    // Symbol.iterator λ©”μ„œλ“œλŠ” next λ©”μ„œλ“œλ₯Ό μ†Œμœ ν•œ μ΄ν„°λ ˆμ΄ν„°λ₯Ό λ°˜ν™˜ν•΄μ•Ό ν•œλ‹€.
    return {
      next() {
        return { value: cur++, done: cur > max + 1 };
      },
    };
  },
};

for (const num of iterable) {
  console.log(num); // 1 2 3 4 5
}