JavaScript样式指南和代码约定、基本调试和最佳实践

一、JavaScript代码约定
代码约定(Coding conventions)指的是编程的样式指导方针。这些原则大体上包括:变量和函数的命名和声明规则、使用空格、缩进和注释的规则、编程习惯和准则等。代码约定可以确保质量、改善代码可读性、提升代码可维护性。代码约定可以是团队遵守的成文规则,也可以是您个人的编码习惯。
 
1.变量名
在W3School,我们对标识符名称(变量和函数)使用了驼峰式大小写。所有名称以字母开头。
 
2.运算符周围的空格
始终在运算符( = + - * / )周围以及逗号之后添加空格:
var x = y + z;
var values = ["Volvo", "Saab",  "Fiat"];
 
3.代码缩进
始终使用对代码块缩进使用4个空格。
 
4.函数
function toCelsius(fahrenheit) {
    return (5 / 9) * (fahrenheit - 32);
}
不要对缩进使用制表符。不同的编辑器对tab的解释也不尽相同。
 
5.语句规则
(1)简单语句的通用规则:始终以分号结束单条语句:
var values = ["Volvo", "Saab",  "Fiat"];
var person = {
    firstName: "Bill",
     lastName: "Gates",
    age: 50,
    eyeColor:  "blue"
};
(2)复杂语句(compound)的通用规则:在第一行的结尾处写开括号;在开括号前使用一个空格;在新行上写闭括号,不带前导空格;不要以分号来结束复杂语句;
A.函数:
function toCelsius(fahrenheit) {
    return (5 / 9) * (fahrenheit - 32);
}
B.循环:
for (i = 0; i < 5; i++) {
    x += i;
}
C.条件:
if (time < 20) {
    greeting = "Good day";
} else {
     greeting = "Good evening";
}
 
6.对象规则
(1)对象定义的通用规则:开括号与对象名放在同一行;在每个属性与其值之间使用冒号加一个空格;不要在最后一个属性值对后面写逗号;在新行上写闭括号,不带前导空格;始终以分号结束对象定义;
var person = {
    firstName: "Bill",
    lastName: "Gates",
    age: 50,
    eyeColor:  "blue"
};
(2)可以对短对象在一行中进行压缩,只在属性之间使用空格,就像这样:
var person = {firstName:"Bill", lastName:"Gates", age:50, eyeColor:"blue"};
(3)为了提高可读性,避免每行的长度超过 80 个字符。如果JavaScript语句超过一行的长度,换行的最佳位置是运算符或逗号之后。
document.getElementById("demo").innerHTML =
    "Hello Kitty."; 
 
7.命名约定
始终对所有的代码使用相同的命名约定。例如:变量和函数名以驼峰大小写来写;全局变量使用大写(我们不这样做,但是相当普遍);常量(比如 PI)使用大写;
(1)中划线
HTML和CSS中的连字符:HTML5属性能够以data-开头(data-quantity, data-price)。CSS在property-names中使用连字符(font-size)。Hyphens可被错误地视为减法运算符。JavaScript命名不允许使用连字符。
(2)下划线:
许多程序员喜欢使用下划线(date_of_birth),特别是在SQL数据库中。下划线经常被用在PHP参考资料中。
(3)帕斯卡命名法(PascalCase):C语言程序员经常使用帕斯卡命名法。
(4)驼峰大小写(camelCase):JavaScript本身、jQuery以及其他JavaScript库使用驼峰大小写。
(5)JavaScript命名请不要以$符号开头。此举会引起JavaScript库名称冲突。
 
8.在HTML中加载JavaScript
使用简单的语法来加载外部脚本(type 属性不是必需的):<script src="myscript.js"></script>
 
9.访问HTML元素
使用“不整洁的”HTML样式的后果,也许是导致JavaScript错误。
这两条JavaScript语句会产生不同的结果:var obj = getElementById("Demo")
var obj = getElementById("demo") 
如果可能,请在HTML 中使用相同的命名约定(就像 JavaScript 那样)。
 
10.文件扩展名
HTML文件应该使用 .html 扩展名(而非 .htm)。
CSS 文件应该使用 .css 扩展名。
JavaScript 文件应该使用 .js 扩展名。
 
11.使用小写文件名
大多数web服务器(Apache、Unix)对文件名的大小写敏感:london.jpg无法视作London.jpg进行访问。
其他web服务器(微软的 IIS)对大小写不敏感:london.jpg能够以London.jpg或london.jpg来访问。
如果混合使用大小写,则必须严格保持连续和一致。如果将站点从大小写不敏感的服务器转移至对大小写敏感的服务器,即使这种小错误也可能破坏您的网站。
为了避免这些问题,始终使用小写文件名(如果可能)。
 
