|
|
|
|
移动端

厦门金逸国际电影城:前端开发变量命名系列 - JavaScript篇

本文来源:http://www.133845.com/www_mydrivers_com/

申博官网下载直营网,行情12月07日【广西IT前线今日报道】惠普Pavilion14-AL131TX搭载第七代英特尔#174;酷睿i5-7200U处理器,采用KabyLake架构,运用成熟的14纳米工艺,功耗较第六代更低。郑宇/摄彭春霞/制图  如何看待“双创”战略、把握行业发展,创业投资退出格局以及应对策略有哪些变化,创业投资有哪些新业态以及如何实现创投价值?在近日举行的第十八届高交会系列活动——“中国创业投资2.0论坛”上,与会嘉宾就以上话题进行了讨论。行情12月07日【广西IT前线今日报道】惠普Pavilion14-AL131TX搭载第七代英特尔#174;酷睿i5-7200U处理器,采用KabyLake架构,运用成熟的14纳米工艺,功耗较第六代更低。  高樟资本创始人范卫锋曾表示,papi酱在满足用户的情绪吐槽需求时,进行了浓缩化、化,效率更高、爽度更高,比目前很多同类文字媒体更有价值。

此外,引进资本的同时也在投资。行情12月07日【广西IT前线今日报道】惠普Pavilion14-AL131TX搭载第七代英特尔#174;酷睿i5-7200U处理器,采用KabyLake架构,运用成熟的14纳米工艺,功耗较第六代更低。这固然有去年低基数的原因,却也反映了企业盈利的明显改善。行情12月07日【广西IT前线今日报道】惠普Pavilion14-AL131TX搭载第七代英特尔#174;酷睿i5-7200U处理器,采用KabyLake架构,运用成熟的14纳米工艺,功耗较第六代更低。

  2016年去产能政策成效显著。二、前海人寿整改完成后,保监会将对整改情况以及落实暂停开展万能险新业务的情况进行核查,根据核查情况决定是否恢复前海人寿开展万能险新业务。  从2015年开始,绿地在全国拓展轨道交通投资、开发、运营业务,地铁+物业的开发、运营模式,给绿地的消费、金融、基建、开发等板块带来了大量业务。  新浪中国网络游戏排行榜是以由新浪游戏专业评测员组成的评测团队为核心,以游戏的画质、类型、风格、题材等游戏特性为依据,对中国(大陆港澳台)、欧美、日韩等地区正在进行测试或正式运营的新网游产品进行评测并打分后产生的权威游戏排行榜。

JavaScript作为前端开发从业人员必须掌握的3大基础知识中最重要的一环,也是平是接触时间最长、写得最多的。在开发过程中必然会遇到命名的问题,你会词穷、纠结、惆怅吗?本文的出现相信能够解决大部分烦恼,让你轻松写出符合规范、易读、简短的代码。

作者:jenemy来源:segmentfault|2019-08-13 16:27

【大咖·来了 第7期】10月24日晚8点观看《智能导购对话机器人实践》

 

JavaScript作为前端开发从业人员必须掌握的3大基础知识中最重要的一环,也是平是接触时间最长、写得最多的。在开发过程中必然会遇到命名的问题,你会词穷、纠结、惆怅吗?本文的出现相信能够解决大部分烦恼,让你轻松写出符合规范、易读、简短的代码。

本文将通过大量的实例来试图自圆其说,形成一套系统化、实用的变量命名理化体系。通过按JavaScript的数据类型分类着手、细到一个函数的参数命名,并提供众多可选方案,并尽量给出其适用范围和利弊。

需要注意的是由于个人写作水平、和知识有限,很多方面叙述上有些生硬,在分类上也没有什么特别的依据,文章也没有人审稿,所以有什么纰漏还请留言告知。由于写作仓促,内容可能不全,后续会随着工作和学习的深入而不断地调整和更新。

布尔值(Boolean)命名

