本文总结了下我在前端开发过程当中编写JavaScript的一些习惯的代码规范,之前端开发背景为主,但有些规则也适用其余语言。同时此规范并不绝对,仅供参考。前端
变量长度:
变量名不要太长,尽可能不超过5个单词,若太长可使用单词缩写typescript
变量缩写:
变量缩写能够采用两种缩写方案:数组
1.使用单词前几个字母,能表述含义便可,控制在3-5个字母(具体长度自定)。如:缓存
医院:hosp 医生:doc 选项:opt
2.若页面内同时出现“文档”和“医生”那么doc会冲突,能够适当增长长度或变换单词来区分。如:服务器
文档:docs 医生:doct
3.使用单词的重音字母,令人能看到字母联想到单词。如:网络
产品:pdt 配置:cfg 检查:chk
操做类函数:
通常使用动词,配合各种形容词,大体以下:
1.纯动词。如:数据结构
save() delete() close()
2.动词+名词。如:闭包
保存医生:saveDoc() 删除医院:delHosp() 建立产品:createPdt()
3.动词+形容词+名词。如app
删除选中的医生:delSelectDoc() 追加一个临时医院:appendTempHosp() 保存全部产品:saveAllPdt()
获取数据类函数:
统一使用get
开头。如:函数
getDocList() getDisablePdt() getElementById(id)
从网络获取数据类函数:
统一使用load
开头。如:
获取省份数据:loadProvince() 根据省份ID获取市区数据:loadCityByProvinceId(pid) 根据市区ID获取县数据:loadCountyByCityId(cid)
load与get的区别我的认为在于,get更通用,能够用于代码内部的数据处理逻辑,load更倾向于从远程加载。
事件响应函数:
on+(动词/操做)+元素+事件名。如
点击保存按钮:onSaveBtnClick() 点击添加按钮:onAddBtnClick() 当是否可用复选框变动时:onIsEnableChkChange() 头像图片鼠标移入时:onHeaderImgMouseEnter()
也能够是on+元素+(动词/操做/用途)+事件名。如
onBtnSaveClick() onChkIsEnableChange()
看我的习惯便可。
虽然看上去略繁琐,但经过函数名自己,就能够完整的定位到此函数的用途。例如onIsEnableChkChange
函数名:
on
开头,知道这是一个响应界面操做事件的函数isEnable
,知道这是“是否可用”的功能的元素。chk
,知道这是一个复选框checkbox
元素的事件Change
,知道这是一个change
事件的响应函数变量单词链接符:
不使用单词链接符,使用小驼峰式命名。如
btnSaveClick
布尔值类型变量:
统一使用is开头。如
是否可用:isEnable 是否选中:isCheck 是否删除:isDelete
集合类型变量:
统一使用List结尾。如
食品列表:foodList 医生列表:docList 已选产品列表:selectPdtList
数组循环体内临时变量:
若循环体代码量少,或仅一行lambda表达式,则可简写 doc
或d
, pdt
或p
循环体代码量大时,或嵌套循环时,尽可能使用Item
结尾。如docItem
, pdtItem
不强制要求,仅为区分层级关系
字典变量:
统一使用Dic
(Dictionary)结尾,如
openWithDic exeDumpDic
枚举集合:
统一使用Enum
(Enumeration)结尾。如
医生类型枚举:docTypeEnum 产品状态枚举:pdtStatusEnum 服务器状态码枚举:serverCodeEnum
枚举项:
建议使用全大写,使用下划线链接单词,与常量规则一致。如
服务器返回值失败:serverCodeEnum.ERROR 服务器返回值成功:serverCodeEnum.SUCCESS
jQuery变量:
建议使用$
开头,或J_
开头,风格统一便可。
$saveBtn J_saveBtn
函数变量:
建议使用Fn
或Cb
结尾,标明此变量为函数指针。如
钩子函数:hookFn 响应回调函数:responseCb 回调函数:callback
常量:
统一使用全大写字母,单词用下划线链接。如
MAX_SIZE TIME_OUT
类(Class)构造函数:
统一使用大驼峰式命名。如
ListView DataTable TableView
类私有属性:
若是未使用TypeScript
或其余强类型语言,即若没有使用带有访问修饰符(public
,private
等)的语言开发,应该经过变量名自己便可区分是私有属性仍是公开属性。
私有属性以及私有函数,应统一如下划线开头。如
_data _pdtList _getData() _setData()
目的在于给与类的使用者能够经过变量区分,哪些是可使用的公开属性和方法,哪些不该该使用的私有属性以及不该该调用的私有方法。
组件事件命名:
1.统一使用on开头。如
onClick(e) onSubmit(e)
2.关键流程类事件,应提供after事件和before事件,以onBefore和onAfter开头。如
准备提交前事件:onBeforeSubmit 提交后事件:onAfterSubmit 准备展开前事件:onBeforeExpand 删除后事件:onAfterDel
3.属性/状态变动类事件,应以on开头,changed结尾。如
check属性变动时事件:onCheckedChange select属性变动时事件:onSelectedChange 产品状态变动时事件:onPdtStatusChange
以上我的经验在组内分享时,有同窗提出疑问:
为何会有字典变量,以及枚举变量,这从本质上不都是Object对象么?
关于这个问题我是这么理解的,在js中确实对象是最强大的,任何在其余语言当中的相似对象的数据结构,在js里均可以是对象。但也正由于如此宽泛,让咱们的使用过程当中会产生一些疑惑或误解,才须要对各类的对象作分类。
因此回过头来再说对象,字典与枚举的关系。
他们的相同点:
他们都是键值对集合(KeyValuePair)
他们的Key都不能重复
他们的不一样点:
对象:
对象的的Key能够是字符串类型或数值类型。若是同时包含这两种就类数组对象,好比document.getElementBy...系列函数的返回值:HTMLCollection
,再好比HTML元素的子元素集合:NodeList
,以及HTML元素的属性值:NamedNodeMap
,等都是类数组对象。
对象的Value的类型,能够是任意类型。并且是在一个对象变量中的Value均可以是任意类型,如JSON对象。
字典:
而字典的Key必定是字符串类型的(其余语言中不是,受限于js语言),字典的Value也能够任意类型,但在一个字典对象变量中的全部Value必定是相同类型,也就是说字典实际上是个Object<string, TValue>
。
例:好比前面刚刚提到的HTML元素的attributes属性值:NamedNodeMap
,就是应该一个典型的字典对象:它属于Dictionary<string, Attr>
。
可是奇葩的是NamedNodeMap
也支持数组下标式访问,因此它同时也是一个List<Attr>
,在js里只能归结于他是类数组对象的范畴内了。

