# :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`