当前流行的JavaScript代码风格指南


Posted in Javascript onSeptember 10, 2014

JavaScript 没有一个权威的编码风格指南,取而代之的是一些流行的编码风格:

Google的JavaScript风格指南(以下简称Google)
http://google-styleguide.googlecode.com/svn/trunk/javascriptguide.xml

NPM编码风格(以下简称NPM)
https://npmjs.org/doc/coding-style.html

Felix的Node.js风格指南(以下简称Node.js)
http://nodeguide.com/style.html

惯用(Idiomatic)的JavaScript(以下简称Idiomatic)
https://github.com/rwldrn/idiomatic.js/

jQuery JavaScript风格指南(以下简称jQuery)
http://contribute.jquery.org/style-guide/js/

Douglas Crockford的JavaScript风格指南(以下简称Crockford),Douglas Crockford是Web开发领域最知名的技术权威之一,ECMA JavaScript 2.0标准化委员会委员
http://javascript.crockford.com/code.html

当然,在JavaScript语法检查器 JSLint 和 JSHint 中也有一些默认的设置选择。问题是,什么才是终极的、让大多数开发者可以遵循的JavaScript编码风格呢?下面让我们从这6个风格指南中找出一些有共识的风格来。

1. 代码风格比较

1.1 缩进

两个空格,无需更长的缩进,无需Tab缩进:Google、NPM、Node.js、Idiomatic
Tab缩进:jQuery
4个空格:Crockford

1.2 参数和表达式之间的空格

使用紧凑型风格:Google、NPM、Node.js

