drupal8 javascript

  1. JavaScript 编码规范建议
    1. JavaScript 文件引用
    2. 代码排版
      1. 行长度
      2. 行结束
      3. 缩进
      4. 注释
      5. 标识符命名
      6. 声明
        1. 变量的声明
        2. 函数的声明
      7. 语句
      8. 特殊符号
        1. 空白符
        2. { } 和 [ ]
      9. == 和 ===
        1. +

JavaScript 编码规范建议

本文就 JavaScript 编码过程中涉及的排版、命名、声明、作用域、及一些特殊符号的使用等方面,根据个人在学习工作中的总结,给出自己的一些建议,并分析其中缘由,以供参考。

JavaScript 文件引用

JavaScript 程序应该尽量放在 .js 的文件中,需要调用的时候在 HTML 中以<script src="filename.js">的形式包含进来。JavaScript 代码若不是该 HTML 文件所专用的,则应尽量避免在 HTML 文件中直接编写 JavaScript 代码。因为这样会大大增加 HTML 文件的大小,无益于代码的压缩和缓存的使用。
另外,<script src="filename.js">标签应尽量放在文件的后面。这样会降低因加载 JavaScript 代码而影响页面中其它组件的加载时间。

代码排版

行长度

每行代码应小于 80 个字符。如果代码较长,应尽量选择换行,下一行代码应缩进8 个空格。这样可以使代码排版整齐,减轻阅读代码的疲劳感。

行结束

JavaScript 语句应该以分号结束。但大多数浏览器允许不写分号,只要在本应是分号的地方有一个换行符就行。但是如果代码行较长需要换行的时候,有哪些注意事项呢?换行应选择在操作符和标点符号之后,最好是在逗号’,’之后,而不要在变量名、字符串、数字、或’)’ ‘]’ ‘++’ ‘–’等符号之后换行。
这样可以有效的防止拷贝、粘贴而引起的错误,并可有效地增强代码的可阅读性。

缩进

本文提倡用 2个空格 来进行缩进,并在同一产品中采用同一种缩进标准。不支持用TAB键进行缩进,这是因为直到现在还没有统一的标准来定义 TAB 键所代替的空白大小,有些编辑器解析为 4 个空格大小,有些则解析为 8 个。

注释

单行注释规范:

1
2
// Init variable count.
var count = 0;

以”//“开头,然后有一个空格,第一个单词的首字母需要大写,
当然要是中文的话就无所谓了,最后要以英文句号“.”结尾

还有一种块级注释/*....*/用作对整个代码段的注销,或较正式的声明中,如函数参数、功能、文件功能等的描述中。

标识符命名

JavaScript 中的标识符的命名规则:

变量、参数、成员变量、函数等名称均以小写字母开头,构造器的名称以大写字母开头。下划线_开头的变量一般习惯于标识私有 / 局部成员。而美元符号$开头的变量习惯于标识系统相关,比如系统进程等。应避免用下划线_或美元符号$来命名标识符。尽可能地降低代码的阅读负担。

声明

变量的声明

尽管 JavaScript 语言并不要求在变量使用前先对变量进行声明。但我们还是应该养成这个好习惯。这样可以比较容易的检测出那些未经声明的变量,避免其变为隐藏的全局变量,造成隐患。

在函数的开始应先用 var 关键字声明函数中要使用的局部变量,注释变量的功能及代表的含义,且应以字母顺序排序。每个变量单独占一行,以便添加注释。这是因为 JavaScript 中只有函数的 {} 表明作用域,用 var 关键字声明的局部变量只在函数内有效,而未经 var 声明的变量则被视为全局变量。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script language="javascript">
var valueA = 'a';
var valueB = 'b';
function f1() {
var valueA = 'c';
// Output: valueA=c.
alert('valueA=' + valueA);
valueB = 'd';
// Output: valueB=d.
alert('valueB=' + valueB);
}
f1();
// Output: valueA=a.
alert('valueA=' + valueA);
// Output: valueB=d.
alert('valueB=' + valueB);
</script>

从上例的输出惊奇地发现,用 var 声明过的变量 valueA 和没有声明的变量 valueB 是有区别的。特别需要注意的是,在函数内部用 var 声明的变量为局部变量,这样可以有效地避免因局部变量和全局变量同名而产生的错误。

函数的声明

函数也应在调用前进行声明,内部函数应在 var 声明内部变量的语句之后声明,可以清晰地表明内部变量和内部函数的作用域。

