第一章 基本格式化
程序是写给人看的,只是偶尔让机器执行一下而以 ----Donald Knuth
一、代码缩进格式
以四个字符为缩进代码
二、语句结尾写“ ; ”号
三、行的长度:一行最好不要超过80个字符。
四、换行:
当一行的长度达到了单行最大字符,需要手动将拆成两行,通常在拆行后增加两个缩进
if语句拆成最后要是一个运算符,如果是变量相加,拆行要与开头
if(a != undefined || b != undefined || c != undefined || d != undefined || e != undefined || f != undefined || g != undefined || f != undefined) var sHTMl = "name" + "name" + "name" + "name" + "name" + "name" + "name" + "name" + "name";
五、空行:
1 // 1、语句之间使用空行 2 for(var i= 0, len=oArr.length; i<len; i++){ 3 4 if(oArr[i] == "10"){ 5 console.log("ok"); 6 } 7 8 } 9 10 // 2、两个方法之间使用空行 11 var obj = { 12 fn1: function(){ 13 14 }, 15 16 fn2: function(){ 17 18 } 19 } 20 21 // 3、方法中的局部变量第一条语句使用空行 22 function fn3(){ 23 var sN = 2; 24 25 if(sN == 2){ 26 return true; 27 } 28 } 29 30 // 4、多行和单行注释之前使用空行 31 var aa = "name is who"; 32 33 /* 这里是单行注释 */ 34 35 // 5、方法内的逻辑片段之间插入空行
六、命名:
1、驼峰式命名:getName
2、匈牙利命名法:sName,s表示字符串,n表示整数,o表示对象,b表示布尔值,
七、变量和函数命名:
1、变量好的写法:var nCount = 10; var sName = "siguang"; 不好的写法:var getCount = 10; var isFound = true; 看起来象方法,前缀名要用名词
例:name、count、length、size,title、message、
2、函数好的定法:function getName() { return sName; } 前缀使用动词,如get、set、is、has、can
3、单个字符命名通常用在循环中使用,如i,j,k
八、常量:
JS中没有真正的常量,不被改变的
常量使用大写字母和下划线来命名: MAX_COUNT
九、构造函数:
函数名以大写字母为开头: function Person(name) { this.name = name; }
十、null和undefined
console.log(null == undefined); // true;
console.log(null === undefined); // false
它当作对象的点位符:var oFun = null; oFun = function(){ return sName; }
变量的如果不定义值 var oFun; console.log(oFun); // 会返回报错undefined
1 var person; 2 console.log(person == undefined); // 不好的写法 3 console.log(typeof person == "undefined"); // 好的写法,注意typeof 返回的是字符串
十一、对象直接量
不推荐的写法:
var book = new Object();
book.title = "javasript";
book.autor = "Nick";
推荐的写法:
book = { title: "javascript", autor:"Nick" };
十二、数组直接量
不推荐的写法:
var oArr = new Array(1, 2, 4, 6);
推荐写法:
var oArr = [1, 2, 4, 6];
第二章 注释
一、单行、多行注释
单行:
1、独占一行注释,用来解释下一行代码注释之前总是有一行空格
2、代码行尾部,代码结束到注释至少有一个缩进
3、被注释掉的多行
1 <script> 2 if(condtion){ 3 4 // 解释下一行语句注释 5 allowed(); 6 } 7 8 if(condtion){ 9 var result = something; // 这里放注释 10 } 11 </script>
2、多行注释
要与上一行之间空一行
1 <script> 2 /* 3 * 这里是一个购物类 4 * / 5 (function(){ 6 function shoping(){ 7 if(condtion){ 8 9 // 解释下一行语句注释 10 allowed(); 11 } 12 } 13 })(); 14 </script>
3、难于理解的代码
对于逻辑性较强的代码需要用注释来说明,以便后续人员来维护
二、文档注释
来描述整个文档的信息,包括文档的功能模块,作者、创建日期,大概描述
三、注释声明
1、TODO:说明代码还未完成,应当包含下一步要做的事情
2、HACK:包含为什么使用hack的原因
3、XXX:说明代码有问题尽快修复
4、FIXME:说明代码有问题尽快修复,重要性略次于XXX
5、REVIEW:说明代码任何可能改动需要代码评审
1 // TODO 希望找到更好的方法解决 2 doSomeing(); 3 4 /* 5 * hack:不能针对IE做出处理,计划有时间重写这块 6 */ 7 if (document.all) { 8 doSomeing(); 9 }
第三章 语句和表达式
一、语句
无论是if、for、while、do...while、try... catch都需要加 {}
二、花括号的对齐方式
1 <script> 2 for(var i=0; i<len; i++){ 3 if(condtion){ 4 allowed(); 5 }else{ 6 doSomeing 7 } 8 } 9 </script>
三、switch语句中是否需要default语句
无论defalut语句中是否存在意义,都需要添加,每个case语句之间都加一个空行
1 switch (name) { 2 case "1": 3 console.log("aa"); 4 break; 5 6 case "2": 7 console.log("aa"); 8 break; 9 10 default : 11 break; 12 }
四、if语句间隔
if括号的前端都加一个空格
1 if (condition) { 2 .... 3 } else if (conditions) { 4 .... 5 }
五、运算符前后使用空格来保持代码整洁
1 if (found) { 2 doSomeing(); 3 }
第四章 变量、函数和运算符
一、声明变量
变量声明一般在函数顶部,初始化逻辑跟在后面
使用var 将所有变量合并成一个语句:
好的写法:
var name = "siguang",
age = 20,
timer = null;
不好的写法:未声明的写到了前面
var name,
age = 20;
二、函数的声明
和变量声明一样,函数声明也会被javascript引擎收录
1 <script> 2 function doSomeing(){ // 先定义 3 4 } 5 doSomeing(); // 在引用 6 </script>
三、立即调用函数
1 <script> 2 // 将匿名函数赋给一个变量 3 var someing = function(){ 4 // 函数体 5 } 6 7 // 自动执行不好的写法 8 var doSomeing = function(){ // 先定义 9 return { 10 message: null 11 }; 12 }(); 13 14 // 好的写法 15 var doSomeing = (function(){ 16 return { 17 messgae: null 18 } 19 })(); 20 </script>
四、对象的私有属性和方法使用下划线开头
1 var obj = { 2 _count: 10, 3 4 _getCount: function(){ 5 return this._count; 6 } 7 }
第五章 UI层的耦合性
一、将CSS从JS中抽离出来
1 .box{ 2 expiression(document.body.offsetWidth + "px"); 3 } 4 5 // 不好的写法 6 var element = document.getElementById("box"); 7 element.style.width = 20 + "px"; 8 element.style.height = 40 + "px"; 9 element.style.top = 5 + "px"; 10 11 // 将css抽离出来 12 .st { 20px; height:40px; top:5px;} 13 14 element.className = "st";
二、将javascript从HTML中抽出
不好的写法:
1、<button onclick="doSomeing">click me</button> // 嵌到html标签中
2、另一种是使用<script>标签
<script>
doSomeing();
</script>
第6章 避免使用全局变量
一、全局变量带来的问题
function sayColor(){
alert(color);
}
1、命名冲突:color为全局变量,如果其它地方也引用了这个变量就会有问题存在
2、代码的脆弱:如果color没有定义,程序就会报错
二、使用命名空间来避免全局的污染
1 var YUI = YUI || {}; 2 3 YUI.Dom = { 4 // 操作DOM 5 } 6 7 YUI.Event = { 8 // 操作事件 9 }
三、模块化
可以使用Sea.js来模块化代码,对模块的依赖和一个工厂方法
三、零全局污染
1 (function(win){ 2 function fn1(){ 3 // 方法一 4 } 5 6 fn1(); // 执行 7 })(window);
第8章 避免“空比较”
1 <script> 2 // 变量与null的比较,用来判断变量是否被赋予了一个合理的值(这种用法有问题) 3 var controller = { 4 pro: function(){ 5 if(items !== null){ // 不好的写法 6 items.sort(); 7 } 8 } 9 } 10 </script>
需要改成
if( typeof items !== null){ // 使用用typeof来返回类型 }
第四章 错误处理
一、问题类型:
问题类型分两种:程序员错误
二、异常
throw是引发异常的关键字,try放置引发异常的代码,catch会执行代码
三、Error对象
catch(error){ },输出错误消息
属性:error.message输出错误消息
第五章 浏览器的嗅探
一、navigator.userAgent
1 // 不好的写法 2 if(navigator.userAgent.index("MSIE") > -1){ 3 // 是IE 4 } 5 else{ 6 // 不是IE 7 }
二、特性检测
1 来测试浏览器是否支持 2 3 // 不好的写法 4 if(navigator.userAgent.indexOf("MSIE 7") > -1){ 5 // 6 } 7 8 // 好的写法 9 if(document.getElementById){ 10 11 }