1、let取代var 强制
let
完全可以取代var
,因为两者语义相同,而且let
没有副作用。
2、字符串采用单引号和反引号 强制
const a = 'foobar';
const b = `foo${a}bar`;
3、采用解构赋值方式 建议
const arr = [1, 2, 3, 4];
// 常规写法
const first = arr[0];
const second = arr[1];
// 建议写法
const [first, second] = arr;
const obj = { left, right, top, bottom };
// 常规写法
const left = obj.left;
const right= obj.right;
// 建议写法
const { left, right } = obj;
// 常规写法
function getFullName(obj) {
const firstName = obj.firstName;
const lastName = obj.lastName;
}
// 建议写法
function getFullName({ firstName, lastName }) {
}
4、对象尽量静态化 推荐
对象尽量静态化,一旦定义,就不得随意添加新的属性。如果添加属性不可避免,要使用Object.assign
方法。
// 不推荐如下写法
const user = {
name: '韩晗'
}
user.sex = '男';
user.age = 38;
// 推荐写法
const user = {
name: '韩晗',
sex: null
}
Object.assign(user, { age: 38 });
5、使用扩展运算符(...)拷贝数组 推荐
// 常规写法
const itemsCopy = [];
const len = items.length;
for (const i = 0; i < len; i++) {
itemsCopy[i] = items[i];
}
// 推荐写法
const itemsCopy = [...items];
6、简单的、单行的、不会复用的函数,采用箭头函数 建议
// 常规写法
[1, 2, 3].map(function (x) {
return x * x;
});
// 建议的写法
[1, 2, 3].map((x) => {
return x * x;
});
// 更好的写法
[1, 2, 3].map(x => x * x);
注意:箭头函数不但可以使编码更简洁,而且绑定了 this。
7、不要在函数体内使用 arguments 变量,使用 rest 运算符(...)代替 强制
// 禁止的写法
function concatenateAll() {
const args = Array.prototype.slice.call(arguments);
return args.join('');
}
// 替换的写法
function concatenateAll(...args) {
return args.join('');
}
8、使用默认值语法设置函数参数的默认值 强制
// 禁止的写法
function handleThings(status) {
status = status || 0;
}
// 替换的写法
function handleThings(status = 0) {
}
9、用Class取代需要prototype的操作 推荐
// 常规写法
function User() {
const name = '韩晗';
}
User.prototype.getName = function() {
...
}
// 推荐的写法
class User{
const name = '韩晗';
getName () {
...
}
}
10、坚持使用ES6原生模块语法 强制
1 坚持使用import取代require
2 坚持使用export取代module.exports
3 import进来的对象都是要用到的,暂时不用的删除或者注释掉
11、类和类中方法的命名规范 强制
1 类名采用大驼峰方式命名,实例名采用小驼峰方式命名
2 类中方法采用小驼峰方式命名
3 内部方法名前面加下划线
,表示私有方法仅限内部调用
4 以上命名方式同样适用于对构造函数及内部方法的命名
12、变量命名规范 强制
1 常数采用全大写+匈牙利命名法
// 例如:
const IMAGE_DEFAULT_WIDTH = 600;
2 变量、传参、常量等采用小骆驼命名法
// 例如:
let index = 0;
const departmentName = 'IT部';
function getFullName(firstName, lastName) {
...
}
3 临时变量或私有变量前可以用'_'开头
// '_'开头临时变量必须是局部变量
// 例如:
for(const i = 0; i < items.length; i++{
const _img = document.createElement('img');
...
}
4 通用变量
// 除i,j,n,e,或一元二次方程中的a,b,c等约定俗成单字符变量外,禁止在代码中出现单字符变量
// 例如:
for(const u of userArray) {
...
}
// tmp或temp用于临时变量
// 例如:
let total = 0;
for(const i = 0; i < 100; i++) {
const tmp = i * i;
total += tmp;
}
// 用items代表通用数组对象,用item代表从数组中遍历出来的单个对象
for(const item of items) {
...
}
// 用args代表通用传参数组,arg1,arg2,arg3...分别代表单个传参
function equation(...args) {
const arg1 = args[0];
const arg2 = args[1];
const arg3 = args[2];
const arg4 = args[3];
return arg1 * arg2 + arg3 * arg4;
}
// 用params代表通用对象型传参
function equation(params) {
return params.a * params.b + params.c * params.d;
}
// 用settings、opts或者prots代表通用配置项
// settings代表设置
// opts是options的缩写,也代表配置
// prots是properties的缩写,代表配置
function ImageViewer(opts) {
const options = Object.assign({}, defaultOpts, opts);
...
}
// flag、type与status
// flag通常用于表示布尔型或简单如'1,2,3'这样的数字型数据
// type用于代表数字或其他枚举的分类,分类可以少也可以非常之多
// status通常用于代表数据的状态位,也是可以很少也可以非常之多
let flag = false;
let type = 1;
let status = 0;
// 以上所有的通用变量均可作为变量后缀出现
// 例如:
let userStatus = 1; // 用户状态
const pageType = 2; // 页面类型
const pluginProts = {}; // 插件配置
5 类型修饰后缀
// 序号采用index,整数采用num,浮点型采用float
let rowIndex = 1; // 行顺序号
let docNum = 155; // 稿件数量
let lengthFloat = 89.5; // 长度通常是整
数型的,加上float作为后缀后,就明确了变量的实际类型
// 字符串采用str,布尔型采用'is'作为前缀
const sex = 1;
const sexStr = ['女', '男', '未知'][sex];
const isMen = sex == 1;
// 数组采用array,集合采用set/map,对象采用obj,JSON采用json
const userObj = {};
const userJson = {};
const userArray = []; // 不建议采用list作为后缀
const userSet = new Set();
const userMap = new Map();
// 类和函数修饰后缀
const xxxModel; // model对象实例
const xxxDao; // Dao层实例
const xxxService; // Service层实例
const xxxFn; // 函数
const xxxCb; // 回调函数(强调:为了避免回调'cb'与采编'cb'的命名歧义,系统中用全大写'CB'代表采编,'XCB'代表新采编)
6 描述后缀
// 页面元素型描述后缀
const xxxElem; // xxx通用元素
const xxxInp; // xxx输入框
const xxxChk; // xxx复选框
const xxxRad; // xxx单选框
const xxxSel; // xxx下拉列表
const xxxTxta; // xxx文本域
const xxxBtn; // xxx按钮
const xxxForm; // xxx表单
const xxxBox; // xxx盒子,常用指代容器
const xxxDiv; // xxx div元素
const xxxLi; // xxx li元素
// 业务实体型描述后缀
const xxxDoc; // xxx稿件
const xxxAudio; // xxx音频
const xxxImage; // xxx图片
const xxxVideo; // xxx视频
const xxxProcess; // xxx流程
const xxxPublish; // xxx发布线路,是对渠道、产品的总称
const xxxChannel; // xxx渠道,渠道下是具体的产品
const xxxProduct; // xxx产品
const xxxReport; // xxx报道
const xxxCount; // xxx数
const xxxDescription; // xxx描述,有时也用于表示留痕
const xxxAttachment; // xxx附件
const xxxDept; // xxx部门
const xxxPDept; // xxx父级部门
const xxxBy; // xxx人,例如:uploadBy表示上传人
const xxxLat; // xxx纬度
const xxxLon; // xxx经度
const xxxFull; // xxx完整路径,例如:departmentNameFull代表从顶级部门到当前部门的完成部门路径
const xxxCategory; // xxx分类
const xxxPostil; // xxx批注
13、通用缩写 强制
说明 | 全拼 | 缩写 |
---|---|---|
函数 | function | func/fn |
回调 | callback | cb |
配置,选项配置 | options | opts |
配置,属性配置 | properties | prots |
参数 | parameters | params |
对象 | object | obj |
请求 | request | req |
响应 | response | res |
源头/资源 | source/resource | src/resrc |
异步 | asynchronization | asyn |
同步 | synchronization | sync |
文本 | text | txt |
流 | stream | stm |
服务 | server | svr |
计算 | calculate | calc |
变化 | change | chg |
点击 | click | clk |
命令 | command | cmd |
控制 | control | ctrl |
当前 | current | cur |
长度 | length | len |
参数 | argument | arg |
默认 | default | def |
动态 | dynamic | dyna |
环境 | Environment | env |
扩展 | extend | ex/ext |
执行 | execute | exec |
插入 | insert | ins |
实例 | instance | inst |
管理/管理者 | Manage/Manager | mg/mgr |
采编/新采编 | caibian/xincaibian | CB/XCB |
部门 | department | depart/dept |
中间 | middle | mid |
乘法 | multiply | mul |
打印 | prn | |
发布 | public | pub |
引用、参考 | reference | ref |
注册/注册人 | regist/register | reg/regr |
元素 | element | elem |
输入框 | input | inp |
下拉列表 | select | sel |
复选框 | checkbox | chk |
单选框 | radiobox | rad |
文本域 | textarea | txta |
按钮 | button | btn |
文档 | document | doc |
关联、关系 | relationship/relation | rel |
消息 | message | mesg/msg |
列 | column | col |
错误 | error | err |
详情、信息 | infomation | info |
导航 | navigation | nav |
操作 | operation | opt |
流程 | process | proc |
微信 | weixin | wx |
微博 | wb | |
脸书 | fb | |
推特 | tw | |
优兔 | youtube | ytb |
14、注释规范 强制
1 模块声明
写在文件的最上面,说明文件的用途,所属目录,作者及其他
/**
* ajax请求工具函数库
* @module app/common/utils
* @author 韩晗
*/
/**
* 与用户、组部、权限相关的Dao层类
* @module app/main/core/service
* @author 韩晗
*/
2 类注释
在命名规范的前提下,根据约定大于说明的原则,可以不写注释,例如:UserDao、UserService等
如果需要给类写注释,建议说明以下信息
a 类的用途简要说明,通常用一行
b 如果作者与当前模块作者不一致,则声明作者
/**
* 与用户相关的API层Dao类
*/
/**
* 与用户相关的Service服务类
* @author 王翔
*/
3 函数及方法注释
/**
* GET方式ajax请求API接口的共通方法
* @param {string} url api接口地址
* @param {object} params 接口请求参数
* @param {function} callback 回调函数
* @returns {void} 回调方式,无返回
*/
4 变量说明注释
采用在行尾单行注释的方式,一行说明一个变量
let userType = 0; // 用户类型:0管理员 1普通用户 2注册会员
5 代码块说明注释
代码块说明注释通常是对注释下方同一业务逻辑代码的说明
采用单行注释符'//'注释,需要多行说明文字的时候,采用多个单行注释符注释强烈建议将同一逻辑的代码块说明写在一起
/** 不好的写法 */
// 如果type=1,则将两个数相乘并返回
if (type == 1) {
return num1 * num2;
}
// 如果type=2,则将两个数相加并返回
else if (type == 2) {
return num1 + num2;
}
// 否则返回0
else {
return 0;
}
/** 推荐的写法 */
// 判断type的值,执行不同的计算方式并返回
// 如果type=1,则将两个数相乘并返回
// 如果type=2,则将两个数相加并返回
// 否则,直接返回0
if (type == 1) {
return num1 * num2;
} else if (type == 2) {
return num1 + num2;
} else {
return 0;
}
6 Bug修改或需求叠加时的注释
修改的代码块前后要增加2或4个断行
操作类型:add新增 | edit修改 | delete删除
开发类型:BUG改错误 | FUN修改或叠加逻辑
// 韩晗<edit> start
// 2019-03-21 <BUG> 解决计算时没有判断边界的错误
// return x * y;
const result = x * y;
if (result > 100000) {
result = 100000;
}
return result;
// 韩晗<edit> end
15、Git提交说明书写格式
Git提交的说明格式如下:
【{挂栏主题(或关键字)信息}】{提交内容说明}
例如:
【新增】新增人员选择弹窗面板开关项及相关组件目录
【修改、删除】修改了人员选择弹窗的样式,解决取消按钮失效问题,同时删除了没用的css文件
【A轮冲刺测试】解决了在特殊情况下,插入文字稿失败的bug
16、张帆老师提出的新要求 强制
1、项目禁止使用Jquery或其他第三方函数库
2、项目中引用任何第三方插件、组件需要经过张帆老师同意