js
文件使用utf-8
编码
- 缩进使用
2
个空格作为一个缩进层级 switch
下的case
和default
语句需要增加一个缩进层级
// good example
switch (variable) {
case '1':
// do...
break;
case '2':
// do...
break;
default:
// do...
}
// bad example
switch (variable) {
case '1':
// do...
break;
case '2':
// do...
break;
default:
// do...
}
- 二元运算符两侧要有一个空格,一元运算符与操作对象之间不需要有空格
var a = !arr.length;// 有空格
a++; // 无空格
a = b + c;
- 用作代码块起始的左花括号
{
前必须有一个空格。
// good
if (condition) {
}
while (condition) {
}
function funcName() {
}
// bad
if (condition){
}
while (condition){
}
function funcName(){
}
if / else / for / while / function / switch / do / try / catch / finally
关键字后,必须有一个空格。
// good example
if (condition) {
}
while (condition) {
}
(function () {
})();
// bad example
if(condition) {
}
while(condition) {
}
(function() {
})();
- 在对象创建时,属性中的
:
之后必须有空格,:
之前不允许有空格。
// good example
var obj = {
a: 1,
b: 2,
c: 3
};
// bad example
var obj = {
a : 1,
b:2,
c :3
};
- 函数声明、具名函数表达式、函数调用中,函数名和
(
之间不允许有空格。
// good example
function funcName() {
}
var funcName = function funcName() {
};
funcName();
// bad example
function funcName () {
}
var funcName = function funcName () {
};
funcName ();
,
和;
前不允许有空格。
// good example
callFunc(a, b);
// bad example
callFunc(a , b) ;
- 在函数调用、函数声明、括号表达式、属性访问、
if / for / while / switch / catch
等语句中,()
和[]
内紧贴括号部分不允许有空格。
// good example
callFunc(param1, param2, param3);
save(this.list[this.indexes[i]]);
needIncream && (variable += increament);
if (num > list.length) {
}
while (len--) {
}
// bad example
callFunc( param1, param2, param3 );
save( this.list[ this.indexes[ i ] ] );
needIncreament && ( variable += increament );
if ( num > list.length ) {
}
while ( len-- ) {
}
- 单行声明的数组与对象,如果包含元素,
{}
和[]
内紧贴括号部分不允许包含空格。
// good example
var arr1 = [];
var arr2 = [1, 2, 3];
var obj1 = {};
var obj2 = {name: 'obj'};
var obj3 = {
name: 'obj',
age: 20,
sex: 1
};
// bad example
var arr1 = [ ];
var arr2 = [ 1, 2, 3 ];
var obj1 = { };
var obj2 = { name: 'obj' };
var obj3 = {name: 'obj', age: 20, sex: 1};
- 行尾不得有多余的空格。
- 每个独立语句结束后必须换行。运算符处换行时,运算符必须在新行的行首。
- 每行不得超过
120
个字符。 - 运算符处换行时,运算符必须在新行的行首。
// good example
if (user.isAuthenticated()
&& user.isInRole('admin')
&& user.hasAuthority('add-admin')
|| user.hasAuthority('delete-admin')
) {
// Code
}
var result = number1 + number2 + number3
+ number4 + number5;
// bad example
if (user.isAuthenticated() &&
user.isInRole('admin') &&
user.hasAuthority('add-admin') ||
user.hasAuthority('delete-admin')) {
// Code
}
var result = number1 + number2 + number3 +
number4 + number5;
- 在函数声明、函数表达式、函数调用、对象创建、数组创建、
for
语句等场景中,不允许在,
或;
前换行。
// good
var obj = {
a: 1,
b: 2,
c: 3
};
foo(
aVeryVeryLongArgument,
anotherVeryLongArgument,
callback
);
// bad
var obj = {
a: 1
, b: 2
, c: 3
};
foo(
aVeryVeryLongArgument
, anotherVeryLongArgument
, callback
);
- 不同行为或逻辑的语句集,使用空行隔开,更易阅读。
// 仅为按逻辑换行的示例,不代表setStyle的最优实现
function setStyle(element, property, value) {
if (element == null) {
return;
}
element.style[property] = value;
}
- 在语句的行长度超过 120 时,根据逻辑条件合理缩进。
// 较复杂的逻辑条件组合,将每个条件独立一行,逻辑运算符放置在行首进行分隔,或将部分逻辑按逻辑组合进行分隔。
// 建议最终将右括号 ) 与左大括号 { 放在独立一行,保证与 if 内语句块能容易视觉辨识。
if (user.isAuthenticated()
&& user.isInRole('admin')
&& user.hasAuthority('add-admin')
|| user.hasAuthority('delete-admin')
) {
// Code
}
// 按一定长度截断字符串,并使用 + 运算符进行连接。
// 分隔字符串尽量按语义进行,如不要在一个完整的名词中间断开。
// 特别的,对于HTML片段的拼接,通过缩进,保持和HTML相同的结构。
var html = '' // 此处用一个空字符串,以便整个HTML片段都在新行严格对齐
+ '<article>'
+ '<h1>Title here</h1>'
+ '<p>This is a paragraph</p>'
+ '<footer>Complete</footer>'
+ '</article>';
// 也可使用数组来进行拼接,相对 + 更容易调整缩进。
var html = [
'<article>',
'<h1>Title here</h1>',
'<p>This is a paragraph</p>',
'<footer>Complete</footer>',
'</article>'
];
html = html.join('');
// 当参数过多时,将每个参数独立写在一行上,并将结束的右括号 ) 独立一行。
// 所有参数必须增加一个缩进。
foo(
aVeryVeryLongArgument,
anotherVeryLongArgument,
callback
);
// 也可以按逻辑对参数进行组合。
// 最经典的是baidu.format函数,调用时将参数分为“模板”和“数据”两块
baidu.format(
dateFormatTemplate,
year, month, date, hour, minute, second
);
// 当函数调用时,如果有一个或以上参数跨越多行,应当每一个参数独立一行。
// 这通常出现在匿名函数或者对象初始化等作为参数时,如setTimeout函数等。
setTimeout(
function () {
alert('hello');
},
200
);
order.data.read(
'id=' + me.model.id,
function (data) {
me.attchToModel(data.result);
callback();
},
300
);
// 链式调用较长时采用缩进进行调整。
$('#items')
.find('.selected')
.highlight()
.end();
// 三元运算符由3部分组成,因此其换行应当根据每个部分的长度不同,形成不同的情况。
var result = thisIsAVeryVeryLongCondition
? resultA : resultB;
var result = condition
? thisIsAVeryVeryLongResult
: resultB;
// 数组和对象初始化的混用,严格按照每个对象的 { 和结束 } 在独立一行的风格书写。
var array = [
{
// ...
},
{
// ...
}
];
- 对于
if...else...、try...catch...finally
等语句,推荐使用在}
号后添加一个换行的风格,使代码层次结构更清晰,阅读性更好。
// good example
if (condition) {
// ...
} else {
// ...
}
try {
// ...
} catch (ex) {
// ...
}
// bad example
if (condition) {
// some statements;
}
else {
// some statements;
}
try {
// some statements;
}
catch (ex) {
// some statements;
}
- 在
if / else / for / do / while
语句中,即使只有一行,也不得省略块{...}
。
// good example
if (condition) {
callFunc();
}
// bad example
if (condition) callFunc();
if (condition)
callFunc();
- 函数定义结束不允许添加分号。
// good example
function funcName() {
}
// bad example
function funcName() {
};
// 如果是函数表达式,分号是不允许省略的。
var funcName = function () {
};
IIFE
必须在函数表达式外添加(
,非IIFE
不得在函数表达式外添加(
。
// good example
var task = (function () {
// Code
return result;
})();
var func = function () {
};
// bad example
var task = function () {
// Code
return result;
}();
var func = (function () {
});
函数
变量
参数
类的 方法/属性
使用Camel
命名法。
// good example
var loadingModules = {};
function stringFormat(source) {
// ...
}
function hear(theBells) {
// ...
}
function TextNode(value, engine) {
this.myValue = value;
this.myEngine = engine;
}
TextNode.prototype.clone = function () {
return this;
};
// bad example
var loadingmoduleS = {};
function stringformaT(source) {
// ...
}
function hear(thebellS) {
// ...
}
function TextNode(value, engine) {
this.myvaluE = value;
this.myenginE = engine;
}
- 常量使用
全部字母大写,单词间下划线分隔
的命名方式。
// good example
var HTML_ENTITY = {};
const HTML_ENTITY = {};
// bad example
var html_entity = {};
类
使用Pascal
命名法。
function TextNode(options) {
// ...
}
boolean
类型的变量使用is
或has
开头。
// boolean variable
var isReady = false;
var hasMoreCommands = false;
//
后跟一个空格
// good example
// haha
// bad example
//heihei
// hehe
- 若注释占整行,则注释缩进与下一行被注释说明的代码一致。
// good example
var a = 0;
// haha
var haha = 1;
// bad example
var a = 0;
// heihei
var heihei = 2;
- 避免使用
/*...*/
这样的多行注释。有多行注释内容时,使用多个单行注释。
// good example
// hallo
// i am Aymax
// bad example
/* hallo
i am Baymax */
- 类型定义以
{
开始, 以}
结束,例string
、number
- 建议使用插件 - DocBlockr
// good example
/**
* @function 取得数组中的最小值
* @param {Array}
* @return {number}
*/
function getMin(arr) {
return Math.min.apply(Math,arr);
}
// good example
/**
* @author: Aymax
* @date: 1921.01.01
* @contact: 88888888@qq.com
* @description: haha
*/
// good example
// TODO: 有功能待实现。此时需要对将要实现的功能进行简单说明。
// FIXME: 该处代码运行没问题,但可能由于时间赶或者其他原因,需要优化。
// HACK: 为修正某些问题而写的不太好或者使用了某些诡异手段的代码。
// XXX: 存在一些坑要特别说明的,避免后人又踩