枚举:
而最后的枚举对象的范围会更小,枚举的值通常为基本数据类型,在其余语言中甚至只能是数值类型。
例如,定义一个枚举对象用于一组常量:
// 服务器接口返回值状态码枚举 var serverCodeEnum = { SUCCESS : 0, ERROR : 1, XXXXX : 2, XXXXX : 3, }
在TypeScript为了照顾js语言的平常使用,把enum关键字的编译后代码作成了双向访问的类数组对象。
也就是既能够用过名称得到数值,也能够经过数值得到名称。使用很是方便:
【TypeScript代码中的枚举】 enum ownerTypeEnum { public = 0, private } 【编译为JS后的代码】 var ownerTypeEnum; (function (ownerTypeEnum) { ownerTypeEnum[ownerTypeEnum["public"] = 0] = "public"; ownerTypeEnum[ownerTypeEnum["private"] = 1] = "private"; })(ownerTypeEnum || (ownerTypeEnum = {})); // 效果: // ownerTypeEnum.private -> 1 // ownerTypeEnum[1] -> "private"
此类文章很是容易引战,因此再次声明以上仅我的习惯以及经验的分享,每一个人都有本身的习惯,无论采用哪一种习惯其实均可以。 至少应该在组内,或是某项目内的全部成员都采用相同的一套规范,作到见名知意。