类型
条件表达式和等号
块
空白
逗号
分号
命名约定
存取器
构造器
模块
ES5 兼容性
HTML、CSS、JavaScript分离
使用jsHint
前端工具
原始值: 相当于传值(JavaScript对象都提供了字面量),使用字面量创建对象。
<a href="http://www.php.cn/wiki/57.html" target="_blank">string</a>
number
boolean
<a href="http://www.php.cn/wiki/62.html" target="_blank">null</a>
undefined
1 2 3 4 5 6 |
|
复杂类型: 相当于传引用
<a href="http://www.php.cn/wiki/60.html" target="_blank">object</a>
<a href="http://www.php.cn/wiki/58.html" target="_blank">array</a>
function
1 2 3 4 5 6 |
|
使用字面值创建对象
1 2 3 4 5 |
|
不要使用保留字 reserved words 作为键
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
使用字面值创建数组
1 2 3 4 5 |
|
如果你不知道数组的长度,使用push
1 2 3 4 5 6 7 |
|
当你需要拷贝数组时使用slice. jsPerf
1 2 3 4 5 6 7 8 9 10 11 |
|
使用slice将类数组的对象转成数组.
1 2 3 4 |
|
对字符串使用单引号 ''
(因为大多时候我们的字符串。特别html会出现"
)
1 2 3 4 5 6 7 8 9 10 11 |
|
超过80(也有规定140的,项目具体可制定)个字符的字符串应该使用字符串连接换行
注: 如果过度使用,长字符串连接可能会对性能有影响. jsPerf & Discussion
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
编程时使用join而不是字符串连接来构建字符串,特别是IE: jsPerf.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
绝对不要在一个非函数块里声明一个函数,把那个函数赋给一个变量。浏览器允许你这么做,但是它们解析不同。
注: ECMA-262定义把块
定义为一组语句,函数声明不是一个语句。阅读ECMA-262对这个问题的说明.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
绝对不要把参数命名为 arguments
, 这将会逾越函数作用域内传过来的 arguments
对象.
1 2 3 4 5 6 7 8 9 |
|
当使用变量和特殊非法变量名时,访问属性时可以使用中括号(.
优先).
1 2 3 4 5 6 7 8 9 10 |
|
总是使用 var
来声明变量,如果不这么做将导致产生全局变量,我们要避免污染全局命名空间。
1 2 3 4 5 |
|
使用一个 var
以及新行声明多个变量,缩进4个空格。
1 2 3 4 5 6 7 8 9 |
|
最后再声明未赋值的变量,当你想引用之前已赋值变量的时候很有用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
在作用域顶部声明变量,避免变量声明和赋值引起的相关问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
|
合理使用 ===
和 !==
以及 ==
和 !=
.
合理使用表达式逻辑操作运算.
条件表达式的强制类型转换遵循以下规则:
对象 被计算为 true
Undefined 被计算为 false
Null 被计算为 false
布尔值 被计算为 布尔的值
数字 如果是 +0, -0, or NaN 被计算为 false , 否则为 true
字符串 如果是空字符串 ''
则被计算为 false, 否则为 true
1 2 3 4 |
|
使用快捷方式.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
阅读 Truth Equality and JavaScript 了解更多
给所有多行的块使用大括号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
使用 /** ... */
进行多行注释,包括描述,指定类型以及参数值和返回值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
使用 //
进行单行注释,在评论对象的上面进行单行注释,注释前放一个空行.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
如果你有一个问题需要重新来看一下或如果你建议一个需要被实现的解决方法的话需要在你的注释前面加上 FIXME
或 TODO
帮助其他人迅速理解
1 2 3 4 5 6 7 |
|
1 2 3 4 5 6 7 |
|
满足规范的文档,在需要文档的时候,可以尝试jsdoc.
缩进、格式化能帮助团队更快得定位修复代码BUG.
将tab设为4个空格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
大括号前放一个空格
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
在做长方法链时使用缩进.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
|
不要将逗号放前面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
不要加多余的逗号,这可能会在IE下引起错误,同时如果多一个逗号某些ES3的实现会计算多数组的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
语句结束一定要加分号
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
在语句的开始执行类型转换.
字符串:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
对数字使用 parseInt
并且总是带上类型转换的基数.,如parseInt(value, 10)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
布尔值:
1 2 3 4 5 6 7 8 9 10 |
|
避免单个字符名,让你的变量名有描述意义。
1 2 3 4 5 6 7 8 9 |
|
当命名对象、函数和实例时使用驼峰命名规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
当命名构造函数或类时使用驼峰式大写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
命名私有属性时前面加个下划线 _
:
1 2 3 4 5 6 |
|
当保存对 this
的引用时使用 self(python 风格)
,避免this issue
.Angular建议使用vm(MVVM模式中view-model)
:
1 2 3 4 5 6 7 |
|
属性的存取器函数不是必需的
如果你确实有存取器函数的话使用getVal() 和 setVal(‘hello’),java getter、setter风格
或者jQuery风格
如果属性是布尔值,使用isVal() 或 hasVal()
1 2 3 4 5 6 7 8 9 |
|
可以创建get()和set()函数,但是要保持一致
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
给对象原型分配方法,而不是用一个新的对象覆盖原型,覆盖原型会使继承出现问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
方法可以返回 this
帮助方法可链。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
|
可以写一个自定义的toString()方法,但是确保它工作正常并且不会有副作用。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
当给事件附加数据时,传入一个哈希而不是原始值,这可以让后面的贡献者加入更多数据到事件数据里而不用找出并更新那个事件的事件处理器
1 2 3 4 5 6 7 8 |
|
更好:
1 2 3 4 5 6 7 8 |
|
这个文件应该以驼峰命名,并在同名文件夹下,同时导出的时候名字一致
对于公开API库可以考虑加入一个名为noConflict()的方法来设置导出的模块为之前的版本并返回它
总是在模块顶部声明 'use strict';
,引入[JSHint规范](http://www.php.cn/)
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
对于jQuery对象以$
开头,以和原生DOM节点区分。
1 2 3 4 5 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
对DOM查询使用级联的 $('.sidebar ul')
或 $('.sidebar ul')
,jsPerf
对有作用域的jQuery对象查询使用 find
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
每个页面只使用一次document的ready事件,这样便于调试与行为流跟踪。
1 2 3 |
|
事件利用jQuery.on
从页面分离到JavaScript文件。
1 2 3 4 5 6 7 |
|
对于Ajax使用promise方式。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
|
利用promise的deferred对象解决延迟注册问题。
1 2 3 4 5 6 7 8 9 |
|
HTML中Style、以及JavaScript中style移到CSS中class,在HTML、JavaScript中引入class,而不是直接style。
尽量采用ES5方法,特别数组map、filter、forEach方法简化日常开发。在老式IE浏览器中引入ES5-shim。或者也可以考虑引入underscore、lodash 常用辅助库.
- 参考Kangax的 ES5 compatibility table
页面DOM结构使用HTML,样式则采用CSS,动态DOM操作JavaScript。不要混用在HTML中
分离在不同类型文件,文件link。
HTML、CSS、JavaScript变量名都需要有业务价值。CSS以中划线分割的全小写命名,JavaScript则首字母小写的驼峰命名。
CSS可引入Bootstrap、Foundation等出名响应式设计框架。以及SASS、LESS工具书写CSS。
对于CSS、JavaScript建议合并为单文件,减少Ajax的连接数。也可以引入AMD(Require.js)加载方式。
对于内部大部分企业管理系统,可以尝试采用前端 MVC框架组织代码。如Angular、React + Flux架构、Knockout等。
对于兼容性可用Modernizr规范库辅助。
前端项目中推荐引入jshint插件来规范项目编码规范。以及一套完善的IDE配置。
注意:jshint需要引入nodejs 工具grunt或gulp插件,建议企业级nodejs npm私服。
前端第三方JavaScript包管理工具bower(bower install jQuery
),bower可以实现第三方库的依赖解析、下载、升级管理等。建议建立企业级bower私服。
前端构建工具,可以采用grunt或者gulp工具,可以实现html、css、js压缩、验证、测试,文件合并、watch和liveload等所有前端任务。建议企业级nodejs npm私服。
前端开发IDE: WebStorm( Idea )、Sublime为最佳 。项目组统一IDE。IDE统一配置很重要。
以上是非常详细的前端JavaScript规范的详细内容。更多信息请关注PHP中文网其他相关文章!