此外,函数名紧接左括号’(‘之间,而右括号’)’和后面的’{‘之间要有个空格,以清楚地显示函数名以其参数部分,和函数体的开始。若函数为匿名 / 无名函数,则 function 关键字和左括号’(‘之间要留空格,否则可能误认为该函数的函数名为 function。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<script language="javascript">
var innerA = 1;
function outF() {
var innerA = 2;
function _inF() {
alert('valueA=' + innerA);
}
_inF();
}
// Output: valueA=2.
outF();
// Error: innerF is not defined.
_inF();
</script>

从上面例子的输出可以看出,inF() 函数仅在 outF() 函数的内部生效,局部变量 innerA 对内部函数的作用域生效。这样的编码方式使得变量和函数的作用域变得清晰。

语句

对于简单语句而言,需要提及的仍然是分号必要性,同时,一行最多有一个语句。如果一个赋值语句是用函数和对象来赋值,可能需要跨多行,一定切记要在赋值语句末加上分号。
这是因为 JavaScript 中,所有表达式都可以当语句,遇换行符时会解析为表达式的结束,此时不规范的换行和分号的丢失,可能引入新的错误。
对于复合语句,if, for, while, do, switch, try … catch 等代码体,函数定义的函数体,对象的定义等都需要放在花括号’{}’里面。

return 语句在使用时也需慎重,如果用表达式的执行作为返回值,请把表达式和return 放在同一行中,以免换行符被误解析为语句的结束而引起返回错误。return 关键字后若没有返回表达式,则返回 undefined。构造器的默认返回值为 this。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script language="javascript">
function F1() {
var valueA = 1;
var valueB = 2;
return valueA + valueB;
}
function F2() {
var valueA = 1;
var valueB = 2;
return
valueA + valueB;
}
// Outut: 3.
alert( F1() );
// Output: undefined.
alert( F2() );
</script>

上例中,因返回表达式没有和 return 关键字放在同一行而引起的返回错误,需重视。

特殊符号

空白符

适当的空白行可以大大提高代码的可阅读性,可以使代码逻辑更清晰易懂。同时,在表达式中适当的留空白,也会给代码的阅读带来方便。

关键字的后面如有括号,则最好在关键字和左括号’(‘之间留空白,如 for, if, while 等。而函数名和括号之间则不宜留空白,但若是匿名函数,则必须在 function 和左括号’(‘之间留空白,否则,编辑器会误认为函数名为 function。

在表达式中,二元运算符 ( 除左括号’(‘,左方括号’[‘,作用域点’.’) 和两个操作数之间最好留空白。一元运算符(若不是词 typeof 等)和其操作数之间不宜留空白。

逗号’,’的后面需要留空白,以显示明确的参数间隔,变量间隔等。

分号’;’之后通常表明表达语句的结束,而应空行。在 for 的条件语句中,分号之后则应该留空白。

{ } 和 [ ]

在 JavaScript 中,如需定义空对象和空数组,通常很自然地想到用 new Object() 和 new Array() 的方法。其实花括号’{}’和方括号’[]’可以直接用来定义一个空对象和一个空数组。这种书写方法可以使代码看起来简单易懂。

== 和 ===

判断”逻辑等”在代码里太平常的不过事情了,但 JavaScript 与其他熟知的编程语言不同的是,除了可以使用两个等号’==’来作判断以为,还可以使用三个等号’===’来进行逻辑等判断。两者的不同是’==’作逻辑等判断时,会先进行类型转换后再进行比较。’===’则不会。因而,’==’进行的判断结果可能产生偏差。’!=’与’!==’的区别亦是如此。本文提倡尽量使用’===’来进行逻辑等的判断,用’!==’进行逻辑不等的判断。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script language="javascript">
var valueA = "1";
var valueB = 1;
if ( valueA == valueB) {
alert("Equal");
}
else {
alert("Not equal")
}
// Output: "Equal".
if ( valueA === valueB) {
alert("Equal");
}
else {
alert("Not equal")
}
// Output: "Not equal".
</script>

上例中,valueA 和 valueB 两个变量的值显然是不相等的,起码 valueA 是个字符串,而 valueB 是一个数字。但用’==’进行判断是,程序却输出相等的字样。这是因为编译器对两个变量进行比较时,因为他们的类型不同,而自动地将 valueB 转换成字符串,而后再和 valueA 进行比较的。用’===’得到的判断结果正和预期的结果相符。

+

加号’+’也同样是程序员所熟知的操作符之一。JavaScript 和其他编程语言不同的是,在 JavaScript 中,’+’除了表示数字值相加,字符串相连接以外,还可以作一元运算符用,把字符串转换为数字。因而如果使用不当,则可能与自增符’++’混淆而引起计算错误。这一点,在清单 7 中可以清楚地看出。

1
2
3
4
5
6
7
8
9
10
11
12
<script language="javascript">
var valueA = 20;
var valueB = "10";
// Ouput: 2010.
alert( valueA + valueB);
// Ouput: 30.
alert( valueA + (+valueB));
// Ouput: 30.
alert( valueA + +valueB);
// Compile error.
alert( valueA ++valueB);
</script>
script>