无论编写任何程序都会接触到编码风格,设计模式等概念,编码风格一般侧重于书写规范,而设计模式则偏向于程序架构设计。本文中笔者整理的这些“模式”包含了编写JavaScript代码时一些常用的方法或者小技巧,可以帮助初学JavaScript的同学迅速提升代码质量。当然,在此之前首先要保证规范的书写习惯,在此之上可以再将本文介绍的知识点运用到代码编写中,则可以大大提升代码质量。
下面是笔者整理的一些点,没有什么逻辑顺序,想到哪儿写到哪儿了,不足之处欢迎大家补充指正。
1. 变量定义
复制代码 代码如下:
// 一般写法
var a = 0;
var b = 1;
var c = "xxx";
// 推荐写法
var a = 0,
b = 1,
c = "xxx";
2. 尽量使用字面量
复制代码 代码如下:
// 一般写法
var obj = new Object();
obj.a = "aa";
obj.b = "bb";
obj.c = "cc";
var arr = new Array();
// 推荐写法
var obj = {
a: "aa",
b: "bb"
};
var arr = [];
function getXX(index){
return ["aa", "bb", "xx", 55, "xxb"](index);
}
function getMessage(code){
return {
404: "xxx",
500: "xxx"
}[code];
}
3. 正则字面量
复制代码 代码如下:
var regex = new RegExp("someting");
// 当正则表达式可能变化时才使用构造函数
var cls = "someclass",
regex = new RegExp(cls + "\s*", "ig"); // only for dynamic regexs
// 其他情况均使用字面量
var regex = /someting/ig;
4. 设置默认值
复制代码 代码如下:
// Default values
var arg = arg || "default"; // fallback
document.getElementById("test").onclick = function(event){
var event = event || window.event;
};
function getX(a){
return a+1 || "default";
}
5. 条件判断
复制代码 代码如下:
// Conditions
answer = obj && obj.xx && obj.xx.xxx;
// 连续判断
if(obj && obj.xx && obj.xx.xxx){
// do something
}
if(obj.xx){
// do something
}
if(!obj){
// do something
}
// 使用全等判断
if(a === b){
// do something
}
// 尽量不检测浏览器,仅检测要使用的特性是否支持
if(document.getElementById){
// ability detect
}
6. 三元操作符
复制代码 代码如下:
// Ternary
check ? value1 : value2;
// 三元操作符更简洁
var foo = (condition) ? value1 : value2;
function xx(){
if(condition){
return value1;
}else{
return value2;
}
}
function xx(){
return (condition) ? value1 : value2;
}
// 格式化三元操作符
foo = predicate ? "one" :
predicate ? "two" :
"default"; // format
7. 插入迭代值
复制代码 代码如下:
// Insert iteration
var name = value[i];
i++;
// 直接将迭代值插入
var name = value[i++];
8. DOM操作
复制代码 代码如下:
// DOM Operation
el.style.display = "none"; // offline
// operation
el.style.display = "block";
// 使用文档碎片操作更好
var fragment = document.createDocumentFragment(); // better
el.innerHTML = ""; // fast remove all children, but may leaks memory
el.innerHTML = "xxx"; // ok, use it!
// 小心处理NodeList
var images = document.getElementsByTagName("img"); // be careful! dynamic list
9. 事件代理
复制代码 代码如下:
// 使用事件代理,在更外层的元素上监听事件
document.getElementById("list").onclick = function(evt){
var evt = evt || window.event,
target = evt.target || evt.srcElement;
if(target.id === "btn1"){
// do something
}
}
10. 命名空间
复制代码 代码如下:
// An Object as a Namespace
var MYAPP = {};
MYAPP.dom.get = function(id){};
MYAPP.style.css = function(el, style){};
MYAPP.namespace("event");
11. 链式操作
复制代码 代码如下:
// Chaining operation: return this
function setValue(el, value){
el.value = value;
return this;
}
var obj = new MYAPP.dom.Element("span");
obj.setText("hello")
.setStyle("color", "red")
.setStyle("font", "Verdana");
12. 私有作用域
复制代码 代码如下:
// Function
(function(){
var _private = "cant see me";
})();
(function($){
$("#xxb").click(function(){ });
})(jQuery);
13. 配置对象
复制代码 代码如下:
// Configure Object
function foo(id, conf, null , null){
// do somethin
}
foo("bar", {
key1 : 1,
key2 : 2
});
14. 类型转换
复制代码 代码如下:
// Type Conversion
+"010" === 10;
Number("010") === 10;
parseInt("010", 10) === 10;
10 + "" === "10";
+new Date() // timestamp
+new Date;
15. 扩展原型
复制代码 代码如下:
// 仅在需要向前兼容时才使用,其他情况不建议扩展原型对象
Array.prototype.forEach = function(){
// only for forward compatible
};
16. 循环优化
复制代码 代码如下:
// 缓存
for(var i=0, j = document.getElementsByTagName("a").length; i0; i--){
// maybe faster
}
// 据说是最快的
while(i--){
// maybe fastest
}
17. 尽量使用新特新
复制代码 代码如下:
Array.forEach();
getElementsByClassName();
querySlectorAll();
// 首先检测是否支持新特性,能用就用
if(document.getElementsByClassName){
// use
}else{
// your implementations
}
18. 惰性载入
复制代码 代码如下:
// 只判断一次,再次调用该函数则无需判断
function lazyDef(){
if(condition1){
lazyDef = function(){ };
}else if(condition2){
lazyDef = function(){ };
}
return lazyDef();
}
19. 私有函数与公共方法
复制代码 代码如下:
var MYAPP = {};
MYAPP.dom = (function(){
var _setStyle = function(el, prop, value){
console.log("setStyle");
};
return {
setStyle: _setStyle
};
})();
// 当 MYAPP.dom.setStyle 不慎被覆写时,_setStyle在内部仍然可用
20. 调试
复制代码 代码如下:
// 尽量使用,可以传入多个参数,最后输出拼接后的字符串
console.log("xx","xx","...");
console.dir(someObj);
console.dirxml(someDom);
console.time("timer");
console.warn("xxx");
// 封装可以保证不小心发布出去也不会导致问题,但报错时行号可能有问题
function msg(msg){
if(console && console.log){
console.log(msg); // wrong line number
}
}
基本上目前想到的只有这些,欢迎大家补充讨论:)