모던자바스크립트 33, 34장 스터디
모던자바스크립트 스터디 15일차이다.
33장 Symbol
34장 Iterable
오늘은 위 단원들을 공부하고 모르는것을 정리했다.
# 궁금증
symbol을 왜 도입한걸까?
# 이유
처음 ES6에 symbol type 도입 배경은 private 속성을 활성화하기 위함이었다고 한다.
근데, Object.getOwnPropertySymbols 으로 proxy를 사용해서 reflection을 통해 private 속성을 찾을 수 있게 되어서 더이상 비공개(private)가 아니게 되었다.
어떤 사람들은 리플렉션을 통해 개인 상태가 누출되는 것은 기능이 아니라 버그로 간주되어야 한다고도 하니, symbol을 사용할 이유가 있을까 한다.
따라서 symbol의 유일한 용도는 속성 간의 이름 충돌을 방지하는 unique id 기능만을 위해 symbol을 사용하는 것이라고 한다.
# 지연평가(lazy evaluation)과 엄격한 평가(strict evaluation)
위 비교 블로그는 아래가 설명이 잘나와있어서 참고.
https://opentogether.tistory.com/72
https://armadillo-dev.github.io/javascript/whit-is-lazy-evaluation/
# lazy evaluation이 유용한 이유
참고로 js는 lazy한 언어가 아니다.
Lazy evaluation은 Haskell에서 주로 사용되는 특징이지만, 다른 언어에서도 비슷한 개념을 지원한다.
Haskell은 non-strict 언어 중 하나이며, lazy evaluation은 이를 구현하는 방법 중 하나이다.
JavaScript은 eager evaluation이 기본 동작이다.
따라서 표현식이 평가될 때 즉시 실행된다.
그러나 JavaScript에서도 Generator와 같은 기능을 사용하여 필요에 따라 lazy한 동작을 모방하여 Lazy evaluation을 나타낼 수 있다.
1. 많은 문법이 필요하지 않다.
2. 작게 쪼개진 기능적인 코드 작성 가능
3. 해당 항목만 선택하는 데 드는 cost에 비례하여 사용한 것만 지불한다는 이점
4. 모나드 코딩하는데 좋은 매커니즘
5. 새로운 제어 구조를 정의하기 좋다.
위 같은 장점 때문에 lazy evaluation을 사용하는 것이라고 한다.
# 참고
https://stackoverflow.com/questions/21724326/what-is-the-motivation-for-bringing-symbols-to-es6
https://stackoverflow.com/questions/265392/why-is-lazy-evaluation-useful