Boolean值是两种逻辑状态的变量,它包含两个值:真和假。在JavaScript中对应 true 和 false,在实践中通常使用数字1表示真值,0来表示假值。

虽然Boolean的状态只有两种但是在命名时可以进一步分类,这里给出几种场景:

  •  场景一:表示可见性、进行中的状态

解释:可见性在通常指页面中的元素、组件是否显示(或者组件挂载到DOM上,但并不可见)。进行中主要是说明某种状态是处于持续进行中。

推荐命名方式为 is + 动词(现在进行时)/形容词,同时这种方式也可以直接不写 is,但是为了更好的作区分,建议还是加上。

  1.  
  2.   isShow: '是否显示',  
  3.   isVisible: '是否可见',  
  4.   isLoading: '是否处于加载中',  
  5.   isConnecting: '是否处于连接中',  
  6.   isValidating: '正在验证中',  
  7.   isRunning: '正在运行中',  
  8.   isListening: '正在监听中'  

注意: 在Java中使用这种方式是有一定副作用的,为什么请移步:为什么阿里巴巴禁止开发人员使用 “isSuccess” 作为变量名?

  •  场景二:属性状态类

解释:通常用来描述实体(例如:HTML标签、组件、对象)的功能属性,而且定法比较固定。

  1.  
  2.   disabled: '是否禁用',  
  3.   editable: '是否可编辑',  
  4.   clearable: '是否可清除',  
  5.   readonly: '只读',  
  6.   expandable: '是否可展开',  
  7.   checked: '是否选中',  
  8.   enumberable: '是否可枚举',  
  9.   iterable: '是否可迭代',  
  10.   clickable: '是否可点击',  
  11.   draggable: '是否可拖拽'  
  •  场景三:配置类、选项类

解释:主要是指组件功能的开启与关闭,功能属性的配置。

这是一种比较常见的情景,目前命名方式也有很多种,但是归纳起来也不多。推荐使用 withXx 来表示组件在基本功能形态外的其它功能,比如组件的基础功能到高级功能的开启;使用 enableXx 来表示组件某些功能的开启;使用 allowXx 来表示功能属性的配置;使用 noXx 用于建议功能使用者这个不建议开启。

  1.  
  2.   withTab: '是否带选项卡',  
  3.   withoutTab: '不带选项卡',  
  4.   enableFilter: '开启过滤',  
  5.   allownCustomScale: '允许自定义缩放',  
  6.   shouldClear: '是否清除',  
  7.   canSelectItem: '是否能选中元素',  
  8.   noColon: '不显示label后面的冒号',  
  9.   checkJs: '检查Js',  
  10.   emitBOM: 'Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files.'  

注意:如果嫌分类太多,可以只使用其中一种方式,比如在Typescript中使用了 allownXx 和 noXx。

除了上面这些带有特定的前置介词、动词方式外还有一些在语义上带有疑问性质的组合通常也是作为Boolean命名的一种参考。

  1.  
  2.   virtualScroll: '是否启用虚拟滚动模式',  
  3.   unlinkPanels: '在范围选择器里取消两个日期面板之间的联动',  
  4.   validateEvent: '输入时是否触发表单的校验'  

函数命名

函数在不同的上下文中的叫法也不一样,在对象中称为方法,在类中有构造函数、在异步处理时有回调函数,还有立即执行函数、箭头函数、柯里函数等。

函数命名的方式常常是和业务逻辑耦合在一起的,但是在命名规则上也有一些常见的模式可以遵循。

  •  场景一:事件处理

事件处理函数是前端平时用到最多的,包括浏览器原生事件、异步事件和组件自定义事件。在写法上最常见的两种命名分别为 onXx、onXxClick和handleXx、handleXxChange。

这里如何在二者之间选择,可以从二方面来归类。一是,原生事件采用 onXx,而自定义事件使用 handleXx。二是,事件主动监听采用 onXx,被动处理使用 handleXx。