12.性能
计算机不会使用代码约定。大部分规则对程序的执行影响很小。缩进和额外的空格对小段脚本并不重要。对于开发中的脚本,应该优先考虑可读性。应该缩小更大型的生产脚本。
 
二、JavaScript调试
 
在没有调试器的情况下写JavaScript是有难度的。代码中也许包含了语法错误,或者逻辑错误,这些都难以诊断。通常,如果JavaScript代码包含错误,也不会发生任何事情。不会有错误消息,并且不会有任何可供查找错误的指示信息。每当你尝试编写新的 JavaScript 代码,就可能发生错误。
 
1.JavaScript调试器
查找编程代码中的错误被称为代码调试。调试并不简单。但幸运地是,所有现代浏览器都有内置的调试器。内置的调试器可打开或关闭,强制将错误报告给用户。通过调试器,可以设置断点(代码执行被中断的位置),并在代码执行时检查变量。通常通过F12键启动浏览器中的调试器,然后在调试器菜单中选择“控制台”。
 
2.console.log()方法
如果浏览器支持调试,那么可以使用console.log()在调试窗口中显示JavaScript的值:
<!DOCTYPE html>
<html>
<body>
<h1>My First Web Page</h1>
<script>
a = 5;
b = 6;
c = a + b;
console.log(c);
</script>
</body>
</html>
 
3.设置断点
在调试窗口中,可在JavaScript代码中设置断点。在每个断点中,JavaScript将停止执行,以使您能够检查JavaScript的值。在检查值之后,可以恢复代码执行。
 
4.debugger关键词
debugger关键词会停止JavaScript的执行,并调用(如果有)调试函数。这与在调试器中设置断点的功能是一样的。如果调试器不可用,debugger语句没有效果。如果调试器已打开,此代码会在执行第三行之前停止运行。
var x = 15 * 5;
debugger;
document.getElementbyId("demo").innerHTML = x; 
 
4.主流浏览器的调试工具
通常,在浏览器中通过F12键启用调试,并在调试器菜单中选择“控制台”。
 
三、JavaScript最佳实践
 
请避免全局变量、new、===、eval()
 
1.避免全局变量
(1)尽量少地使用全局变量。它包括所有的数据类型、对象和函数。全局变量和函数可被其他脚本覆盖。
(2)使用局部变量替代,并学习如何使用闭包。始终声明局部变量,所有在函数中使用的变量应该被声明为局部变量。局部变量必须通过var关键词来声明,否则它们将变成全局变量。
(3)严格模式不允许未声明的变量。
(4)在顶部声明,一项好的编码习惯是把所有声明放在每段脚本或函数的顶部。这么做的好处是:获得更整洁的代码;提供了查找局部变量的好位置;更容易避免不需要的全局变量;减少不需要的重新声明的可能性;
(5)初始化变量,在声明变量时对其进行初始化是个好习惯。这么做的好处是:更整洁的代码;在单独的位置来初始化变量;避免未定义值。变量初始化使我们能够了解预期用途和预期的数据类型。不要声明数值、字符串或布尔对象始终将数值、字符串或布尔值视作原始值。而非对象。如果把这些类型声明为对象,会拖慢执行速度,并产生讨厌的副作用。
 
2.勿使用new Object()
(1)变量替代
使用 {} 来代替 new Object()
使用 "" 来代替 new String()
使用 0 来代替 new Number()
使用 false 来代替 new Boolean()
使用 [] 来代替 new Array()
使用 /()/ 来代替 new RegExp()
使用 function (){}来代替 new Function()
(2)意识到自动类型转换
数值会被意外转换为字符串或NaN(Not a Number)。JavaScrip属于松散类型。变量可包含不同的数据类型,并且变量能够改变其数据类型:如果进行数学运算,JavaScript 能够将数值转换为字符串;用字符串减去字符串,不会产生错误而是返回 NaN(Not a Number)。
 
3.使用 === 比较
== 比较运算符总是在比较之前进行类型转换(以匹配类型)。
=== 运算符会强制对值和类型进行比较:
(1)使用Parameter Defaults
如果调用函数时缺少一个参数,那么这个缺失参数的值会被设置为undefined。undefined值会破坏代码。为参数设置默认值是一个好习惯。
(2)用default来结束switch
使用default来结束switch语句。即使您认为没有这个必要。
 
4.避免使用eval()
eval()函数用于将文本作为代码来允许。在几乎所有情况下,都没有必要使用它。因为允许任意代码运行,它同时也意味着安全问题。