symbol 원시값
을 반환하는 내장 객체이며 고유함이 보장된다. 심볼은 클로저가 없다 ㅇㅇ
심볼은 객체에 속성을 추가할 때 고유한 키를 부여하여 다른 키와 충돌하지 않도록 할 때 사용되며, 일반적인 방법으로 접근할 수 없어서 약한 형태의 캡슐화, 접근 제어, 정보 은닉을 제공한다.
symbol 원시 값
을 만들때는 Symbol.for(”key”)
를 이용해 사용하는 것이 좋다.
Symbol(”key”)
로 생성하게 되면 고유성을 보장하기 때문에 {} === {} // false 가 나오듯이 각자다른 심볼이 된다. 하지만 Symbol.for(”key”)
호출로 생성하게되면 주어진 key 를 가진 심볼이 전역 심볼 레지스트리에 존재하면 그 심볼을 반환한다. 없으면 새로 생성하고 , 전역 심볼 레지스트리에 등록 한 후, 반환된다.
약간 진짜 고유하고 똑같이 생긴거 없게 생성되는느낌임 Map의 key 느낌?
Symbol("foo") === Symbol("foo"); // false
심볼은 유일하게 참조 동일성(같은 심볼은 두 번 만들 수 없음)을 가지는 원시 데이터 타입이므로 객체와 비슷하게 동작하는 면이 있다. 심볼은 가비지 콜렉션 대상이며 Weaks 객체에 저장할 수 있다.
여러 파일에 걸쳐 혹은 각자 별도의 전역 스코프를 갖는 렐름까지도 걸쳐서 사용 가능한 심볼을 생성하려면 Symbol.for()
메서드와 Symbol.keyFor()
메서드를 사용하여 심볼을 생성하고 가져올 수 있다.
전역 심볼 레지스트리는 설명을 위한 상상의 개념이라하니 참고하도록!
심볼 레지스트리는 for(), keyFor() 메서드를 제외하고는 접근할 수 없다.
Symbol.for(tokenString)
메서드는 문자열 키를 받아 레지스트리에서 심볼 값을 반환한다.
Symbol.keyFor(symbolValue)
메서드는 심볼 값을 받아 대응하는 문자열 키를 반환한다.
Symbol.keyFor(Symbol.for("tokenString")) === "tokenString"; // true
음 .. 한 마디로 Symbol.for()
하면 Symbol(key)
자체가 생성되고, Symbol.keyFor()
하면 Symbol 생성할때 key
로 넣은 값이 나온다.
심볼은 순회에 열거되지 않는다. for… in
불가. Object.getOwnPropertyNames()
도 심볼 객체 속성 반환하지 않는다. 심볼의 속성들을 찾고싶으면 Object.getOwnPropertySymbols()
를 사용한다.
잘 알려진 심볼 에서 정적속성? 메서드? 들을 Symbol로 생성한 것들에 이용하는 것 인줄 알았는데.. 아닌 것 같다. 메서드를 새롭게 정의한다? 라는 식으로 받아들이기 시작했다. iterator 같은경우 어떤 식으로 반복을 할건지 정하는 것 같다.
이터레이션 프로토콜이란 순회 가능한 데이터 컬렉션(자료구조)을 만들기 위해 미리 약속한 규칙이다.
이터레이션 프로토콜에는 이터러블 프로토콜과 이터레이터 프로토콜이 있다.
Symbol.iterator
를 프로퍼티 키로 사용한 메서드를 직접 구현하거나 프로토타입 체인을 통해 상속받은 Symbol.iterator
를 실행하면 이터레이터 프로토콜을 준수한 이터레이터를 반환한다. 이 규칙을 이터러블 프로토콜이라 하며 이터러블 프로토콜 규칙을 준수한 객체를 이터러블이라 한다.
이터러블의 Symbol.iterator
메서드를 호출하면 이터레이터 프로토콜을 준수한 이터레이터를 반환한다. 이터레이터는 next
메서드를 소유하며 호출하면 이터러블을 순회하며 iteratorReulst = value, done
프로퍼티를 갖는 이터러블 리절트 객체를 반환한다. 이 규약을 이터레이터 프로토콜이라하고 이터레이터 프로토콜을 준수한 객체를 이터레이터라 한다.
심볼 생성자의 정적속성은 모두 스스로가 심볼이다. 이 심볼들을 잘 알려진 심볼이라 부르고, 자바스크립트 내장 작업에 일종의 “프로토콜” 로서 동작한다. 이 심볼들로 언어 동작을 바꿀 수 있다.
잘 알려진 심볼에는 가비지 콜렉션 가능 여부 라는 개념 자체가 존재하지 않는다.
우리가 사용하고 있는 for…of
, match
등 메서드들은 Symbol로서 동작하는 것이다. ( o? , x? )
잘 알려진 심볼이란 음 .. 현재 순회 메서드 중 for..of 메서드는 이터러블 객체에 사용되어지는데 이 메서드는 내부적? 프로토타입? 적으로 Symbol.iterator
이라는 심볼 값을 프로퍼티? 키? 로 가지고 있다 이렇게 Symbol.iterator
심볼을 가지고 있는 객체? 를 이터러블 이라 할 수 있다. - 1차 생각
2차 생각 - for…of 로 순회할 수 있으면 이터러블이다. 이터러블은 이터러블 프로토콜 준수한거고.. 이터레이터 프로토콜도 준수한거같은데 음 .. 그럼 둘 다 ㅇㅋ