从实践及三大主流框架的文档关于事件部分的内容来看,推荐使用 handleXx 这种方式,而在表单提交的时候通常采用 onSubmit 函数。

其实,在实际项目中很少严格这样来命名事件处理函数,因为这种方式有一定的局限性,比如点击按钮打开一个对话框,使用 handleOpenDlg 和 onOpenDlg 都没有直接写 openDlg 方便,如果页面有多个不同功能的对话框采用这种方式会显得变量名过长,而handle和on就显得没有必要了,比如 hanldeOpenCommentDlg 就没有 openCommentDlg 直白。

下面列出了一些约定成俗的适用例子:

  1.  
  2.   onSubmit: '提交表单',  
  3.   handleSizeChange: '处理分页页数改变',  
  4.   handlePageChange: '处理分页每页大小改变',  
  5.   onKeydown: '按下键'  
  •  场景二:异步处理

这里主要是指在写数据层服务、状态管理中的Action命名,以及Ajax回调的命名规则。

  1.  
  2.   getUsers: '获取用户列表',  
  3.   fetchToken: '取得Token',  
  4.   deleteUser: '删除用户',  
  5.   removeTag: '移除标签',  
  6.   updateUsrInfo: '更新用户信息',  
  7.   addUsr: '添加用户',  
  8.   createAccount: '创建账户'  

命名主要围绕数据的增删查找来划分,获取数据通常是 getXx 和 fetchXx,在作者看来两者在使用上的区分在于 getXx 的数据来源不一定直接取自异步的原始数据,可能是加工处理后的,而 fetchXx 是直接拿的原始数据。当然在实际项目中并没有区分,看个人喜好。

deleteXx 主要用于数据删除,而 removeXx 在语义上是移除数据,通常情况数据是还存在的,只是没有显示或数据假删除。updateXx 是指数据更新操作,addXx 是在已有列表数据中添加新的子项、而createXx 主要是创建新的实例,比如新建一个账户。

  •  场景三: 跳转路由

在实际开发过种中,比如在使用react-router/vue-router时,在模板或者JSX中可以直接在标签中写上目标地址,但有些时候跳转的目标地址是经过判断或者组合后的,并且通过事件触发跳转的,这个时候就需要一个函数来处理,那么在函数命名的时候可以考虑使用

  1.  
  2.   toTplDetail: '跳转到模板详情页面',  
  3.   navigateToHome: '导航到首页',  
  4.   jumpHome: '跳转首页',  
  5.   goHome: '跳转首页'  

推荐使用 toXx 和 goXx 这两种方式,如果不是在当前页面打开/跳转页面,可以使用 toBlankTplDetail 或者 goBlankHome 这种方式来进一步语义化。如果前端页面是位于Webview中,也可以考虑采用 toNativeShare 这种方式来命名。

  •  场景四:框架相关特定方法

这里主要是针对前端3大主流流行框架,有一些命名是带有特定标识符的,还有就是一些生命周期的命名方式。

  1.  
  2.   formatTimeFilter: '在AngularJs和Vue中,通常用于过滤器命名',  
  3.   storeCtrl: '用于AngularJs定义控制器方法',  
  4.   formatPipe: '用于Angular中,标识管道方法',  
  5.   $emit: 'Vue中的实例方法',  
  6.   $$formatters: 'AngularJs中的内置方法',  
  7.   beforeCreate: 'Vue的生命周期命名',  
  8.   componentWillMount: 'React生命周期命名',  
  9.   componentDidMount: 'React生命周期命名',  
  10.   afterContentInit: 'Anuglar生命周期命名',  
  11.   afterViewChecked: 'Angula生命周期命名',  
  12.   httpProvider: 'AngularJs服务',  
  13.   userFactory: '工厂函数',  
  14.   useCallback: 'React钩子函数'  
  •  场景五:数据的加工

这类场景在处理列表的时候经常会碰到,比如排序、过滤、添加额外的字段、根据ID和索引获取特定数据等。

情形一:根据特定属性获取属性

