编码风格与规范

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
打印 print 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
微博 weibo wb
脸书 facebook fb
推特 twitter 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、项目中引用任何第三方插件、组件需要经过张帆老师同意

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容