Symbol

심볼은 ES2015에서 도입된 새로운 원시 타입입니다.

Symbol 내장 함수를 통해 새 심볼을 생성할 수 있습니다.

const sym = Symbol();
console.log(typeof sym); // symbol
console.log(sym); // Symbol()

 

Symbol함수에 문자열을 넘겨서, 해당 심볼에 대한 설명을 포함한 심볼을 생성할 수 있습니다.
이 때 넘겨지는 문자열은 그저 심볼의 설명일 뿐이므로, 심볼의 비교 연산에 영향을 주지 않습니다.
즉, 어떤 문자열이 인수열에 들어오는 지와 상관없이 새로 생성된 심볼은 다른 모든 심볼과 다른 것으로 취급됩니다.

console.log(Symbol('my symbol')); // Symbol(my symbol)
console.log(Symbol('my symbol') === Symbol('my symbol')); // false
console.log(Symbol() === Symbol()); // false

 

심볼은 객체의 속성 키로 사용하기로 위해 만들어졌습니다. 아래와 같이 대괄호 표기법을 통해 심볼을 객체의 속성 키로 사용할 수 있습니다.

const mySymbol = Symbol('my symbol');

const obj = {
    [mySymbol]: 'hello'
};

console.log(obj); // { [Symbol(my symbol)]: 'hello' }

 

내장 심볼(well-known symbol)을 객체의 속성 키로 사용하면, 특정 상황에서의 객체의 동작 방식을 마음대로 바꿀 수 있습니다.

  • Symbol.hasInstance : 객체가 instanceof 연산자의 피연산자로 왔을 때의 동작을 바꿉니다.
  • Symbol.isConcatSpreadable : 객체가 Array.prototype.concat 메소드의 인수로 넘겨질 때의 동작을 바꿉니다.
  • Symbol.iterator : 객체가 String.prototype.match 메소드의 인수로 넘겨질 때의 동작을 바꿉니다.
  • Symbol.match : 객체가 String.prototype.match 메소드의 인수로 넘겨질 때의 동작을 바꿉니다.
  • Symbol.replace : 객체가 String.prototype.replace 메소드의 인수로 넘겨질 때의 동작을 바꿉니다.
  • Symbol.search : 객체가 String.prototype.search 메소드의 인수로 넘겨질 때의 동작을 바꿉니다.
  • Symbol.species : Array.prototype을 상속받은 객체에 대해 Array.prototype.map 등의 메세드를 호출할 때, 반환되는 객체의 생성자를 지정합니다.
  • Symbol.split : 객체가 String.prototype.split 메소드의 인수로 넘겨질 떄의 동작을 바꿉니다.
  • Symbol.toPrimitive : 객체가 원시 타입의 값으로 변환되어야 할 때, 정확히 어떤 값으로 변환되어야 하는 지를 지정합니다.
  • Symbol.toStringTag : Object.prototype.toString() 메소드를 객체에 대해 직접 호출할 때의 동작을 바꿉니다.
  • Symbol.unscopable : with 블록 안에서 어떤 속성을 참조할 수 있는지를 지정합니다.

 

 

내장 객체 및 생성자 · JavaScript로 만나는 세상

No results matching ""

helloworldjavascript.net

 

+ Recent posts