这里可以参考DOM方法的命名,比如:getElememtById()、getElementsByTagName()、getElementsByClassName() 和 getElementsByName(),然后提炼出一个比较实用的模板:getXxByYy()。其中 Xx 可以是:element, item, option, data, selection, list, options 以及一些特定上下文的名字,比如:user(s), menu(s) 等。Yy 相对来说比较固定,经常用到的就是 id, index, key, value, selected, actived 等。

除了使用 get,还可以使用 query 和 fetch,但是需要注意和上面提到的异步数据处理作一个区分。

  1.  
  2.   getItemById: '根据ID获取数据元素',  
  3.   getItemsBySelected: '根据传入的已选列表ID来获取列表全部数据',  
  4.   queryUserByUid: '根据UID查询用户'  

注意:在 getItemsBySelected 这种情形下直接写成 getItemsSelected 更好,但只适用于 Yy 为形容词的场景

情形二:格式化数据

这里的格式化操作包括排序、调整数据结构、过滤数据、添加属性。命名通常使用 formatXx, convertXx, inverseXx, toggleXx, parseXx, flatXx, 也可以结合数组的一些操作方法来命名,比如 sliceXx, substrXx, spliceXx, sortXx, joinXx 等来命名。

  1.  
  2.   formatDate: '格式化日期',  
  3.   convertCurrency: '转换货币单位',  
  4.   inverseList: '反转数据列表',  
  5.   toggleAllSelected: '切换所有已选择数据状态',  
  6.   parseXml: '解析XML数据',  
  7.   flatSelect: '展开选择数据',  
  8.   sortByDesc: '按降序排序'  

数组命名

数组的命名推荐使用复数形式来命名,还有就是名词和具有列表意思的单词组合。常见的词汇有 options, list, maps, nodes, entities, collection 等。

  1.  
  2.   users: '用户列表',  
  3.   userList: '用户列表',  
  4.   tabOptions: '选项卡选项',  
  5.   stateMaps: '状态映射表',  
  6.   selectedNodes: '选中的节点',  
  7.   btnGroup: '按钮组',  
  8.   userEntities: '用户实体'  

选项元素、下拉元素命名

主要针对的是在下拉选择框、选项卡元素、Radio、Checkbox等数据源每个选项数据的命名。常见的词汇有:title, name, key, label, field, value, id, children, index, nodes 等。

基中 title/name/key/label/field 作为选项显示名, value/id 用于唯一标识选项,children/nodes 用于包含子节点内容。如果选项元素的语义很明确的情况下也可以直接使用特定单词来代替提到的这些泛指的词汇,例如菜单列表就可以使用 menu 来作为显示名。

  1. / 最常见组合  
  2.  
  3.   title: '标题',  
  4.   value: 'ID值'  
  5.  
  6. / 组合二  
  7.  
  8.   label: '标签名',  
  9.   value: 'ID值'  
  10.  
  11. / 组合三  
  12.  
  13.   name: '元素名',  
  14.   id: 'ID值'  
  15.  
  16. / 组合四  
  17.  
  18.   field: '字段',  
  19.   value: '标识',  
  20.   index: '索引'  

当前选项、激活项命名

适用列表的选中项、菜单选中项、步骤操作的当前进行步骤、页面路由当前路由等的命名。

  1.  
  2.   activeTab: '当前选中选项卡',  
  3.   currentPage: '当前页',  
  4.   selectedData: '当前选项中数据',  

临时数据、比对数据命名

针对在代码中有时会使用一些临时的变量来存储数据、保存数据快照的场景下的命名。

  1.  
  2.   swapData: '临时交换数据',  
  3.   tempData: '临时数据',  
  4.   dataSnapshot: '数据快照'  

数据循环语句中变量命名

