前端编码规范示例
前端编码规范示例
一、概述
编码请严格遵循一下规范编写!
二、规范示例
1、变量相关
(1)定义变量(滥用变量)
1 | NO:滥用变量: |
1 | let kpi = 4; // 定义好了之后再也没用过 |
1 | YES: 数据只使用一次或不使用就无需装到变量中 |
1 | let kpi = 4; // 没用的就删除掉,不然过三个月自己都不敢删,怕是不是那用到了 |
(2)变量命名
1 | NO:自我感觉良好的缩写: |
1 | let fName = 'jackie'; // 看起来命名挺规范,缩写,驼峰法都用上,ESlint各种检测规范的工具都通过,But,fName是啥?这时候,你是不是想说What are you 弄啥呢? |
1 | YES:无需对每个变量都写注释,从名字上就看懂 |
1 | let firstName = 'jackie'; // 怎么样,是不是一目了然。少被喷了一次 |
(3)特定的变量
1 | NO:无说明的参数: |
1 | if (value.length < 8) { // 为什么要小于8,8表示啥?长度,还是位移,还是高度?Oh,my God!! |
1 | YES:添加变量 |
1 | const MAX_INPUT_LENGTH = 8; |
(4)啰嗦的变量名称
1 | NO:命名过于啰嗦: |
1 | let nameString; |
1 | YES:做到简洁明了 |
1 | let name; |
(5)使用说明性的变量(即有意义的变量名)
1 | NO:长代码不知道啥意思: |
1 | const address = 'One Infinite Loop, Cupertino 95014'; |
1 | YES:用变量名来解释长代码的含义 |
1 | const address = 'One Infinite Loop, Cupertino 95014'; |
(6)避免使用太多的全局变量
1 | NO:在不同的文件不停的定义全局变量: |
1 | name.js |
1 | YES:少用或使用替代方案 你可以选择只用局部变量。通过(){}的方法 |
1 | 如果你确实用很多的全局变量需要共享,你可以使用vuex,redux或者你自己参考flux模式写一个也行。 |
(7)避免使用太多的全局变量
1 | NO:对于求值获取的变量,没有兜底: |
1 | const MIN_NAME_LENGTH = 8; |
1 | YES:对于求值变量,做好兜底 |
1 | const MIN_NAME_LENGTH = 8; |
2、函数相关
(1)函数命名
1 | NO:从命名无法知道返回值类型: |
1 | function showFriendsList() {....} // 现在问,你知道这个返回的是一个数组,还是一个对象,还是true or false。你能答的上来否?你能答得上来我请你吃松鹤楼的满汉全席还请你不要当真。 |
1 | YES:对于返回true or false的函数,最好以should/is/can/has开头 |
1 | function shouldShowFriendsList() {...} |
(2)功能函数最好为纯函数
1 | NO:不要让功能函数的输出变化无常: |
1 | function plusAbc(a, b, c) { // 这个函数的输出将变化无常,因为api返回的值一旦改变,同样输入函数的a,b,c的值,但函数返回的结果却不一定相同。 |
1 | YES:功能函数使用纯函数,输入一致,输出结果永远唯一 |
1 | function plusAbc(a, b, c) { // 同样输入函数的a,b,c的值,但函数返回的结果永远相同。 |
(3)函数传参
1 | NO:传参无说明: |
1 | page.getSVG(api, true, false); // true和false啥意思,一目不了然 |
1 | YES:传参有说明 |
1 | page.getSVG({ |
(4)动作函数要以动词开头
1 | NO:无法辨别函数意图: |
1 | function emlU(user) { |
1 | YES:动词开头,函数意图就很明显 |
1 | function sendEmailToUser(user) { |
(5)一个函数完成一个独立的功能,不要一个函数混杂多个功能
1 | NO:函数功能混乱,一个函数包含多个功能。最后就像能以一当百的老师傅一样,被乱拳打死(乱拳(功能复杂函数)打死老师傅(老程序员)) |
1 | function sendEmailToClients(clients) { |
1 | YES:功能拆解 |
1 | function sendEmailToActiveClients(clients) { //各个击破,易于维护和复用 |
(6)优先使用函数式编程
1 | NO:使用for循环编程 |
1 | for(i = 1; i <= 10; i++) { // 一看到for循环让人顿生不想看的情愫 |
1 | YES:使用函数式编程 |
1 | let b = a.map(item => ++item) // 怎么样,是不是很好理解,就是把a的值每项加一赋值给b就可以了。现在在javascript中几乎所有的for循环都可以被map,filter,find,some,any,forEach等函数式编程取代。 |
(7)函数中过多的采用if else ..
1 | NO:if else过多 |
1 | if (a === 1) { |
1 | YES:可以使用switch替代或用数组替代 |
1 | switch(a) { |
3、ES6优化一些写法
(1)尽量使用箭头函数
1 | NO:采用传统函数 |
1 | function foo() { |
1 | YES:使用箭头函数 |
1 | let foo = () => { |
(2)字符串拼接
1 | NO:传统拼接(+) |
1 | let message = 'Hello ' + name + ', it\'s ' + time + ' now' |
1 | YES:采用模板字符 |
1 | let message = `Hello ${name}, it's ${time} now` |
(3)解构赋值
1 | NO:传统赋值 |
1 | var data = { name: 'dys', age: 1 }; |
1 | YES:解构赋值 |
1 | const data = {name:'dys', age:1}; |
(5)使用async、await替代then(回调地狱式)
1 | NO:回调地狱写法 |
1 | handleSubmit1() { |
1 | YES:async和await写法 |
1 | async handleSubmit() { |
4、语法检查、代码缩进等
(1)eslint语法检查
编译检查是否通过
1 | 糟糕的代码编译示例 |
1 | 优秀的代码编译示例 |
(2)webstrom代码质量检查
1 | 糟糕的代码示例 |
1 | 优秀的代码示例 |
(3)代码缩进等
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LivisSnack!
评论