project.MyClass = function(arg1, arg2) {

过多地使用空格:Idiomatic, jQuery
for ( i = 0; i < length; i++ ) {

没有发表意见:Crockford
大部分指南中,都提醒开发者不要在语句结尾处有任何的空格。

1.3 代码行长度

最多80个字符:Google、NPM、Node.js、Crockford(当在代码块中,除了2个空格外的其他缩进允许将函数参数与首个函数参数的位置对齐。另一种选择是当自动换行时使用4个空格缩进,而不是2个。)
没有发表意见:jQuery、Idiomatic

1.4 分号

始终使用分号,不依赖于隐式插入:Google、Node.js、Crockford
在某些情况下不要使用expect:NPM
没有发表意见:jQuery、Idiomatic

1.5 注释

遵循JSDoc约定:Google、Idiomatic
没有发表意见:NPM、Node.js、jQuery、Crockford

1.6 引号

推荐单引号:Google、Node.js
双引号:jQuery
没有发表意见:NPM、Idiomatic、Crockford

1.7 变量声明

一次声明一个,不使用逗号:Node.js

var foo = ”;

var bar = ”;

一次声明多个,在行结束处使用逗号分隔:Idiomatic、jQuery
var foo = “”,

bar = “”,

quux;

在行开始处使用逗号:NPM
没有发表意见:Google、Crockford

1.8 大括号

在同一行使用左大括号:Google、NPM、Node.js、Idiomatic、 jQuery、Crockford

function thisIsBlock(){

NPM指南中指出,只在代码块需要包含下一行时使用大括号,否则不使用。

1.9 全局变量

不要使用全局变量:Google、Crockford(谷歌表示,全局变量命名冲突难以调试,并可能在两个项目进行正整合时出现一些棘手的问题。为了便于共享公用的JavaScript代码,需要制定公约来避免冲突发生。Crockford认为不应该使用隐式全局变量。)

没有发表意见:Idiomatic、jQuery、NPM、Node.js

2 命名风格

2.1 变量命名

开始的第一个单词小写,之后的所有单词首字母大写:Google、NPM、Node.js、Idiomatic

var foo = “”;

var fooName = “”;

2.2 常量命名

使用大写字母:Google、NPM、Node.js

var CONS = ‘VALUE';

没有发表意见:jQuery、Idiomatic、Crockford

2.3 函数命名

开始的第一个单词小写,之后的所有单词首字母大写(驼峰式):Google、NPM、Idiomatic、Node.js(推荐使用长的、具描述性的函数名)

function veryLongOperationName

function short()..

关键字形式的函数命名:
function isReady()

function setName()

function getName()

没有发表意见:jQuery、Crockford

2.4 数组命名

使用复数形式:Idiomatic

var documents = [];

没有发表意见:Google、jQuery、NPM、Node.js、Crockford

2.5 对象和类命名

使用如下形式:Google、NPM、Node.js

var ThisIsObject = new Date;

没有发表意见:jQuery、Idiomatic、Crockford

2.6 其他命名

针对长文件名和配置键使用all-lower-hyphen-css-case形式:NPM

3. 根据上述风格配置 .jshintrc 文件

JSHint(http://www.jshint.com/)是一个JavaScript语法和风格检查工具,你可以用它来提醒代码风格相关的问题。它可以很好地被集成到许多常用的编辑器中,是统一团队编码风格的一个很好的工具。

你可以通过JSHint文档查看可用的选项: http://www.jshint.com/docs/#options
下面根据以上每个分类下的第一种风格来创建一个 .jshintrc 文件。你可以将它放到项目的根目录中,JSHint-avare 代码编辑器将会按照它来统一项目中的所有代码风格。

{

  "camelcase" : true,

  "indent": 2,

  "undef": true,

  "quotmark": single,

  "maxlen": 80,

  "trailing": true,

  "curly": true

}

此外,你应该将下面的头添加到你的 JavaScript 文件中:

/* jshint browser:true, jquery:true */

在 Node.js 文件中你应该添加:

/*jshint node:true */

还可以在各种 JavaScript 文件中添加下面的声明:
‘use strict';

这将影响 JSHint 和你的 JavaScript 引擎,可能不那么兼容,但是 JavaScript 将会运行得更快。

4. 在提交 Git 之前自动执行 JSHint

如果你想确保所有的 JS 代码与 .jshintrc 中定义的风格保持一致,你可以将下面的内容添加到你的 .git/hooks/pre-commit文件中,当你试图提交任何新修改的文件到项目时会自动执行风格检查。

#!/bin/bash

# Pre-commit Git hook to run JSHint on JavaScript files.

#

# If you absolutely must commit without testing,

# use: git commit --no-verify
filenames=($(git diff --cached --name-only HEAD))
which jshint &> /dev/null

if [ $? -ne 0 ];

then

  echo "error: jshint not found"

  echo "install with: sudo npm install -g jshint"

  exit 1

fi
for i in "${filenames[@]}"

do

    if [[ $i =~ \.js$ ]];

    then

        echo jshint $i

        jshint $i

        if [ $? -ne 0 ];

        then

            exit 1

        fi

    fi

done
Javascript 相关文章推荐
MC Dialog js弹出层 完美兼容多浏览器(5.6更新)
May 06 Javascript
JS特权方法定义作用以及与公有方法的区别
Mar 18 Javascript
引用外部js乱码问题分析及解决方案
Apr 12 Javascript
js计算任意值之间随机数的方法
Jan 16 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
Jul 27 Javascript
jQuery删除当前节点元素
Dec 07 Javascript
JavaScript用JSONP跨域请求数据实例详解
Jan 06 Javascript
vuejs使用递归组件实现树形目录的方法
Sep 30 Javascript
webpack配置打包后图片路径出错的解决
Apr 26 Javascript
详解如何使用node.js的开发框架express创建一个web应用
Dec 20 Javascript
浅谈es6中的元编程
Dec 01 Javascript
Vue实现省市区三级联动
Dec 27 Vue.js
在css加载完毕后自动判断页面是否加入css或js文件
Sep 10 #Javascript
JQuery拖动表头边框线调整表格列宽效果代码
Sep 10 #Javascript
jQuery通过点击行来删除HTML表格行的实现示例
Sep 10 #Javascript
javascipt:filter过滤介绍及使用
Sep 10 #Javascript
用javascript将数据导入Excel示例代码
Sep 10 #Javascript
js使用for循环及if语句判断多个一样的name
Sep 09 #Javascript
JQuery实现当鼠标停留在某区域3秒后自动执行
Sep 09 #Javascript
You might like
php将字符串转化成date存入数据库的两种方式
2014/04/28 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
PHP SFTP实现上传下载功能
2017/07/26 PHP
PHP生成二维码与识别二维码的方法详解【附源码下载】
2019/03/07 PHP
javascript之函数直接量(function(){})()
2007/06/29 Javascript
出现“不能执行已释放的Script代码”错误的原因及解决办法
2007/08/29 Javascript
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
Jquery replace 字符替换实现代码
2010/12/02 Javascript
jQuery(1.6.3) 中css方法对浮动的实现缺陷分析
2011/09/09 Javascript
ajax java 实现自动完成功能
2012/12/19 Javascript
javascript校验价格合法性实例(必须输入2位小数)
2014/05/05 Javascript
js图片模糊切换显示特效的方法
2015/02/17 Javascript
JQuery中ajax方法访问web服务实例
2015/07/18 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
vue中element 上传功能的实现思路
2018/07/06 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
在Layui 的表格模板中,实现layer父页面和子页面传值交互的方法
2019/09/10 Javascript
Vue实现验证码功能
2019/12/03 Javascript
使用Vue-cli 中为单独页面设置背景图片铺满全屏
2020/07/17 Javascript
vue实现单一筛选、删除筛选条件
2020/10/26 Javascript
python获取糗百图片代码实例
2013/12/18 Python
分享Python开发中要注意的十个小贴士
2016/08/30 Python
python中利用h5py模块读取h5文件中的主键方法
2018/06/05 Python
python模拟实现斗地主发牌
2020/01/07 Python
python 多线程共享全局变量的优劣
2020/09/24 Python
简单的HTML5初步入门教程
2015/09/29 HTML / CSS
Saucony澳大利亚官网:美国跑鞋品牌,运动鞋中的劳斯莱斯
2018/05/05 全球购物
极度干燥澳大利亚官方网站:Superdry澳大利亚
2019/03/28 全球购物
瑞典网上购买现代和复古家具:Reforma
2019/10/21 全球购物
教导处工作制度
2014/01/18 职场文书
农民工讨薪标语
2014/06/26 职场文书
2015年检验科工作总结
2015/04/27 职场文书
python实战之90行代码写个猜数字游戏
2021/04/22 Python
Mongodb 迁移数据块的流程介绍分析
2022/04/18 MongoDB