在使用 for 循环时,多层嵌套请依次使用 i/j/k,超过3层可以使用 x/y/z,m/n 来命名。使用 forEach, map, filter 等方法时,每一个元素命名可以根据不同语境下的特殊名字来命名,比如遍历 menus,那么每个元素可以命名为 menu,不然则使用上下文无关的词汇,比如:item, option, data, key, object 等。至于索引通常使用 index,如果多层可以使用 index + 数字 的形式,也可以直接使用 i/j/k 来作为索引,甚至还可以使用 subIndex/grandIndex 这种方式来命名。

对于在使用 for 循环时数组长度如果需要单独命名的话,可以使用 xxlength/xxLens,或者 xxCount。

在循环的过程中通常还会统计某个条件下数据匹配的次数、重复元素数量、记录中间结果等情况。这里推荐使用 count 表示次数,skipped 表示跳过的数量,result 表示结果。

  1. / for 循环  
  2. for (let i = 0; i < 10; i++) {  
  3.   for (let j = 0; j < 10; j++) {  
  4.     for (let k = 0; k < 10; k++) {  
  5.       / do something  
  6.     }  
  7.   }  
  8.  
  9. for (let i = 0lens = this.options.length; i < lens; i++) {  
  10.   / do something  
  11.  
  12. / forEach  
  13. users.forEach((item, index) => {  
  14.   / do something  
  15. })  
  16. menus.forEach((menu, index) => {  
  17.   if (menu.children) {  
  18.     menu.children.forEach((subMenu, subIndex) => {  
  19.       if (subMenu.children) {  
  20.         subMenu.children.forEach((grandMenu, grandIndex) => {  
  21.           / 一个不常用的示例  
  22.         })  
  23.       }  
  24.     })  
  25.   }  
  26. }) 

方法参数命名

方法的参数名称和数量在不同的方法中各不相同,但是还是有一些固定的模式可以参考,比如在Vue中监听属性变化的新值和旧值;reduce 方法的上一个值,当前值;回调函数的命名、剩余参数的命名等。

情形一:新值、旧值

常见于Vue中watch 对像中的属性监听回调函数,推荐使用

  1.  
  2.   oldVal: '旧值',  
  3.   newVal: '新值'  

情形二:上一个值、下一个值和当前值

这种情形见于路由的钩子方法,Object.assign 数据拷贝的参数。

  1. / 组合一  
  2.  
  3.   from: '从...',  
  4.   to: '到...'  
  5.  
  6. / 组合二  
  7.  
  8.   prev: '上一个...',  
  9.   next: '下一个...',  
  10.   cur: '当前'  
  11.  
  12. / 组合三  
  13.  
  14.   source: '源',  
  15.   target: '目标'  
  16.  
  17. / 组合四  
  18.  
  19.   start: '开始',  
  20.   end: '结束'  

情形三:异步数据返回

用于Promise的then方法参数,await 的返回的Promise等。可选择的词汇有:res, data, json, entity,推荐使用 res。

  1. demoPromise.then(res => {  
  2.   / do something  
  3. }) 

情形四:其它情况

一些使用不多,但是在编程时约定成俗的命名方式。例如 ch 表示单个字符,str 表示字符串, n 代表次数, reg 表示正则, expr 表示表达式, lens 表示数组长度, count 表示数量, p 表示数据的精度, q 表示查询(query), src 表示数据源(source), no 表示数字(number), rate 表示比率, status 表示状态, bool 表示布尔值, arr 表示数组值, obj 表示对象值, x 和 y 表示坐标两轴, func 表示函数, ua表示User Agent, size 表示大小, unit 表示单位, hoz 表示水平方向, vert 表示垂直方向, radix 表示基数,根

  1. / 传入单个字符  
  2. function upper(ch) {}  
  3. / 数量重复  
  4. function repeat(str, n)  
  5. / 正则  
  6. 'abab'.replace(reg, 'bb') 

事件命名

这里根据DOM、nodejs和一些框架和UI组件的事件进行归纳

  •  DOM事件

这里列举DOM中常见的事件命名

  1.  
  2.   load: '已完成加载',  
  3.   unload: '资源正在被卸载',  
  4.   beforeunload: '资源即将被卸载',  
  5.   error: '失败时',  
  6.   abort: '中止时',  
  7.   focus: '元素获得焦点',  
  8.   blur: '元素失去焦点',  
  9.   cut: '已经剪贴选中的文本内容并且复制到了剪贴板',  
  10.   copy: '已经把选中的文本内容复制到了剪贴板',  
  11.   paste: '从剪贴板复制的文本内容被粘贴',  
  12.   resize: '元素重置大小',  
  13.   scroll: '滚动事件',  
  14.   reset: '重置',  
  15.   submit: '表单提交',  
  16.   online: '在线',  
  17.   offline: '离线',  
  18.   open: '打开',  
  19.   close: '关闭',  
  20.   connect: '连接',  
  21.   start: '开始',  
  22.   end: '结束',  
  23.   print: '打印',  
  24.   afterprint: '打印机关闭时触发',  
  25.   click: '点击',  
  26.   dblclick: '双击',  
  27.   change: '变动',  
  28.   select: '文本被选中被选中',  
  29.   keydown/keypress/keyup: '按键事件',  
  30.   mousemove/mousedown/mouseup/mouseleave/mouseout: '鼠标事件',  
  31.   touch: '轻按',  
  32.   contextmenu: '右键点击 (右键菜单显示前)',  
  33.   wheel: '滚轮向任意方向滚动',  
  34.   pointer: '指针事件',  
  35.   drag/dragstart/dragend/dragenter/dragover/dragleave: '拖放事件',  
  36.   drop: '元素在有效释放目标区上释放',  
  37.   play: '播放',  
  38.   pause: '暂停',  
  39.   suspend: '挂起',  
  40.   complete: '完成',  
  41.   seek: '搜索',  
  42.   install: '安装',  
  43.   progress: '进行',  
  44.   broadcast: '广播',  
  45.   input: '输入',  
  46.   message: '消息',  
  47.   valid: '有效',  
  48.   zoom: '放大',  
  49.   rotate: '旋转',  
  50.   scale: '缩放',  
  51.   upgrade: '更新',  
  52.   ready: '准备好',  
  53.   active: '激活'  
  •  自定义事件

在封装组件时提供的事件名除了参考DOM事件外,在命名上也可以参考Github Api 采用 动词过去时 + Event 的方式

  1.  
  2.   assignedEvent: '分配事件',  
  3.   closedEvent: '关闭事件',  
  4.   labeledEvent: '标签事件',  
  5.   lockedEvent: '锁事件',  
  6.   deployedEvent: '部署事件'  

此外,很多命名方式可以根据场景使用 元素 + click 、元素 + change 、select + 范围等方式灵活运用

  1.  
  2.   selectAll: '选择所有',  
  3.   cellClick: '当某个单元格被点击时会触发该事件',  
  4.   sortChange: '当表格的排序条件发生变化的时候会触发该事件'  
  5.  
【责任编辑:申博官网下载直营网庞桂玉 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

这就是5G

这就是5G

5G那些事儿
共15章 | armmay

36人订阅学习

16招轻松掌握PPT技巧

申博官网下载直营网16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

349人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

723人订阅学习

读 书 +更多

计算机网络安全

本书从计算机网络安全的概念入手,分析了单机节点、单一网络、互联网络和开放互联网络的基本安全问题,并对计算机网络安全体系架构和安全机...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO播客

旧版申博开户直营网 申博游戏登入直营网 申博游戏手机版登入 申博代理网登入 菲律宾申博现金网登入 申博管理网登入
www.66msc.com 申博太阳城现金网游戏 申博体育直营网 申博官网开户登入 菲律宾太阳娱乐登入官网 申博代理登录登入
申博注册赠送体验金 菲律宾申博太阳网城上娱乐 申博开户平台登入 www.xpj8.com 申博游戏登录直营网 菲律宾太城申博登入