`
ibelieve1314love
  • 浏览: 19002 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

转:JavaScript 基本编码规范

阅读更多

转自:http://www.nowamagic.net/librarys/veda/detail/1629

 

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

许多激烈的争论发生会议上或是邮件列表上,问题往往针对某些代码规范的特定方面(例如代码缩进,是Tab制表符键还是space空格键)。如果你是 你组织中建议采用规范的,准备好面对各种反对的或是听起来不同但很强烈的观点。要记住,建立和坚定不移地遵循规范要比纠结于规范的细节重要的多。

缩进(Indentation)

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

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

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

01 function outer(a, b) {
02      var c = 1,
03          d = 2,
04          inner;
05      if (a > b) {
06          inner = function () {
07              return {
08                  r: c - d
09              };
10          };
11      } else {
12          inner = function () {
13              return {
14                  r: c + d
15              };
16          };
17      }
18      return inner;
19 }

花括号{}(Curly Braces)

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

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

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

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

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

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

1 // 好的实例
2 for ( var i = 0; i < 10; i += 1) {
3     alert(i);
4 }

if条件类似:

01 // 坏
02 if ( true )
03     alert(1);
04 else
05     alert(2);
06  
07 // 好
08 if ( true ) {
09     alert(1);
10 } else {
11     alert(2);
12 }

左花括号的位置(Opening Brace Location)

开发人员对于左大括号的位置有着不同的偏好——在同一行或是下一行。

01 if ( true ) {
02     alert( "It's TRUE!" );
03 }
04  
05 //或
06  
07 if ( true )
08 {
09     alert( "It's TRUE!" );
10 }

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

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

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

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

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

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

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

空格(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 () {};

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

01 // 宽松一致的间距
02 // 使代码更易读
03 // 使得更加“透气”
04 var d = 0,
05      a = b + 1;
06 if (a && b && c) {
07      d = a % c;
08      a += d;
09 }
10  
11 // 反面例子
12 // 缺失或间距不一
13 // 使代码变得疑惑
14 var d = 0,
15      a = b + 1;
16 if (a&&b&&c) {
17      d=a % c;
18      a+= d;
19 }

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

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

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

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

命名规范(Naming Conventions)

另一种方法让你的代码更具可预测性和可维护性是采用命名规范。这就意味着你需要用同一种形式给你的变量和函数命名。下面是建议的一些命名规范,你可以原样采用,也可以根据自己的喜好作调整。同样,遵循规范要比规范是什么更重要。

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

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

1 var adam = new Person();

因为构造函数仍仅仅是函数,仅看函数名就可以帮助告诉你这应该是一个构造函数还是一个正常的函数。命名构造函数时首字母大写具有暗示作用,使用小写命名的函数和方法不应该使用new调用:

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

分隔单词(Separating Words)

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

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

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

ECMAScript的属性和方法均使用Camel标记法,尽管多字的属性名称是罕见的(正则表达式对象的lastIndex和ignoreCase属性)。

其它命名形式(Other Naming Patterns)

有时,开发人员使用命名规范来弥补或替代语言特性。例如,JavaScript中没有定义常量的方法(尽管有些内置的像Number, MAX_VALUE),所以开发者都采用全部单词大写的规范来命名这个程序生命周期中都不会改变的变量,如:

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

还有另外一个完全大写的惯例:全局变量名字全部大写。全部大写命名全局变量可以加强减小全局变量数量的实践,同时让它们易于区分。

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

01 var person = {
02      getName: function () {
03          return this ._getFirst() + ' ' + this ._getLast();
04      },
05  
06      _getFirst: function () {
07          // ...
08      },
09      _getLast: function () {
10          // ...
11      }
12 };

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

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

  • 使用尾下划线表示私有,如name_和getElements_()
  • 使用一个下划线前缀表_protected(保护)属性,两个下划线前缀表示__private?(私有)属性
  • Firefox中一些内置的变量属性不属于该语言的技术部分,使用两个前下划线和两个后下划线表示,如:__proto__和__parent__。

注释(Writing Comments)

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

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

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

分享到:
评论

相关推荐

    JavaScript 程序编码规范

    JavaScript 程序编码规范,编程基本功。

    应用组JavaScript编码规范

    本文描述了应用组开发JAVASCRIPT程序的一些基本规范。包括变量声明、函数声明、异常处理等的一些规范和说明。

    kata-boilerplate:JavaScript 编码 Dojo Kata 样板

    JavaScript 编码 Dojo Kata 样板这是一个样板存储库,其中包含用于启动 Coding Dojo 部分的基本文件。 这包括:初始设置使用git clone git@github.com:joaostein/kata-boilerplate.git您机器上的存储库将文件rename....

    u1_lesson_js_data_types:JavaScript和数据类型简介

    在本课程中,我们将介绍最核心和最基本的编码语言之一JavaScript。 我们将练习实现一些JS代码。 我们将讨论JS数据类型及其用法。 目标 了解什么是JavaScript 执行一些JavaScript代码 了解JavaScript数据类型 课程...

    JavaScript基本编码模式小结

    无论编写任何程序都会接触到编码风格,设计模式等概念,编码风格一般侧重于书写规范,而设计模式则偏向于程序架构设计。本文中笔者整理的这些“模式”包含了编写JavaScript代码时一些常用的方法或者小技巧,可以帮助...

    guidelines:搜狐媒体产品技术中心编码规范

    guidelines搜狐媒体产品技术中心编码规范通用项HTML、CSS、Javascript 全部使用2格缩进。文件名采用REST风格,使用复数名词,小写,如存在层级关系则放入子目录中,使用-分割单词,例如:users.htmlusers/(index|...

    JavaScript编码风格指南(中文版)

    本指南来自于《编写可维护的JavaScript》这本书,基于”Java语言编码规范”和Crockford的JavaScript编程规范,还有Nicbolas的一些个人经验和喜好。写作本文旨在加深自己印象,也为了更多人的了解到JS编码风格,提高...

    hj-check-style:代码规范检测

    JavaScript 编码规范 每个人或者每个公司都应该有一个 JavaScript 的编码规范,而且这个规范一般是不会变的, 我们可以要求每人在项目目录或者个人目录下放上 .jshintrc 或 .jscsrc 或 .eslintrc, 但你不觉得这样很...

    LaTeX_Listings_JavaScript_ES6:LaTeX清单软件包不包含JavaScriptECMAScript的语言规范,这填补了过渡期间的空白

    LaTeX包不包含(默认情况下)JavaScript / ECMAScript的语言规范。 但是,该软件包提供了基于内置方法创建自定义语言和样式的功能。 这些方法用于创建JavaScript和ES6的列表语言(ECMAScript 2015)。 基本...

    Kotlin语言文档 中文高清免费版

    编码规范 24 基础 26 基本类型 26 包 ...

    Kotlin 语言文档

    编码规范 24 基础 26 基本类型 26 包 31 控制流:if、when、for、while 33 返回和跳转 36 类与对象 38 类和继承 38 属性和字段 43 接口 46 可⻅性修饰符 48 扩展 50 数据类 54 密封类 55 泛型 56 嵌套类与内部类 61 ...

    Kotlin官方参考文档中文版

    编码规范 基础 基本类型 包 控制流 返回与跳转 类与对象 类与继承 属性与字段 接口 可见性修饰符 扩展 数据类 密封类 泛型 嵌套类 枚举类 对象 2 1.5.12 1.5.13 1.6 1.6.1 1.6.2 1.6.3 1.6.4 1.7 1.7.1 1.7.2 1.7.3 ...

    javascript入门笔记

    3、变量名命名规范 1、由字母,数字,下划线以及 $ 组成 var user_name; 正确 var user-name; 错误 var $uname; 正确 2、不能以数字开头 var 1name;错误 3、不能使用JS中的关键字 和 保留关键字 4、变量名...

    plasma-mvp-rootchain:根据Plasma MVP规范执行智能合约

    等离子体MVP 实施注意: develop分支包含根链...根合同详细信息事务以以下形式编码: RLP_ENCODE([ [Blknum1, TxIndex1, Oindex1, DepositNonce1, Input1ConfirmSig, Blknum2, TxIndex2, Oindex2, DepositNonce2, In

    初级java笔试题-is-has-get:一个用于javascript的微型实用程序库

    Javascript 微型库,用于获取数据类型、结构、浏览器规范或 DOM 元素的基本本体。 它旨在支持轻量级任务(类型检查、数据转换等),这些任务解决起来相当简单,但又不那么琐碎,不会在你向前编码时阻碍你。 如果某物...

    weixin115音乐播放器的设计与实现+ssm(源码+部署说明+演示视频+源码介绍+lw).rar

    代码规范:遵循一定的编码规范,便于阅读和维护。 注释说明:关键部分会有详细的注释,帮助理解代码逻辑。 演示视频: 提供了一个直观的方式来展示音乐播放器的功能和操作流程。 学习文档(LW): 包含项目的...

    umrn:用纯JavaScript编写的Cinco独特MIDI路由编号规范的轻量级,符合标准的实现

    UMRN规范并非设计为可扩展的,因此,所有UMRN都应遵守确切的标准,而UMRN不能包含明确声明支持该规范中定义之外的其他功能的元数据。 结构 UMRN的设计紧凑,易于阅读且易于记忆。 以以下UMRN为例: ...

    ECMAStrict:用 Python 编写的 JavaScript 词法分析器、解析器和解释器(为了好玩)

    作为编码挑战,在晚上和周末,我一直在实现 ECMAScript 语言规范的词法分析器、解析器和运行时。 我选择 Python 作为语言,以便我可以使用出色的实现。 我的目标不是 100% 完成,可能是类似于“严格模式”的语言...

    code-specifications:有来自DaHU的官方代码规范

    特征此代码规范包含以下两个字符: 标准本地编码: 我们使用获得基本格式支持。 请参阅配置文件 。 我们用和VSCode编辑器设置editor.formatOnSave的格式代码的编码时间。 请参阅配置文件 。 我们使用来补充 。 请...

Global site tag (gtag.js) - Google Analytics