为什么要编写可维护的javascript?软件生命周期成本的80%消耗在维护上。几乎所有的软件维护者都不是其原始作者。编码约定提高了软件的可读性,使工程师能够快速、全面地理解新代码。第1部分:编程风格程序是为人类阅读而编写的,只是偶尔让计算机执行以下操作。——Knuth一、基本格式化1、缩进级别如何处理缩进,几乎是所有语言讨论的第一件事。缩进甚至关系到软件工程师的价值观!第一种缩进:使用制表符进行缩进。例如:jQuery核心风格,Dojo编程风格。第二种缩进:使用空格进行缩进。例如:Google的javascript规定使用两个空格进行缩进。建议:4个空格字符为一个缩进级别,可以在编辑器中配置Tab键插入4个空格。2.无论语句末尾加不加分号,代码都可以正常运行。看到这里之前,你可能不知道这是分析器的自动分号插入机制(ASI)在偷偷帮你干活。俗话说:常在河边走,怎能不湿鞋?看看下面的代码。functiongetData(){return{text:'看看不加分号的后果!'}}ASI将被解析如下:functiongetData(){return;{text:'看看不加分号的后果!'};}所以如果你调用上面的getData方法,它会返回undefined。但是你不能为此责怪分号。谁让你在下一行写大括号的?(反正我看到第一个花括号和前面的语句不在同一行,我都快疯了。)//这段代码没问题,虽然没有分号functiongetData(){return{text:'看看加分号的后果!'}}3.行的长度:一般为80个字符。如果一行超过80个字符,则应在操作符(逗号、加号等)后换行。下一行应该缩进两级。4.命名计算机科学中只有两个难题:缓存失效和命名。ECMAScript遵循驼峰命名法。所谓骆驼案,正式名称为“CamelCase”。它以小写字母开头,每个后续单词的首字母大写。//例如,varthisIsMyName;变量命名前缀应该是名词。函数名称应以动词为前缀。//变量varmyName='chen';//函数名functiongetName(){returnmyName;}5.常量在ECMAScript6之前,javascript中并没有真正意义上的常量概念。遵循C语言的约定,名字用大写字母加下划线,单词之间用下划线隔开。varMAX_COUNT=10;//现在我们应该也可以定义常量了constMAX_COUNT=10;6.构造函数的命名构造函数的命名遵循大驼峰命名法(PascalCase),为什么呢?因为命名约定与本地语言一致,newRegExp(),正则本身就是一个内置的构造函数,看到大驼峰了吗?科普一下:PascalCase和CamelCase都是“驼峰案例”的意思,区别在于:PascalCase以大写字母开头,所以又叫大驼峰,例如:AnotherName;CamelCase以小写字母开头,后面是Capitized这个词的首字母,所以也叫小驼峰,比如:anotherName,小驼峰在之前的命名部分有提到过。7、直接量直接量可以这样理解。是不需要特殊封装就可以在程序中直接使用的数据。2//Numberliteral"Qixin"//Stringliteral[1,2,3]//Arrayliteraltrue//Booleanliteral{name:"Qixin"}//Objectliteral(function(){})()//Function直接量/*分割线*/newString("Itsheart")//这不是直接量。在直接数量上强调null,我经常误会,用Casual,现在知道的很清楚,应该在下面的场景下使用。用于初始化可以分配给对象的变量。用于与初始化变量进行比较,该变量可能是也可能不是对象。当函数的参数预期为对象时用作输入和输出参数。当期望函数的返回值是一个对象时,将其作为返回值传递。理解null的最佳方式是将其作为对象的占位符。直接量的使用简洁高效,值得提倡,谨记这一点。二、注释1、单行注释单行注释有三种使用方式:占一行的注释用于解释下一行代码。此行注释前必须始终有一个空行,缩进级别应与下一行代码保持一致。//写的好functionprint(){//consoleoutputnumber1console.log(1);}在代码行末尾注释。代码末尾和注释之间至少有一个缩进。注释(包括前面的代码部分)不应超过单行的最大字符数。如果超过,这个注释应该放在当前代码之上。被注释掉的中断代码。//写得好//functionprint(){//console.log(1);//}2.多行注释更喜欢Java风格的多行注释/**Thisisacomment*ThiscommentcontainstwoThere也应该是行文本*/多行注释前的空行,缩进级别要和它描述的代码一致。3.文档注释还有一点要提到的是文档的注释。多行注释以单斜杠和双星号(/**)开头,后面是描述信息,其中@符号用于表示一个或多个属性。/***提交JSON数据*@paramactionUrl交互URL*@paramjsonJSON数据*@parampostSuccessFn提交成功回调函数*@parampostFailFn提交失败方法*@paramisAsync是否异步提交,true:yes*@paramtimeout请求时限*/3.语句和表达式首先,以下两种写法是合法的JavaScript代码,但不推荐使用。//写得不好if(condition)doSomething();//写得不好if(condition)doSomething();1.大括号对齐第一种方式是将左大括号放在第一行代码的块语句末尾。这种风格继承自Java。如果(条件){doSomething();}else{doSomethingElse();}第二种样式将花括号放在块语句第一行之后的行上。这在C#中变得流行。如果(条件){doSomething();}else{doSomethingElse();}为了避免自动插入分号导致错误(还记得前面提到的“ASI”),建议使用第一个大括号对齐。2、switch的缩进可以直接使用默认的编辑器。唯一要提的是,如果程序没有默认行为,默认可以省略。四、变量、函数和运算符1、变量推荐使用局部变量的定义作为函数中的第一条语句。推荐使用单条var语句,每个变量的初始化占一行。对于未初始化的变量,它们应该出现在var语句的末尾。functiondoSomething(items){varvalue=10,result=value+10,i,len;for(i=0,len=items.length;i
