听风是风

学或不学,知识都在那里,只增不减。

导航

JavaScript开发规范

 壹 ❀ 引

当一个团队开发同一个项目时,无论使用的是什么技术,每个人开发习惯的不同,最终代码呈现总有差异;A同事不爱写注释,B同事命名上总是随心所欲,虽然功能都能实现,但对于几个月,或很久之后的维护造成了极大的阻碍,因此统一一个开发团队的编程规范很有必要。这份规范几个月前就整理好了,前端组目前的开发也以此为标准,其实对于我来说也是一种个人财富吧,所以这里还是整理为博客。

本文主要从命名、注释、编程规范与项目文件命名四个方面展开,公司要求不同最终规范肯定不会完全一致,但愿此规范能对你的提供一点思路与帮助,那么本文开始:

 贰 ❀ 命名(变量/常量/函数)

1.变量

变量命名推荐采用小驼峰命名法---即首字母小写,后每个单词首字母大写。

// good
let name = '听风是风';
let userName = 'echo';
// bad
let username = '时间跳跃';

2.常量

常量命名推荐采用全字母大写命名,以便于与变量区分。

// good
const PI = 3.141592653;
// bad
const pi = 3.141592653;

3.函数

函数命名推荐使用小驼峰命名法,条件允许情况下请采用动词前缀方式,请保证函数命名语义化明确。

// 判断是否能执行某个操作/权限
function canLogin() {};
// 判断是否有某个值
function hasUserName() {};
// 判断是否是某个值
function isUserName() {};
// 获取某个值
function getUserName() {};
// 设置某个值
function setUserName() {};
// 加载数据
function loadData() {};
// ...

4.构造函数

构造函数命名必须采用大驼峰命名法,即首字母必须大写。

// good
function Student(name) {
    this.name = name;
};

 叁 ❀ 注释

1.单行注释

采用 // 方式注释:

// 这是我的博客名
let name = '听风是风';

2.多行注释

采用 /** */ 方式注释:

/**
 * 这是我的博客名
 * 听风是风,且听风吟
 */
let name = '听风是风';

3.函数注释

函数注释也是多行注释的一种,但要求提供函数功能说明,作者信息,参数说明(若有参数),以及返回值(若有返回值)说明。

/**
 * @desc 用于计算两数之和
 * @author 听风是风
 * @param {Number} x 数字,用于加法计算
 * @param {Number} y 数字,用于加法计算
 * @return {Number} result 用于保存计算后的结果
 */
function add(x, y) {
    let result = x + y;
    return result;
};

 肆 ❀ 编程规范

1.推荐使用对象直接量创建对象,而非构造器创建

// 创建普通对象
// good
let obj = {a: 1}
// bad
let obj = new Object();
obj.a = 1;

// 创建数组
// good
let arr = [1,2,3];
// bad
let arr = new Array();
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;

// 创建函数
// good
function getName(){}; //函数声明
let getName = function() {}; //函数表达式
// bad
let getName = new Function();

2.字符串拼接推荐使用ES6中` `拼接

// good
let str = `hello, my name is ${变量}.`;
// bad
let str = "hello, my name is " + 变量 + " ."

3.比较运算符

永远推荐使用"==="与"!=="而非"=="与"!=",在允许的情况下,推荐使用比较运算符简写进行判断:

// good
if(a === 1){};
if(a !== 1){}

比较运算符简写的规则:

a.对象被认为是true

b.Undefined,Null,空字符串被计算为false

c.布尔值根据自身值判断为true或false

d.数字+0,-0或NaN被计算为false,否则为true

// good
if(name){};
// bad
if(name !== ''){};
// good
if(arr.length){};
// bad
if(arr.length > 0){};
// good
if(!variable){}
// bad
if(variable === false){}

4.养成添加分号的习惯

let name = '听风是风';
const AGE = 26;

5.空格与代码缩进

请结合vscode插件,如Beautify进行一键格式化。

6.代码空行

a.函数代码块前后请空行(当函数方紧接函数注释时,函数与注释间不需要换行)

let name = '听风是风';

//这是一个函数
function setName(name){
    let userName = name;
};

// 调用函数
setName(name);

b.注释前请空行(当注释在代码块的第一行时,则无需空行;若在函数内注释可不空行,集中声明多个变量添加注释时也可不空行)

