유지보수 가능한 코드란 다음과 같은 특징을 지닌다.
- 읽기 쉽다.
- 일관적이다.
- 예측 가능하다.
- 한 사람이 작성한 것처럼 보인다.
- 문서화되어 있다.
단일 선언 패턴
함수 상단에서 let, const 선언을 한 번만 쓰는 패턴은 다음과 같은 이점들이 있다.
- 함수에서 필요로 하는 모든 지역 변수를 한군데서 찾을 수 있다.
- 변수를 선언하기 전에 사용할 때 발생하는 로직상의 오류를 막아준다.
단점은 디버깅할 때 선언부의 변수에 접근하기 어렵다.
function fun() {
let a = 1,
b = {},
c = a + 3,
i;
//함수 본문
}
for 루프
//최적화되지 않은 푸르
for (let i = 0; i < arr.length; i++) {
//arr[i] ..
}
이 패턴의 문제점은 루프순회마다 배열의 length에 접근한다는 점이다. arr가 평범한 배열이면 괜찮을 수도 있지만, DOM접근이 필요한 배열이라면 상당한 비용이 발생한다.
아래와 같이 배열의 length를 캐시하자.
for (let i = 0, max = arr.length; i < max; i++) {
//arr[i] ..
}
for-in 루프
for-in 루프는 객체를 순회할 때 사용하는데, for-in으로 루프를 도는 것을 열거(enumeration)라고도 한다. for-in에서는 프로퍼티를 열거하는 순서가 정해져있지 않으므로 유의하자.
객체의 프로퍼티를 순회할 때는 프로토타입 체인을 따라 상속되는 프로퍼티들을 걸러내기 위해 hasOwnProperty()메서드를 사용해야한다.
오로지 자신의 property만 나올 수 있도록, 즉, prototype의 property를 걸러내도록 꼭 사용해야한다는 의미이다.
let man = {
hands: 2,
legs: 2,
haed: 1
};
for (let i in man) {
if (man.hasOwnProperty(i)) {
//내용
}
}
parseInt()를 통한 숫자 변환
parseInt()를 사용해서 문자열 -> 숫자로 변환하는 경우, 두 번째 인자에 꼭 기수를 넘겨줄 것! 두 번째 인자인 기수(radix, 진수)의 default 값이 10이 아니므로, 명확하게 꼭 써줘야 한다.
그 외..
- 전역 변수 최소화
- 암묵적 type casting 피하기 (== 말고 === 사용)
- 코드 작성 규칙 준수(공백, 들여쓰기, 중괄호, 세미콜론, 명명 규칙)