`

javascript的编码规范总结

阅读更多

 

建立和遵循编码规范是很重要的,这让你的代码保持一致性,可预测,更易于阅读和理解。一个新的开发者加入这个团队可以通读规范,理解其它团队成员书写的代码,更快上手干活。

要记住,建立和坚定不移地遵循规范要比纠结于规范的细节重要的多。

1.缩进(Indentation)

代码没有缩进基本上就不能读了。唯一糟糕的事情就是不一致的缩进,因为它看上去像是遵循了规范,但是可能一路上伴随着混乱和惊奇。重要的是规范地使用缩进。

一些开发人员更喜欢用tab制表符缩进,因为任何人都可以调整他们的编辑器以自己喜欢的空格数来显示Tab。有些人喜欢空格——通常四个,这都无所谓,只要团队每个人都遵循同一个规范就好了。这本书,例如,使用四个空格缩进,这也是JSLint中默认的缩进。

什么应该缩进呢?规则很简单——花括号里面的东西。这就意味着函数体,循环 (do, while, for, for-in),if,switch,以及对象字面量中的对象属性。下面的代码就是使用缩进的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function outer(a, b) {
var c = 1,
d = 2,
inner;
if (a > b) {
inner = function () {
return {
r: c - d
};
};
} else {
inner = function () {
return {
r: c + d
};
};
}
return inner;
}

2.花括号{}(Curly Braces)

花括号(亦称大括号,下同)应总被使用,即使在它们为可选的时候。技术上将,在in或是for中如果语句仅一条,花括号是不需要的,但是你还是应该总是使用它们,这会让代码更有持续性和易于更新。

想象下你有一个只有一条语句的for循环,你可以忽略花括号,而没有解析的错误。

// 糟糕的实例
for (var i = 0; i < 10; i += 1)
alert(i);

但是,如果,后来,主体循环部分又增加了行代码?

 

// 糟糕的实例
for (var i = 0; i < 10; i += 1)
alert(i);
alert(i + " is " + (i % 2 ? "odd" : "even"));

第二个alert已经在循环之外,缩进可能欺骗了你。为了长远打算,最好总是使用花括号,即时只有一行代码。

 

if条件类似,你应该这样写:

1
2
3
4
5
if ( true ) {
alert(1);
} else {
alert(2);
}

开发人员对于左大括号的位置有着不同的偏好——在同一行或是下一行。个人喜欢在同一行,发现很多人也和我一样。

1
2
3
4
5
6
7
8
9
if ( true ) {
alert( "It's TRUE!" );
}
//或
if ( true )
{
alert( "It's TRUE!" );
}

这个实例中,仁者见仁智者见智,但也有个案,括号位置不同会有不同的行为表现。这是因为分号插入机制(semicolon insertion mechanism)——JavaScript是不挑剔的,当你选择不使用分号结束一行代码时JavaScript会自己帮你补上。这种行为可能会导致麻 烦,如当你返回对象字面量,而左括号却在下一行的时候:

1
2
3
4
5
6
7
8
9
10
11
// 警告: 意外的返回值
function func() {
return
// 下面代码不执行
{
name : "Batman"
}
}

如果你希望函数返回一个含有name属性的对象,你会惊讶。由于隐含分号,函数返回undefined。前面的代码等价于:

// 警告: 意外的返回值
function func() {
return undefined;
// 下面代码不执行
{
name : "Batman"
}
}

 

总之,总是使用花括号,并始终把在与之前的语句放在同一行:

1
2
3
4
5
function func() {
return {
name : "Batman"
};
}

就像使用花括号,你应该总是使用分号,即使他们可由JavaScript解析器隐式创建。这不仅促进更科学和更严格的代码,而且有助于解决存有疑惑的地方,就如前面的例子显示。

3.空格(White Space)

空格的使用同样有助于改善代码的可读性和一致性。在写英文句子的时候,在逗号和句号后面会使用间隔。在JavaScript中,你可以按照同样的逻辑在列表模样表达式(相当于逗号)和结束语句(相对于完成了“想法”)后面添加间隔。

适合使用空格的地方包括:

  • for循环分号分开后的的部分:如for (var i = 0; i < 10; i += 1) {...}

  • for循环中初始化的多变量(i和max):for (var i = 0, max = 10; i < max; i += 1) {...}

  • 分隔数组项的逗号的后面:var a = [1, 2, 3];

  • 对象属性逗号的后面以及分隔属性名和属性值的冒号的后面:var o = {a: 1, b: 2};

  • 限定函数参数:myFunc(a, b, c)

  • 函数声明的花括号的前面:function myFunc() {}

  • 匿名函数表达式function的后面:var myFunc = function () {};

使用空格分开所有的操作符和操作对象是另一个不错的使用,这意味着在+, -, *, =, <, >, <=, >=, ===, !==, &&, ||, += 等前后都需要空格。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 宽松一致的间距
// 使代码更易读
// 使得更加“透气”
var d = 0,
a = b + 1;
if (a && b && c) {
d = a % c;
a += d;
}
// 反面例子
// 缺失或间距不一
// 使代码变得疑惑
var d = 0,
a = b + 1;
if (a&&b&&c) {
d=a % c;
a+= d;
}

最后需要注意的一个空格——花括号间距。最好使用空格:

  • 函数、if-else语句、循环、对象字面量的左花括号的前面({)

  • else或while之间的右花括号(})

空格使用的一点不足就是增加了文件的大小,但是压缩无此问题。

有一个经常被忽略的代码可读性方面是垂直空格的使用。你可以使用空行来分隔代码单元,就像是文学作品中使用段落分隔一样。

 

4.命名规范(Naming Conventions)

让你的代码更具可预测性和可维护性的另一种方法是采用命名规范。这就意味着你需要用同一种形式给你的变量和函数命名。

下面是建议的一些命名规范,你可以原样采用,也可以根据自己的喜好作调整。同样,遵循规范要比规范是什么更重要。

 

1.以大写字母写构造函数(Capitalizing Constructors)

JavaScript并没有类,但有new调用的构造函数:

1
var adam = new Person();

 

因为构造函数仍仅仅是函数,这样写仅看函数名就可以帮助告诉你这应该是一个构造函数还是一个正常的函数。

命名构造函数时首字母大写具有暗示作用,表示这是一个构造函数,可以使用new调用,而使用小写命名的一般函数和方法不应该使用new调用:

1
2
function MyConstructor() {...}
function myFunction() {...}

2.驼峰(Camel)命名法

 

当你的变量或是函数名有多个单词的时候,最好单词的分离遵循统一的规范,有一个常见的做法被称作“驼峰(Camel)命名法”,就是单词小写,每个单词的首字母大写。

对于构造函数,可以使用大驼峰式命名法(upper camel case),如MyConstructor() 。对于函数和方法名称,你可以使用小驼峰式命名法(lower camel case),像是myFunction() , calculateArea() getFirstName()

要是变量不是函数呢?开发者通常使用小驼峰式命名法,但还有另外一种做法就是所有单词小写以下划线连接:例如,first_name, favorite_bands, old_company_name ,这种标记法帮你直观地区分函数和其他标识——原型和对象。

 

3.使用命名规范来弥补或替代语言特性

有时,开发人员使用命名规范来弥补或替代语言特性。

例如,JavaScript中没有定义常量的方法(尽管有些内置的像Number, MAX_VALUE),所以开发者都采用全部单词大写的规范来命名这个程序生命周期中都不会改变的变量,如:

1
2
3
// 珍贵常数,只可远观
var PI = 3.14,
MAX_WIDTH = 800;

还有另外一个完全大写的惯例:全局变量名字全部大写。全部大写命名全局变量可以让它们易于区分。

另外一种使用规范来模拟功能的是私有成员。虽然可以在JavaScript中实现真正的私有,但是开发者发现仅仅使用一个下划线前缀来表示一个私有属性或方法会更容易些。考虑下面的例子:

1
2
3
4
5
6
7
8
9
10
11
var person = {
getName: function () {
return this ._getFirst() + ' ' + this ._getLast();
},
_getFirst: function () {
// ...
},
_getLast: function () {
// ...
}
};

在此例中,getName() 就表示公共方法,部分稳定的API。而_getFirst() _getLast() 则表明了私有。它们仍然是正常的公共方法,但是使用下划线前缀来警告person对象的使用者这些方法在下一个版本中时不能保证工作的,是不能直接使用的。

下面是一些常见的_private 规范:

  • 使用尾下划线表示私有,如name_getElements_()

  • 使用一个下划线前缀表_protected (保护)属性,两个下划线前缀表示__private (私有)属性

  • Firefox中一些内置的变量属性不属于该语言的技术部分,使用两个前下划线和两个后下划线表示,如:__proto____parent__

5.注释(Writing Comments)

 

你必须注释你的代码,即使不会有其他人向你一样接触它。通常,当你深入研究一个问题,你会很清楚的知道这个代码是干嘛用的,但是,当你一周之后再回来看的时候,想必也要耗掉不少脑细胞去搞明白到底怎么工作的。

很显然,注释不能走极端:每个单独变量或是单独一行。但是,你通常应该记录所有的函数,它们的参数和返回值,或是任何不寻常的技术和方法。要想到注 释可以给你代码未来的阅读者以诸多提示;阅读者需要的是(不要读太多的东西)仅注释和函数属性名来理解你的代码。例如,当你有五六行程序执行特定的任务, 如果你提供了一行代码目的以及为什么在这里的描述的话,阅读者就可以直接跳过这段细节。没有硬性规定注释代码比,代码的某些部分(如正则表达式)可能注释 要比代码多。

最重要的习惯,然而也是最难遵守的,就是保持注释的及时更新,因为过时的注释比没有注释更加的误导人。

 

 

相关文章


 1.   JavaScript中全局变量的问题

 

 

分享到:
评论

相关推荐

    最全的Javascript编码规范(推荐)

    本文给大家总结了js编码规范知识,非常实用,在日常程序开发中经常可以用到,大家务必掌握

    中软国际 Java 程序员 笔试题与答案

    中软国际 Java 程序员 笔试题与答案 总结归纳中软题目并提供答案

    javascript压缩混淆加密器

    特别指出,该工具对用户Javascript代码编程规范的约束极小,可以说几乎没有,不像市面上有些工具必须按照一定的规则进行编码才行。 同时,HDS JSObfuscator还具有批量管理复制各类更新过的文件和合并文件的强大...

    国内最强的JS(Javascript)压缩混淆加密器

    特别指出,该工具对用户Javascript代码编程规范的约束极小,可以说几乎没有,不像市面上有些工具必须按照一定的规则进行编码才行。 同时,HDS JSObfuscator还具有批量管理复制各类更新过的文件和合并文件的强大...

    tastebile:日常代码归类整理总结学习

    fixed 的问题Javascript整理学习js知识,夯实基础 JavaScript编码规范 字符串的基本操作方法 JS获取URL中参数值(QueryString)的方法 对字符串中进行转义的 escapehtml 的函数 js基础之数组操作 数组的检测方法 ECM...

    Moralsoft JSObfuscator

    工具简介: 随着 AJAX 和富界面技术的发展,Javascript 在 Web 应用上的重要性...特别指出,该工具对用户Javascript代码编程规范的约束极小,可以说几乎没有,不像市面上有些工具必须按照一定的规则进行编码才行。

    JSObfuscator By Unest.rar

    特别指出,该工具对用户Javascript代码编程规范的约束极小,可以说几乎没有,不像市面上有些工具必须按照一定的规则进行编码才行。 由于个人能力和精力有限,工具存在问题和不足在所难免,希望大家多多批评指正。 ...

    blogs:前端技术博客仓库,记录工作和学习中的总结和经验

    前端工程自动化,编码规范、提交规范 插件扩展 图片打点支持缩放移动的技术要点 Axios 全局统一封装、处理全局 Loading Axios 全局统一封装、基础结构型封装 记录总结 写给自己的知识体系和前端进阶路线 前端基础...

    monthly:前端月报,回顾记录当月好文 http

    侧重后端应用与对Node核心的理解 前端面试与进阶指南编码规范HTML/CSS/JS/React/图标库/Less/模块加载等NodeNode.js 包教不包会Nodejs学习笔记以及经验总结Node学习笔记Koa.js 设计模式-学习笔记-已完结 Koa2进阶...

    最新Python3.5零基础+高级+完整项目(28周全)培训视频学习资料

    软件目录结构规范 本周作业 第5周 心灵分享 ATM存钱取钱案例剖析 模块定义、导入、优化详解 内置模块详解之time与datetime模块 内置模块详解之Range模块 内置模块详解之OS模块 内置模块详解之Sys模块 内置模块详解...

    Sea.JS知识总结

    SeaJS是一个遵循CommonJS规范的JavaScript模块加载框架。是一款现代的用于Web开发的模块加载工具,提供简单、极致的模块化体验。Sea.js 由阿里、腾讯等公司共同维护。 使用 Sea.js的好处: Sea.js 追求简单、自然的...

    PHP3程序设计

    12.2 CGI应用程序和JavaScript 190 12.3 自己编写脚本 190 12.4 CGI是如何工作的 190 12.5 调用CGI程序 190 12.6 HTTP标题 191 12.7 CGI和环境变量 192 12.8 URL编码和解码 194 12.8.1 使用rawurlencode函数 194 ...

    asp.net知识库

    Oracle编程的编码规范及命名规则 Oracle数据库字典介绍 0RACLE的字段类型 事务 CMT DEMO(容器管理事务演示) 事务隔离性的一些基础知识 在组件之间实现事务和异步提交事务(NET2.0) 其它 在.NET访问MySql数据库时的...

    超经典的Web前端与移动开发基础视频 Web前端基础开发视频教程 移动开发基础视频教程

    15前端开发基础视频-网页的组成html+css+JavaScript.avi 16前端开发基础视频-HTML的页面结构.avi 17前端开发基础视频-HTML的语法.avi 18前端开发基础视频-HTML的文档声明标签.avi 19前端开发基础视频-HTML的...

    java面试题以及技巧

    │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt).rar │ │ │ └─javascript资料(源码,教材,ppt) │ 00s.jpg │ 10...

    java面试题目与技巧1

    │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt).rar │ │ │ └─javascript资料(源码,教材,ppt) │ 00s.jpg │ 10...

    java面试题及技巧4

    │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt).rar │ │ │ └─javascript资料(源码,教材,ppt) │ 00s.jpg │ 10...

    java面试题及技巧3

    │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt).rar │ │ │ └─javascript资料(源码,教材,ppt) │ 00s.jpg │ 10...

    java面试题以及技巧6

    │ 日企编码规范.doc │ 电信盈科面试题.pdf │ 速算.txt │ 面试题URL.txt │ ├─Javascript │ │ javascript资料(源码,教材,ppt).rar │ │ │ └─javascript资料(源码,教材,ppt) │ 00s.jpg │ 10...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    DTD是一种保证XML文档格式正确的有效方法,可以比较XML文档和DTD文件来看文档是否符合规范,元素和标签使用是否正确。一个DTD文档包含:元素的定义规则,元素间关系的定义规则,元素可使用的属性,可使用的实体或...

Global site tag (gtag.js) - Google Analytics