Javascript安全编程规范

命名

1.原则——编码格式UTF-8,根据功能为变量与方法命名(尽量不缩写)

2.类——构造函数/类 使用驼峰命名法,且首字母大写

3.方法——动词、动宾结构,使用驼峰命名法,首字母小写

例如:get + 非布尔属性名()      is + 布尔属性名()      set + 属性名()      has + 名词/形容词()        动词()        动词 + 宾语()

建议——类中的私有属性和方法名,建议以下划线开头或结尾

实例:class Foo() {

  this._bar = computerBar();  // 私有属性

  this.baz = computerBaz();  // 非私有属性,可通过实例访问

}

4.变量——驼峰风格、避免使用否定的布尔变量名、缩写词全大/小写、不要用保留字作键名或变量名、jQuery类变量以 $ 开头

5.常量——全大写单词,以下划线连接

注释

复杂的判定条件封装成名字清晰的方法,把判定结果作为返回值

好的注释描述代码为什么这么写,而不是描述代码功能

单行://     块: /* */     文档: /** */(包含用法,参数,返回值说明)

排版格式

1.缩进——只允许空格,使用Tab的话需要更改IDE配置自动将Tab转化为空格

2.换行——以操作符/运算符开头

3.方法的参数尽量在一行——长参数名单独一行

4.对象字面量属性最多4个同行——大于4个的话每个参数独占一行

5.链式调用方法时一行最多4次——否则需要换行,把点放在前面

6.每行声明一个变量,禁止连续赋值

7.使用基本类型的字面量而不是其封装类型

8.禁止变量声明覆盖外层作用域的变量

方法

1.方法设计原则——单一职责原则、单一抽象层次

2.参数<=5个——参数过多可抽象为对象、不要把方法入参当作工作变量/临时变量、默认参数放最后、实现对外API时应对外部传入参数的合法性进行判断

3.声明与实现——使用声明的方式定义方法而不是表达式、用到匿名函数时尽量使用箭头函数

附:  function Foo(){}即为声明,有函数提升效果         var Foo = function (){}即为表达式,必须先定义后使用

字符串

1.使用单引号(创建一个半酣HTML代码的字符串就会知道原因:标签属性需要用双引号括起来,会跟字符串的双引号产生配对错乱问题)

2.使用模板字符串实现字符串拼接(``)

数组

1.向数组中添加元素时使用push替代直接赋值

2.不要在数组上定义或使用非数字属性(length除外)

例如: arr['str'] = 'string',数组尽量以索引为键

3.遍历时有限使用Arrary方法,如 forEach、map、filter、every...

4.不要在forEach里进行元素的remove/add操作,会导致遍历紊乱

5.使用扩展运算符 ... 赋值数组,避免浅拷贝问题

对象

1.对象字面量名称使用标识符

例如:var object = { id:1, name:'name1' }    不要使用下面这种字符串做键    var obj = { 'str':'string' }

2.尽量在一个地方定义对象的所有属性,即初始化定义对象时就把所有键都初始化,尽量不要后续添加属性

3.对象字面量中使用方法简写、属性简写

4.使用点来访问对象属性,只有属性时动态的时候使用[ ],例如使用for-in遍历对象时通过key访问value

5.getter和setter应该承兑出现在对象中

6.禁止对象实例上直接使用Object.prototype的内置属性

7.需要约束for-in

8.不要修改内置对象的原型或向原型添加方法

9.使用扩展运算符 ... 进行对象赋值,防止浅拷贝问题

运算与表达式

1.if判定条件中,变量在先,字面量在后

2.使用 === 和 !=== 

3.使用简写的条件表达式,例如:当siValid时bool型时,写if(isValid) 而不是 if(isValid===true)

4.不要在复杂条件表达式前加否定符

5.不要使用否定表达式

6.禁止使用嵌套的三元表达式

7.在混合使用不同的操作符时采用括号明确运算的优先级

控制语句

1.每个switch语句豆瓣含一个default语句,即使它不包含任何代码

2.每个有内容的case中都放置一条break语句

3.对于if-else if类型的条件判断最后必须包括一个else分支

4.不要用逻辑运算符代替控制语句

正则表达式

1.禁止正则表达式字面量中出现多个空格

2.建议正则表达式中使用命名捕获组

其他特性

1.注意this的不同分支

2.this的使用场合

  2.1函数时构造函数

  2.2函数时一个方法

  2.3允许在以下函数中调用中出现this关键字

    2.3.1调用了该函数的call/apply/bind方法

    2.3.2如果给出thisArg,该函数是数组方法的一个回调

    2.3.3函数在JSDoc注释标记中有@this标签

3.不要在顶级作用域下使用变量和函数声明

4.为window上的属性/方法加上命名空间

 模块

1.代码中总使用ES6标准的模块(import/export)方式,而不是使用非标准的模块模块化加载器(Node.js代码除外)

2.不要import通配符 *

3.不要多次import同一模块

4.import的顺序依次为内置模块,外部模块,内部模块

5.import不要包括Javascript文件拓展名

6.import不适用绝对路径

7.import的三方件需加入到package.json

8.当模块只有一个export时,最好使用默认导出,而不是命名导出

9.如果文件只export一个函数,那么文件名、类名、以及默认导出的名称应一致

10.不要从import中直接export

11.需要导出的变量必须是const类型或不可变的类型

数值与计算

1.禁止省略小数点前后的0

2.要求调用isNaN()检查NaN

异常的使用

1.抛出的异常应该是Error错误或Error的子类,永远不要抛出字符串或其他对象

2.要求使用Error对象作为Promise拒绝的原因

3.禁止在finally语句中出现控制流语句

异步

禁用不必要的return  await

避免

1.禁止使用eval()

2.禁止使用隐式的eval()

3.禁止使用with(){}

4.禁止使用较短的符号实现类型转换(即通过运算进行强制类型转换)

5.禁止多余的return语句

6.不要在HTML中写过多的JS和CSS代码

7.不要使用非标准的功能

性能编程规范

1.缓存jQuery查询结果

2.避免所有元素选择器

3.有限使用ID选择器,尽量给选择器指定上下文context

4.循环中减少DOM操作

5.利用事件代理机制(冒泡)

其他

1.尽量不使用同步请求

2.减少界面DOM的更新

3.减少HML标签数

内存编程规范

1.DOM

  1.1在满足业务特性需求的情况下,减少DOM对象的对台创建和删除

  1.2禁止在循环/事件回调中使用文本+变量的方式使用jQuery创建DOM

  1.3尽量不适用iframe

2.事件监听

  2.1正确使用DOM Event level 2/3标准进行时间的绑定和注销

  2.2页面卸载,动态删除的DOM对象时要先注销绑定的事件监听

  2.3不要在HTML标签上嵌入JS事件回调代码,优先使用jQuery

  2.4销毁不再使用的定时器和延时器

原文地址:https://www.cnblogs.com/edward-life/p/13258006.html