第一章主要讲的是编程风格部分的基本格式化。
一个严格按照一定规范来编写的项目,无论从可读性,可维护性,或者运行性能上来说,都是比无规范项目更胜一筹的。
基本的格式化包含以下几种:
1.缩进层级
良好的缩进能让多位开发人员更快的读懂代码,提高工作效率。
至于如何缩进,其实并没有一个统一的共识,但是在空格缩进和制表符缩进中,我主张制表符缩进,原因很简单:按钮数少。
2.语句结尾
说到语句结尾,其实在javascript中最常见的就是加不加分号,什么时候加分号的问题。
依赖于js分析器的自动分号插入(ASI)机制,javascript的代码省略分号也是可以正常工作的。但是,建议如果没特殊情况,分号还是不要省略,就像下面这段代码:
//原始代码 function getData() { return { title:‘java‘, author:‘zwr‘ } } //分析器会将它理解成 function getData() { return; { title:‘java‘, author:‘zwr‘ }; }
在代码中,函数getData()的本意是返回一个包含数据的对象。然而,return之后起了一行,导致return被插入一个分号,导致函数返回值是undefined。
当然,正常情况下我们都会让左花括号和return处于同一行,这样就不会有上面的问题。但是不排除有些不太正常的做法,为避免以上情况发生,建议加分号。
3.行的长度
总的来说,也借鉴了其他编程语言,javascript的一行长度最好在80个字符以内。
4.换行与空行
当一行长度达到了单行最大字符数限制时,就需要手动将一行拆成两行。通常我们会在运算符后换行,下一行会增加两个层级的缩进。换行位置也有一定的讲究,因为ASI机制会在某些场景下在行结束的位置插入分号。总是将一个运算符置于行尾,ASI就不会自作主张地插入分号,也就避免了错误的发生。如下示例:
//好的做法,在运算符后换行,第二行追加两个缩进 callFunction(document, element, window, "something", navigator); //不好的做法,在运算符之前就换行了 callFunction(document, element, window, "something" ,navigator);
至于空行,一般出现在:方法之间、方法中的局部变量和第一条语句之间、多行或者单行注释之前,总而言之,适当的使用空行可以提高代码可读性。
5.命名
只要是写代码,都会涉及变量和函数,因此变量和函数命名对于增强代码可读性至关重要。在JavaScript中,命名一般遵照驼峰式大小写命名法。驼峰式大小写命名法是由小写字母开始,后续每个单词首字母都大写。命名不仅是一门科学,更是一门技术,但通常来讲,命名长度应该尽量短,并抓住要点。同时,变量和函数的命名还需要区分开来。变量命名前缀应当是名词,以名词为前缀可以让变量和函数区分开来,因为函数名的前缀应当是动词。尽量在变量名中体现出值的数据类型。比如,命名count、length等可以表明数据类型是数字,而命名name、titile等可以表明数据类型是字符串。
常量的命名一般是用大写字母和下划线来命名,下划线以分隔单词,比如:
var MAX_COUNT = 10;
构造函数的命名采用大驼峰命名法来命名,比如:
function Person(name) { this.name = name; } var me = new Person("名字");
6.直接量
JavaScript中包含一些类型的原始值:字符串、数字、布尔值、null和undefined。同样也包含对象直接量和数组直接量。
//整数 var count = 10; //小数 var price = 10.0; var price = 10.00; //不推荐的小数写法:没有小数部分或者整数部分 var price = 10.; var price = .1;
null是一个特殊值,但我们有不少时间会将它和undefined搞混。理解null最好的方式是将它当作对象的占位符。
而undefined也是一个特殊值,其中一个让人困惑的地方时在于null === undefined 结果居然是true。然而,这两个值用途却不相同。那些没有被初始化的变量(一般是只被声明)都有一个初始值,即undefined,表示这个变量等待被赋值。
因为undefined常常和返回“undefined”的typeof运算符混淆,所以代码中尽量避免使用undefined。如下:
//不好的写法 var person; console.log(person === undefined); //true //好的写法,在当person是对象时; var person = null; console.log(person === null); //true
对象直接量是创建对象的一种做法,即:
//不好的写法 先显式创建Object实例再添加属性 var book = new Object(); book.title = "title"; //好的写法 对象直接量写法 var book = { title: "title" }
数组直接量写法和对象直接量写法类似,同样推荐。