Javascript 코드 작성규칙
함수
- 한문자 이름은 피하십시오. 이름에서 의도를 읽을 수 있도록 하십시오.
// bad
function q() {
// ...stuff...
}
// good
function query() {
// ..stuff..
}
- 소문자 낙타표기법(camelCase)을 사용하십시오.
function thisIsMyFunction() {};
- Class와 생성자에는 PascalCase를 사용하십시오.
function User(options) {
this.name = options.name;
}
var good = new User({
name: 'yup'
});
- private 메서드나 프로퍼티명에 접두어로 밑줄을 붙여 구별하기 쉽게 합니다.
// bad
var persion = {
getName: function() {
return this._getFirst() + ' ' + this._getLast();
},
_getFirst: function() {
//...
},
_getLast: function() {
//...
}
};
변수(Variable)
- 변수는 밑줄로 단어를 분리하여 사용하십시오. 이렇게 하면 함수와 함수가 아닌 나머지 식별자(즉 원시 데이터 타입과 객체)를 시각적으로 구별하는 데 도움이 됩니다.
var first_name, favorite_bands, old_company_name;
- 상수 및 전역 변수는 모든 글자를 대문자로 사용하십시오.
var PI = 3.14,
MAX_WIDTH = 960;
- 변수를 선언 할 때는 항상 var를 사용합니다. 그렇지 않으면 전역 변수로 선언됩니다.
// bad
superPower = new SuperPower();
// good
var superPower = new SuperPower();
- 여러 변수를 선언하려면 하나의 var를 사용하여 변수마다 줄바꿈하여 선언합니다.
// bad
var items = getItems();
var goSportsTeam = true;
var dragonball = 'z';
// good
var items = getItems(),
goSportsTeam = true,
dragonball = 'z';
- 정의되지 않은 변수를 마지막으로 선언합니다. 이것은 나중에 이미 할당된 변수 중 하나를 지정해야하는 경우에 유용합니다.
// bad
var i, len, dragonball,
items = getItems(),
goSportsTeam = true;
// bad
var i, items = getItems(),
dragonball,
goSportsTeam = true,
len;
// good
var items = getItems(),
goSportsTeam = true,
dragonball,
length,
i;
- 변수의 할당은 스코프의 시작 부분에서 해주십시오.
// bad
function() {
test();
console.log('doing stuff..');
//..other stuff..
var name = getName();
if (name === 'test') {
return false;
}
return name;
}
// good
function() {
var name = getName();
test();
console.log('doing stuff..');
//..other stuff..
if (name === 'test') {
return false;
}
return name;
}
// bad
function() {
var name = getName();
if (!arguments.length) {
return false;
}
return true;
}
// good
function() {
if (!arguments.length) {
return false;
}
var name = getName();
return true;
}
오브젝트(Objects)
Object를 만들 때는 리터럴 구문을 사용합니다.
```js
// bad
var item = new Object();
// good var item = {};
* 소문자 낙타표기법(camelCase)을 사용하십시오.
```js
// bad
var OBJEcttsssss = {};
var this_is_my_object = {};
var this-is-my-object = {};
// good
var thisIsMyObject = {};
배열(Arrays)
- 배열을 만들 때 리터럴 구문을 사용합니다.
// bad
var items = new Array();
// good
var items = [];
문자열(Strings)
- 문자열은 작은 따옴표
''
를 사용합니다.
// bad
var name = "Bob Parr";
// good
var name = 'Bob Parr';
// bad
var fullName = "Bob " + this.lastName;
// good
var fullName = 'Bob ' + this.lastName;
- 80 문자 이상의 문자열은 문자열 연결을 사용하여 여러 줄에 걸쳐 기술 합니다.
// bad
var errorMessage = 'This is a super long error that was thrown because of Batman. When you stop to think about how Batman had anything to do with this, you would get nowhere fast.';
// good
var errorMessage = 'This is a super long error that ' +
'was thrown because of Batman.' +
'When you stop to think about ' +
'how Batman had anything to do ' +
'with this, you would get nowhere ' +
'fast.';
- 프로그래에서 문자열을 생성할 필요가 있는 경우 문자열 연결 대신 Array#join을 사용합니다.
var items,
messages,
length,
i;
messages = [{
state: 'success',
message: 'This one worked.'
},{
state: 'success',
message: 'This one worked as well.'
},{
state: 'error',
message: 'This one did not work.'
}];
length = messages.length;
// bad
function inbox(messages) {
items = '<ul>';
for (i = 0; i < length; i++) {
items += '<li>' + messages[i].message + '</li>';
}
return items + '</ul>';
}
// good
function inbox(messages) {
items = [];
for (i = 0; i < length; i++) {
items[i] = messages[i].message;
}
return '<ul><li>' + items.join('</li><li>') + '</li></ul>';
}
속성(Propertie)
- 속성에 액세스하려면 도트.를 사용합니다.
var luke = {
jedi: true,
age: 28
};
function getProp(prop) {
return luke[prop];
}
var isJedi = getProp('jedi');
- 변수를 사용하여 속성에 접근하려면 대괄호[]을 사용하십시오.
var luke = {
jedi: true,
age: 28
};
function getProp(prop) {
return luke[prop];
}
var isJedi = getProp('jedi');
암묵적 타입캐스팅 피하기
- == 나 != 보다는 === 와 !== 를 사용합니다.
var zero = 0;
// bad
if (zero == false) {
// 이 블록은 실행된다.
}
// good
if (zero === false) {
// zero는 0이고 false가 아니기 때문에 이 블록은 실행되지 않는다.
}
블록(Blocks)
- 수행 블록은 중괄호 ({})를 사용합니다.
// bad
if (test)
return false;
// good
if (test) return false;
// good
if (test) {
return false;
}
// bad
function() { return false; }
// good
function() {
return false;
}
주석(Comments)
- 복수행의 코멘트는
/** ... */
를 사용해 주십시오. 그 안에는 설명과 모든 매개 변수와 반환 값에 대한 형식과 값을 설명합니다.
// bad
// make() returns a new element
// based on the passed in tag name
//
// @param <String> tag
// @return <Element> element
function make(tag) {
// ...stuff...
return element;
}
// good
/**
* make() returns a new element
* based on the passed in tag name
*
* @param <String> tag
* @return <Element> element
*/
function make(tag) {
// ...stuff...
return element;
}
- 한 줄 주석에는
//
를 사용하십시오. 코멘트를 추가하고 싶은 코드의 상단에 작성하십시오. 또한 주석 앞에 빈 줄을 넣어주십시오.
// bad
var active = true; // is current tab
// good
// is current tab
var active = true;
// bad
function getType() {
console.log('fetching type...');
// set the default type to 'no type'
var type = this._type || 'no type';
return type;
}
// good
function getType() {
console.log('fetching type...');
// set the default type to 'no type'
var type = this._type || 'no type';
return type;
}
문제를 지적하고 재고를 촉구하거나 문제에 대한 해결책을 제시하는 등 의견의 앞에
FIXME
나TODO
를 붙이는 것으로 다른 개발자의 빠른 이해를 도울 수 있습니다. 이러한 어떤 액션을 동반한다는 의미에서 일반 코멘트와는 다릅니다. 액션은FIXME - 해결책이 필요
또는TODO - 구현이 필요
입니다.
- 문제에 대한 코멘트로
// FIXME :
를 사용하십시오.
function Calculator() {
// FIXME: 전역 변수를 사용해서는 안됩니다.
total = 0;
return this;
}
- 문제 해결책에 대한 코멘트로
// TODO :
를 사용하십시오.
function Calculator() {
// TODO: total은 옵션 매개 변수로 설정되어야 함.
this.total = 0;
return this;
}
공백(Whitespace) 및 들여쓰기(indentation)
- 탭에는 공백 2개를 설정하십시오.
// bad
function() {
∙∙∙∙var name;
}
// bad
function() {
∙var name;
}
// good
function() {
∙∙var name;
}
- if-else, 객체 리터럴의 여는 중괄호({)전, 닫는 중괄호(})와 else 또는 while 사이에 공백하나를 입력합니다.
// if-else
if (a) {
...
} else {
...
}
// good
dog.set('attr', {
age: '1 year',
breed: 'Bernese Mountain Dog'
});
- for 루프의 여는 대괄호전, 쉼표, 피연산자와 구성요소를 분리하는 세미콜론 다음 공백을 하나 입력합니다.
for (var i = 0, max = 10; i < max; i += 1) {...}
- 배열의 원소들은 분리하는 쉼표다음 공백을 하나 입력합니다.
var a = [1, 2, 3];
- 객체의 프로퍼티를 분리하는 쉼표 다음, 프로퍼티의 이름과 값을 분리하는 콜론 다음 공백을 하나 입력합니다.
var o = {a: 1, b: 2};
- 함수의 인자들을 분리할 때 공백을 하나 입력합니다.
myFunc(a, b, c);
- 함수를 정의하는 중괄호 전에 공백을 하나 입력합니다.
function myFunc() {...};
- 익명 함수 표현식에서 function 다음에 공백을 하나 입력합니다.
var myFunc = function() {...};
- 모든 연산자와 피연산자 사이에 공백을 하나 입력합니다. 즉
+, - < *, =, <, >, <==, >==, ===, !==, &&, ||, +=
등의 앞뒤에 공백을 하나 입력합니다.
//bad
var d= 0,
a = b+1;
if (a&& b&&c) {
d=a $c;
a+=d;
}
//good
var d = 0,
a = b + 1;
if (a && b && c) {
d = a % c;
a += d;
}
- 메소드 체인이 길어지는 경우 적절히 들여쓰기(indentation) 합니다.
// bad
$('#items').find('.selected').highlight().end().find('.open').updateCount();
// good
$('#items')
.find('.selected')
.highlight()
.end()
.find('.open')
.updateCount();
// bad
var leds = stage.selectAll('.led').data(data).enter().append('svg:svg').class('led', true)
.attr('width', (radius + margin) * 2).append('svg:g')
.attr('transform', 'translate(' + (radius + margin) + ',' + (radius + margin) + ')')
.call(tron.led);
// good
var leds = stage.selectAll('.led')
.data(data)
.enter().append('svg:svg')
.class('led', true)
.attr('width', (radius + margin) * 2)
.append('svg:g')
.attr('transform', 'translate(' + (radius + margin) + ',' + (radius + margin) + ')')
.call(tron.led);
빈줄
- 파일의 마지막에는 하나의 빈줄을 넣어주세요.
// bad
(function(global) {
// ...stuff...
})(this);
// good
(function(global) {
// ...stuff...
})(this);
jQuery
- jQuery Object의 변수 앞에는 $을 부여해 주십시오.
// bad
var sidebar = $('.sidebar');
// good
var $sidebar = $('.sidebar');
- jQuery 쿼리결과를 캐시해주십시오.
// bad
function setSidebar() {
$('.sidebar').hide();
// ...stuff...
$('.sidebar').css({
'background-color': 'pink'
});
}
// good
function setSidebar() {
var $sidebar = $('.sidebar');
$sidebar.hide();
// ...stuff...
$sidebar.css({
'background-color': 'pink'
});
}