// 名字
let name = '听风是风';
// 年龄
let age = 26;

//这是一个函数
function setName(name){
    // 设置用户名
    let userName = name;
    // 返回用户名
    return userName;
};

// 调用函数
setName(name);

c.变量声明下方请空行(如有多个变量集中声明,只在最后一个变量下方空行,函数内可不空行)

7.变量、函数请保证先声明后使用,统一作用域的变量声明请集中管理

虽然ES6使用let已经不存在变量提升,避免了这个问题,但若仍使用了var声明请遵守这一点。

// good
var a = 1;
console.log(a)
// bad
console.log(a)
var a = 1;

// good
function demo() {console.log(1)};
demo();
// bad
demo();
function demo() {console.log(1)};

同一作用域的变量声明请集中在顶端。

// good
function demo() {
    var a = 1;
    var b = 2;
    var c = 3;
    console.log(a);
    console.log(b);
};
// bad
function demo() {
    var a = 1;
    console.log(a);
    var b = 2;
    var c = 3;
    console.log(b);
};

8.关于循环

a.若循环中需使用函数,请将函数定义在循环外部而非内部,这样可以避免函数的反复创建。

// good
let demo = function (i) {
        console.log(i)
    },
    i = 0,
    arr = [1, 2, 3],
    len = arr.length;
for (; i < len; i++) {
    demo(i);
};
// bad
let arr = [1, 2, 3],
    i = 0,
    len = arr.length;
for (; i < len; i++) {
    let demo = function () {
        console.log(i);
    };
    demo();
};

上述bad写法中准确来说有两点不合理,第一点是demo函数会反复创建比较浪费内存;

第二点是严格来说函数只能在全局作用域或函数作用域下声明,但浏览器环境默认支持了非此类环境的创建行为,且ES6为了兼容早期写法,仍然允许此类写法,但我们应该清楚这一点。

b.循环中的常量

循环过程中例如数组的length属性在不变的情况下,提出循环外声明要比在for循环中创建更好。

// good
let i = 0,
    arr = [1, 2, 3],
    len = arr.length;
for (; i < len; i++) {
    console.log(i);
};
// bad
let arr = [1, 2, 3];
for (let i = 0; i < arr.length; i++) {
    console.log(i);
};

c.若循环操作与循环顺序无关,使用逆序遍历效果更好

// good
let arr = [1, 2, 3],
    len = arr.length;
while (len--) {
    console.log(1);
};

 伍 ❀ 项目文件命名规范

由于我们使用了angularjs开发项目,总会涉及到组件,服务等特殊文件,这里除了常见的html,less文件外,还会统一特殊文件的命名习惯。

1.html文件命名推荐采用小驼峰命名法+.html:

index.html
myAccount.html

2.less文件推荐采用小驼峰命名法+.less:

index.less
myAccount.less

3.controller控制器推荐小驼峰命名法+Ctrl+.js:

indexCtrl.js
myAccountCtrl.js

4.service推荐采用小驼峰命名法+.service+.js:

index.service.js
myAccount.service.js

5.component推荐采用小驼峰命名法+.component+.js,依赖模板与样式如下:

// 组件JS
myAccount.component.js
// 组件样式
myAccount.component.less
// 组件模板
myAccount.template.html

6.directive指令推荐小驼峰命名法+.directive+.js,模板样式同component

// 组件JS
myAccount.directive.js
// 组件样式
myAccount.directive.less
// 组件模板
myAccount.template.html

7.控制器,服务,组件,指令注册命名,推荐采用小驼峰命名

angular.module('myApp',[])
    .controller('myAccountCtrl',function(){
        // 控制器
    })
    .service('myAccountService',function(){
        // 服务
    })
    .directive('myAccountDirective',function() {
        // 指令
    })
    .component('myAccountComponent',{
        // 组件
    })
    .filter('myAccountFilter',function(){
        // 过滤器
    });

这样统一命名的好处是,当我们看到一个服务叫myAccountService,那么马上可以知道创建这个服务的文件名叫myAccount.Service.js。

我们保证文件名与注册名的一致性,这样对于文件查找是非常便捷的。

希望这些规范能对你有所帮助,本文结束。

posted on 2019-08-25 19:22  听风是风  阅读(1723)  评论(2编辑  收藏  举报