Tip1. const로 변하지 않는 값을 표현하라.
Words
ECMAScript # (ES #)
ES6, ES5같은게 이걸 의미하는 거다. 자바스크립트 기술 명세서. 파이썬으로 치면 PEP517같은 것.
ES5, 6에서 주요한 문법이 변경되었다. 명세는 매년 갱신된다.
사람마다 ES6 혹은 ES2016 으로 부르곤 한다.
Rough Reading
const
를 이용해 재할당을 피하고 우리의 의도를 다른사람들에게 전달하는 방법
모던 자바스크립트에서는 새로운 변수 선언 방법을 제안했다.
-
var
-
let
-
const
-
가장 적은 것을 할 수 있다.
-
그래서 대부분의 경우에는 const가 좋다.
-
코드를 읽기 쉽게 만들어준다.
-
블록 문맥 내에서 재할당 할 수 없는 변수 선언이다.
- 즉 define하면 변경이 안된다.
- 근데 이게 immutable을 뜻하는 건 아니다.
- 무슨 말이냐면 const Arr[3] 이렇게 선언해도 어레이 내의 값을 수정할 수 있다는 것이다.
-
다른 언어에 익숙하면 이런 변수 선언이 추천대상인게 이상할 수 있다.
-
왜냐하면 보통의 언어에서는 상수할당을 대문자 로 그리고, 불변값에 하기 때문.
const int PI=3.14;
-
-
근데 어떤 변수를 신경쓰지 않아도 되는 지를 잘 표현해주면 이후에 코드를 보는 데 편해진다.
-
eg.
// with const
const taxRate = 0.1
const total = 100 + (100 * taxRate)
// 줄 건너 뛰기~
return `구매 금액은 ${total}입니다.`
위 코드에서는 구매 금액 110인 것을 정확하게 알수 있다. 왜냐하면 해당 변수를 const로 선언해 재할당 할 수 없는 것을 보였기 때문. 반면.
// with var
var taxRate = 0.1
var total = 100 + (100 * taxRate)
// 줄 건너 뛰기~
return `구매 금액은 ${total}입니다.`
위 코드는 var를 사용함으로써 재할당 가능함을 보였고 이로 인해 “줄 건너 뛰기” 내에서 해당 값이 변경되었는 지 아닌지를 전부 확인해줘야 결과를 알 수 있다.
// with const & let
const taxRate = 0.1
const shipping = 5.00
let total = 100 + (100 * taxRate) + shippping
// 줄 건너 뛰기~
return `구매 금액은 ${total}입니다.`
위와 같이 코드를 작성한 경우, taxRate와 shipping이 const로 선언되어 재할당 불가함을 보였지만 total은 let으로 선언되어 해당 값이 변동 될 수 있음을 보였다. 고로 total값이 유지되는 지를 확신할 수 없다.
고로 const를 자주 사용해서 유지되는 값을 할당하고, let을 드물게 사용하면 변경되는 부분들을 예측 할 수 있어진다.
주의 해야하는 점은 const는 불변값 할당이 아니다라는 점이다.
eg.
const discountable = []
// skipping
for (let i = 0; i < cart.length; i++) {
if (cart[i].discountAvailable) {
discountable.push(cart[i])
}
}
위와 같은 코드가 있을 때, discountable이 const로 선언되었지만 여전히 배열에 값을 추가할 수 있다.
이런 특징은 앞에서 말한 값의 유지불가라는 문제를 발생시킨다.
그래서 결국 mutation을 피할 수 있으면 피하자 라는 것이 최선이다.
(*람다식 같이 적으면 해결되나 싶은 생각이 들었는데 책 바로 밑에 나온다.)
const discountable = cart.filter(item => item.discountAvailable)
이런식으로 함수형 프로그래밍을 해두면 discountable을 mutate하지 않고 cart.filter(…)의 결과를 바로 할당하니 (물론 바로 할당이라기 보단 promise를 넘겨주게 되겠지만)
Summary
- const를 최대한 사용하자.
- 최대한 값을 immutable하게 하자.
- loop를 돌며 값을 순회해야하는 경우에는 scala에서 공부했던것처럼 functional하게 작성하자.