基础的JavaScript编码规范
来源:互联网 发布:全民枪战辅助软件 编辑:程序博客网 时间:2024/05/10 04:58
/* * 前言 * 这个文档摘自Nicbolas C Zakas(担任过雅虎首席前端工程师) 著作 《编写可维护的 JavaScript》,下面是一些摘要 * 这个文档讲了一些很基本的编写JavaScript 代码的规范,很基础,但是很重要 * 良好的代码格式可以让代码结构和逻辑看起来更清晰,更美观,也更利于维护,尤其是维护问题。除非 * 写完一段代码你以后都不用再看它了(但这基本是不可能的),请一定让自己养成一个良好的 * 编写代码的习惯,否则这就是在给自己和后来的人挖坑。 */一、基本的编写规范 1、缩进和空格,正确的缩进能够明确代码结构,规范的缩进示例 // 最基本的结构缩进 if(true){ alert(); } // 换行缩进,换行后应该有两个制表符的缩进 function(name, age, gender, class, school){ alert(); } // 运算符的边都应该有空格 var name = ""; if(true && true){ } 2、语句结尾,JavaScript可以用分号结尾,也可以不写分号,但是良好的习惯建议不要省略 3、行的长度,建议是不超过80个字符,原则是不要让编码窗口出现横向滚动条 4、换行原则,一般是在运算符后面换行,换行后应该有两个缩进,规范的示例 fif(name == "" && age == "" && gender == "" && school != ""){ // 这一行应该有两个制表符,下面的内容依旧根据结构缩进 alert(); } // 但是有个例外:赋值运算,换行后应该与等号右边对齐 var sqlString = "select * from where id = '' and " + "name = order by id desc"; // 函数赋值给变量时不需要遵循上面的规则 var getName = function(){ return name; }; 5、命名,基本的大小驼峰命名法,变量以名词开头,小驼峰法,方法动词开头,小驼峰法,看示例 规范的命名是为了更好的阅读维护,优秀的命名是具有自我说明性的,见其名知其意 如果不知道该如何命名,你就想想你这段代码的目的。另外,请一定用英文命名 // 变量命名 var name = "Tom"; var count = 10; var mySchoolName = "Big School"; // 方法 function getName(){ return name; } // 常量,全大写字母,单词之间以下划线分割 var MAX_SIZE = 10; 6、JavaScript 的构造函数,大驼峰命名法,因为 JavaScript 的构造函数都是需要 new 的 // 构造函数 function Person(name){ this.name = name; } Person.prototype.sayName(){ alert(this.name); } var me = new Person("Tom"); // 这样很容易就跟方法区分开了,规范之后很容易就发现第一行代码少了 new 关键字 var me = Person("Tom"); var you = getName("Tim"); 7、字符串,JavaScript 中字符串可以单引号或者双引号包裹,书中建议是双引号,因为有时需要 与Java 代码转换,但是个人认为如果只是纯粹的拼接HTML 代码的话,单引号更直接一些,因为不需要 考虑“的转意 8、数字,JavaScript 中只有整数和浮点数类型,使用浮点数时不能缩略小数位和整数位,不要使用八进制 // 错误示范 var price = 10.; var price = .1; var num = 010; 9、null,null 是个特殊的值,常常跟undefined 搞混,因为alert(null == undefined) 输出true 以下场景中当使用null // 初始化变量,如 var Person = null; // 与一个已经初始化的变量比较 var Person = null; if(Person == null) // 当参数期望是一个对象时,函数返回值期望是一个对象时 function getStudentName(stu){ if(stu){ return stu.name; }else{ null; } } var stuName = getStudentName(null); // 不好的用法,与未初始化的变量比较 if(name == null) //以及检测是否传入了参数 function(name){ if(name != null); } 10、undefined,当一个变量未被初始化或者不存在的时候的默认值就是undefined。一般情况下应该禁止 使用它,来保证代码中只有一种情况返回undefined ,就是变量未声明的时候 // 简单的例子说明何时返回undefined var Person; console.log(typeof Person); // "undefined" console.log(typeof str); // "undefined" // 养成良好的习惯,声明变量的时候即初始化,以保证只有未声明变量时才出现undefined var Person = null; 11、对象直接量,用最简洁的方式创建对象 // 一般的做法,已经不推荐使用 var stu = new Object(); stu.name = "Tom"; stu.gender = "男"; // 简洁的做法 var stu = { name: "Tom", gender: "男" } // 数组也是类似的情况 var nums = ["abc", "def", "ghi"]; 二、注释规范 1、单行注释, // 基本的单行注释,内容与符号间有一个空格 if(true){ // 单行注释前应该有换行,缩进与解释的代码一致 return null; // 同行注释前应该有一个制表符 } 2、多行注释,可以参考Java 的注释风格 /* * 前面加* 号,并且添加一个空格 */ 3、文档注释,跟Java 类似 /** * 多行注释 * @param 参数说明 */ 4、使用注释的时机 ⑴ 难以理解的代码 ⑵ 可能被认为是错误的代码 ⑶ 浏览器特性代码(看起来似乎很烂很低效,实际上是为了兼容性而写的代码) ⑷ 函数、类的说明要用文档注释,注释应该写明白参数的意义 三、语句和表达式 1、if 语句 // 正确的写法,无论之后有几条语句,都应该用括号包起来,并且有合适的缩进和换行 if(true){ alert("正确的写法"); } // 错误的写法 if(true) alert(); if(true) alert(); if(true){ alert(); } 2、花括号对齐方式,有两种,一般以Java 为主流 // Java 推崇的对齐方式,左边跟在第一句语句结尾,示例如下 if(true){ alert(); } // C#推崇的对齐方式 if(true) { alert(); } 3、switch 语句块,两种风格,看个人喜好 // Java 类似的编译器风格 switch(num){ case "1": break; case "2": break; default: // 选项很明确时可以不要默认选项 } // 第二种风格 switch(num){ case "1": break; case "2": break; default: // 选项很明确时可以不要默认选项 } 4、for 和 for-in // 有些规范中禁止for 里面使用continue ,建议用if代替,因为这样结构不明确 // for-in 看起来和for,很像,但是用途有些不一样,for-in用来遍历对象属性 var prop; for(prop in object){ console.log("property name is " + prop); console.log("property value is" + object[prop]); } // 需要特别注意的是for-in 不但遍历本身的属性,还会遍历从原型继承的属性, // 这就导致在遍历自定义对象时容易因为意外而终止,可以使用一个方法过滤掉 var prop; for(prop in object){ if(object.hasOwnProperty(prop)){ //过滤掉原型的属性 console.log("property name is " + prop); console.log("property value is" + object[prop]); } } 5、函数和变量的声明,在Java 和 JavaScript 中是允许调用在声明之前的,但是在c语言 中是不允许的,虽然调用在声明之前并不会出现编译错误或者不能正常运行,但是某 些时候有可能会出现一些小的问题,为了规范代码,最好是先声明后调用。 6、立即调用的函数,立即执行的匿名函数,一般是需要通过复杂的计算以获得一个值 // 不好的写法 var value = function(){ return null; }(); // 这里调用意图很不明显,虽然它确实是符合语法的调用执行 // 正确的写法 var value = (function(){ return null; }()); 7、判断比较运算,JavaScript 具有强制类型转换机制,即在做普通的比较的时候,如果 两个变量或者值类型不同时会首先进行强制类型转换,然后进行比较。 // 比较字符串"5" 与数值 5,会先将字符串转换为数值 console.log(5 == "5"); // true // 数值与16进制的比较 console.log(25 == "0x19"); // true // 如果比较的其中一个变量为对象时,则会先调用对象的valueOf 得到原始类型值再 比较,没有定义valueOf 则调用toString 比较 var object = { toString: function(){ return "0x19"; } }; console.log(25 == object); // true // 因为强制类型转换的缘故,null 与 undefined 被认为是相等的 console.log(null == undefined); // true console.log(0 == false); // true // 为了避免这些情况,所以比较的时候推荐使用 === 和 !== console.log(5 == "5"); console.log(5 === "5"); // false 8、eavl() ,这个函数可以将字符串转换为JavaScript 代码执行,可以做到这一点的方法 还有 Function() 构造函数和 setTimeOut()、setInterval(),但是强烈不推荐使用, 除非别无他法,必须使用。 // 将字符串转换为JavaScript 代码执行 eval("alert('hello')"); eval("1+1"); // 通过 Function 构造函数以及setTimeOut 和 setInterval也可以实现 var myFunc = new Function("alert('hello')"); setTimeOut("alert('hello')"); setInterval("alert('hello')"); // 各种js规范中都非常不推荐使用eval(),setTimeOut() 和 setInterval() 应该传入函数 setTimeOut(function(){ },1000); 9、原始包装类型,原始类型包括String,Boolean,Number,原始包装类型主要是为了 让原始值具有对象般的行为 // 最典型的就是字符串的原始类型 var name = "Tom"; // name 只是一个普通的字符串,但是下面的语句可以执行 console.log(name.toUpperCase); //是因为JavaScript 引擎在需要的时候创建了实例 // 但是这个实例马上就会被销毁掉,用完就丢了 var name = "Tom"; name.author = "mySelf"; // 这行执行完毕String 实例就会被销毁 console.log(name.author); // undefined // 虽然JavaScript 中可以这么使用,但是我们应该人为的避免使用这些原始类型 var name = new String("Tom");
0 0
- 基础的JavaScript编码规范
- JavaScript程序的编码规范
- 网易邮箱前端Javascript编码规范:基础规范
- 网易邮箱前端Javascript编码规范:基础规范
- 浅谈 JavaScript 编程语言的编码规范
- 浅谈JavaScript编程语言的编码规范
- 浅谈JavaScript编程语言的编码规范
- 浅谈JavaScript编程语言的编码规范
- 浅谈JavaScript编程语言的编码规范
- 浅谈 JavaScript 编程语言的编码规范
- 浅谈JavaScript编程语言的编码规范
- 浅谈JavaScript编程语言的编码规范
- 浅谈JavaScript编程语言的编码规范
- 浅谈JavaScript编程语言的编码规范
- 浅谈 JavaScript 编程语言的编码规范
- 浅谈JavaScript编程语言的编码规范
- 浅谈JavaScript编程语言的编码规范
- 浅谈JavaScript编程语言的编码规范
- event.x,event.clientX,event.offsetX区别
- 添加新图层的时候修改配置
- 计算机网络之局域网&以太网
- android学习笔记2015-09-18
- In SQL, what’s the difference between a full join and an inner join?
- 基础的JavaScript编码规范
- 系统分析工具
- json-simple简明教程
- 2015百度竞价之如何增加有效点击率?
- JSP 生成静态HTML页面
- 在需求分析中就可以避免的那些错误13
- 数组名和数组名取地址的区别
- Cocos2d-x 学习博客资料
- Power of Two