注释
合理的注释可以让代码更易阅读、更具美感。
函数/方法注释
函数/方法注释必须包含函数说明,有参数和返回值时必须使用注释标识;
参数和返回值注释必须包含类型信息和说明;
/** * 函数描述 * * @param {string} p1 参数1的说明 * @param {string} p2 参数2的说明 * @param {number} p3 参数3的说明(可选) * @return {Object} 返回值描述 */ function foo(p1, p2, p3) { var p3 = p3 || 10; return { p1: p1, p2: p2, p3: p3 }; }
文件注释
文件注释用于告诉不熟悉这段代码的读者这个文件中包含哪些东西。 应该提供文件的大体内容, 它的作者, 依赖关系和兼容性信息。如下:
/**
* @des: 描述信息
* @author 作者
* @date 日期
*/
命名
变量, 使用 Camel 命名法
var userName = {};
私有属性、变量和方法以下划线 _ 开头
var _userName = {};
常量, 使用全部字母大写,单词间下划线分隔的命名方式
var API_PATH = {};
函数,使用 Camel 命名法, 函数的参数, 使用 Camel 命名法
function getUserName(userId) { }
类,使用 Pascal 命名法, 类的方法/属性,使用 Camel 命名法
function PersonMan(userName) { this.userName = userName; this.getUserName = function(){ return this.userName; } } PersonMan.prototype.setUserName= function (userName) { this.userName = userName; };
命名语法
类名,使用名词
function Person(personName) { }
函数名,使用动宾短语
function getStyle(element) { }
boolean 类型的变量使用 is 或 has 开头
var isLoading = false; var hasName = false;
True 和 False 布尔表达式
类型检测优先使用 typeof。对象类型检测使用 instanceof。null 或 undefined 的检测使用 == null。
下面的布尔表达式都返回 false:
null undefined '' 空字符串 0 数字0 但下面的, 都返回 true: '0' 字符串0 [] 空数组 {} 空对象
jQuery 变量
存放 jQuery 对象的变量以 $ 开头;
将 jQuery 选择器返回的对象缓存到本地变量中复用;
使用驼峰命名变量;
var $myDiv = $("#myDiv"); $myDiv.click(function(){...});
避免不必要的 DOM 操作
当要操作 DOM 元素的时候,尽量将其分离节点,操作结束后,再插入节点;
var $myList = $("#list-container > ul").detach(); $myList.appendTo("#list-container");
使用字符串连接或 array.join 要比 .append()性能更好;
// 不推荐
var $myList = $("#list"); for(var i = 0; i < 10000; i++){ $myList.append("<li>"+i+"</li>"); } // 推荐 var $myList = $("#list"); var list = ""; for(var i = 0; i < 10000; i++){ list += "<li>"+i+"</li>"; } $myList.html(list); // 强烈推荐 var array = []; for(var i = 0; i < 10000; i++){ array[i] = "<li>"+i+"</li>"; } $myList.html(array.join(''));
异步加载第三方内容
当你无法保证嵌入第三方内容(比如嵌入谷歌统计)可以正常工作的时候,你需要考虑用异步加载这些代码,避免阻塞整个页面加载。
(function() { var script, scripts = document.getElementsByTagName('script')[0]; function load(url) { script = document.createElement('script'); script.async = true; script.src = url; scripts.parentNode.insertBefore(script, scripts); } load(url); }());