# :computer: Javascript 코딩 컨벤션
## 코딩 컨벤션
### 명명규칙
#### 파일명
- 기본: camel case(전부 소문자)
- 리액트 컴포넌트 파일 및 폴더: `PascalCase`
#### 네이밍
- 의미가 없거나 약어가 모호한 것은 쓰지 말자. ex) err, pc는 x
- (지역 변수 or private 변수)명은 '_'로 시작한다.
- URL, HTML 같은 범용적인 대문자 약어는 대문자 그대로 사용한다.
#### 식별자 유형별 규칙
- Pacakage names : `lowerCamelCase`
- Method names : `lowerCamelCase`
- Class names : `UpperCamelCase`
- Constant names ( 상수 ) : `CONSTANT_CASE`
### 들여쓰기
- space 2번으로 들여쓰기를 한다.
### 문장의 종료
- 한 줄에 하나의 문장만 허용하며, 문장 종료 시에는 반드시 세미콜론(;)을 사용한다.
### 전역 변수
- 암묵적 전역 변수를 사용하지 않는다. (최대한 지양하자)
### 선언과 할당
#### 변수
- 값이 변하지 않는 변수는 const를, 값이 변하는 변수는 let을 사용하여 선언한다. var는 절대로 사용하지 않도록 한다.
- const를 let 보다 위에 선언한다.
- const와 let은 사용 시점에 선언 및 할당을 한다.
- 외부 모듈과 내부 모듈을 구분하여 사용한다.
```js
const lodash = require('lodash');
const $ = require(jquery);
const handlebars = require('handlebars');
const d3 = require('d3');
const pluginFactory from '../../factories/pluginFactory';
const predicate from '../../helpers/predicate';
const raphaelRenderUtil from '../../plugins/raphaelRenderUtil';
```
#### 배열과 객체
- 배열과 객체는 리터럴로 선언한다.
```js
// Bad
const emptyArr = new Array();
const arr = new Array(1, 2, 3, 4, 5);
// Bad - 객체 생성자 사용
const emptyObj = new Object();
const obj = new Object();
// Good
const emptyArr = [];
const arr = [1, 2, 3, 4, 5];
// Good
const emptyObj = {};
const obj = {
pro1: 'val1',
pro2: 'val2'
};
```
- 배열 복사 시 spread 연산자를 적극 사용한다.
```js
const len = items.length;
let i;
// Bad
for (i = 0; i < len; i++) {
itemsCopy[i] = items[i];
}
// Good
const itemsCopy = [...items];
```
- 배열의 요소중 하나라도 줄 바꿈이 있다면 배열 안의 요소는 일관되게 모두 줄 바꿈을 해주어야 한다.
- 객체의 프로퍼티가 1개인 경우에만 한 줄 정의를 허용하며, 3개 이상일 경우에는 개행을 권장한다.
- 객체의 메서드 표현 시 축약 메소드 표기를 사용한다.
```js
// Bad
const atom = {
value: 1,
addValue: function(value) {
return atom.value + value;
}
};
// Good
const atom = {
value: 1,
addValue(value) {
return atom.value + value;
}
};
```
- 메서드 문법 사용 시 메서드 사이에 개행을 추가한다.
#### 함수
- 함수 생성자를 사용하여 선언하지 않고, 함수는 함수 표현식으로 선언한다.
- 함수는 사용 전에 선언해야 하며, 함수 선언문은 변수 선언문 다음에 오도록 한다.
#### 화살표 함수
- arrow function의 매개변수는 1개여도 괄호를 사용한다.
- 함수 표현식 대신 화살표 함수를 사용한다.
- 암시적 반환을 최대한 활용한다.
- 암시적 반환을 사용할 경우 함수 본문 전에 개행을 하지 않는다.
```javascript=
// good
const calMax = (a,b) => max(a,b)
```
#### Destructuring
- 오브젝트의 프로퍼티에 접근할 때는 Destructuring을 이용한다.
#### 템플릿 문자열
- 변수 등을 조합해서 문자열을 생성하는 경우 템플릿 문자열(백틱)을 이용한다.
### 클래스와 생성자
- class와 extends를 이용해서 객체 생성 및 상속을 구현한다.
- 필요한 생성자는 우선적으로 선언해둔다. (초기 값이 없는경우 `undefined` 로 선언한다.)
### 모듈
- FE 개발에서는 항상 import와 export를 이용한다. (require는 사용하지 않는다.)
- import문으로부터 직접 export하지 않는다.
### 블록 구문
- 한 줄짜리 블록일 경우라도 {}를 생략하지 않으며 명확히 줄 바꿈 하여 사용한다.
- 키워드와 조건문 사이에 빈칸을 사용한다.
- switch-case 사용 시 첫 번째 case문을 제외하고 case문 사용 이전에 개행한다.
- switch-case 사용 시 각 구문은 break, return, throw 중 한 개로 끝나야 하며 default문이 없으면 // no default 표시를 해준다.
### 조건 확인하기
- 일치 연산자인 ===, !==을 권장한다.
### 반환하기
- 함수 내에서 반환은 한 번만 한다. 특정 값을 반환해야 하는 경우, 함수 맨 마지막에서 한 번만 반환한다. 단, 예외로 빠져나가는 경우는 제외한다. 코드를 예측하기 쉬우며 흐름이 간결한 함수를 작성할 수 있다.
- return문 바로 위는 한 칸 비워 놓는다.
```js
// Bad
function getResult() {
...
if (condition) {
...
return someDataInTrue;
}
...
return someDataInFalse;
}
// Allow
function foo(isValid) {
...
// 예외처리로 바로 빠져나감
if (!isValid) {
return;
}
...
return someDataInTrue;
}
// Good
function getResult() {
let resultData;
...
if (condition) {
...
resultData = someDataInTrue;
} else {
...
resultData = someDataInFalse;
}
return resultData;
}
```
### 순회하기
- 반복문 사용은 일반화된 순회 메서드 사용을 권장한다.
- 반목문은 상황에 맞는 것을 선택한다. (for문, forEach 등)
- 반복을 위한 변수는 반복문에 선언한다.
### 콜백 함수의 스코프
- 콜백 등 익명 함수를 사용하는 경우, 최대한 클로저 사용을 피하고 각 스코프에 알맞게 변수를 선언한다.
### 주석
- 코드와 관련된 주석은 달지 않는다. 코드를 통해 최대한 내용을 표현하는 것에 집중한다.
- 단, 경고를 위한 주석이나 코드의 출처를 남기는 주석은 제외한다.
- 단, 로직이 너무 복잡한 것 같으면(게임 룰 같은 것)은 적어주어도 된다.
- TODO 주석은 작성이 가능하나 아래의 양식을 꼭 지켜야함.
- // TODO: 내용
- 개발이 완료되면 바로 지운다.
### 공백
- 키워드, 연산자와 다른 코드 사이에 공백이 있어야 한다.
- 시작 괄호 바로 다음과 끝 괄호 바로 이전에 공백이 있으면 안 된다.
- 콤마 다음에 값이 올 경우 공백이 있어야 한다.
###### tags: `project base`