symbol

MDN 설명을 참고하면 심볼은 고유하고 수정 불가능한 데이터 타입이며 주로 객체 속성의 식별자로 사용한다고 합니다. https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Symbol

A symbol is a unique and immutable data type and may be used as an identifier for object properties.

그래서 이걸 어떻게 쓰는 건지는 잘 모르겠고요. ㅠㅠ 간단한 예제로 개념만 살펴봅니다.

if(true){
    let a = Symbol('test');
    console.log(typeof a == 'symbol'); //true
    let b = Symbol('test');
    console.log(a==b); //false

    let c = Symbol.for('test');
    let d = Symbol.for('test');
    console.log(c==d); //true

    let e = new Symbol(); //Uncaught TypeError: Symbol is not a constructor
}

Symbol(...)은 매번 새로운 심볼을 생성합니다. 그렇기 때문에 ab를 비교하면 서로 같지 않다고 처리합니다. 대신 Symbol.for(...)을 사용하는 경우에는 처음 새로운 심볼을 생성하고 두 번째 같은 key값으로 생성된 심볼은 새로 만드는 것이 아니라 기존 심볼값을 가져와 사용한다고 합니다. https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Symbol/for

ES6에서는 명시적 래퍼 객체를 만드는 것이 지원되지 않는다고 합니다. 다만 new Boolean, new String같은 것은 기존 레거시 지원때문에 사용할 수 있다고 하네요.

이건 뭐였지

예제는 기억나는데 어떤 설명이었는지 명확하지가 않네요. 일단 뭐 아래와 같은 식입니다. 나중에 생각나면 추가해보죠.

if(true){
    let obj = {
      ['a']:3,
    [[1,2,3]]:5
  };
  console.log(obj.a); //3
  console.log(obj['1,2,3']); //5
}

if(true){
    let c = Symbol();
  let d = Symbol();
  let obj = {
      [c]:3,
    [d]:5
  };
  console.log(obj[c]); //3
  console.log(obj[d]); //5
}