JavaScript基本编码模式小结


Posted in Javascript onMay 23, 2012

无论编写任何程序都会接触到编码风格,设计模式等概念,编码风格一般侧重于书写规范,而设计模式则偏向于程序架构设计。本文中笔者整理的这些“模式”包含了编写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 
} 
}

基本上目前想到的只有这些,欢迎大家补充讨论:)
Javascript 相关文章推荐
THREE.JS入门教程(4)创建粒子系统
Jan 24 Javascript
对于this和$(this)的个人理解
Sep 08 Javascript
jQuery中slideUp()方法用法分析
Dec 24 Javascript
微信小程序 网络请求(post请求,get请求)
Jan 17 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
Feb 27 Javascript
Angular.js实现动态加载组件详解
May 28 Javascript
对angularJs中2种自定义服务的实例讲解
Sep 30 Javascript
利用JavaScript将Excel转换为JSON示例代码
Jun 14 Javascript
JavaScript实现简单计算器功能
Dec 19 Javascript
详解element-ui 表单校验 Rules 配置 常用黑科技
Jul 11 Javascript
jQuery实现鼠标拖动图片功能
Mar 04 jQuery
vue实现列表拖拽排序的示例代码
Apr 08 Vue.js
Javascript处理DOM元素事件实现代码
May 23 #Javascript
面向对象Javascript核心支持代码分享
May 23 #Javascript
Package.js  现代化的JavaScript项目make工具
May 23 #Javascript
检测input每次的输入是否合法遇到汉字输入就有问题
May 23 #Javascript
JavaScript可否多线程? 深入理解JavaScript定时机制
May 23 #Javascript
setTimeout的延时为0时多个浏览器的区别
May 23 #Javascript
jQuery 瀑布流 绝对定位布局(二)(延迟AJAX加载图片)
May 23 #Javascript
You might like
php 删除记录实现代码
2009/03/12 PHP
PHP生成Flash动画的实现代码
2010/03/12 PHP
Javascript 不能释放内存.
2006/09/07 Javascript
json-lib出现There is a cycle in the hierarchy解决办法
2010/02/24 Javascript
简单时间提示DEMO从0开始一直进行计时
2013/11/19 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
JavaScript将取代AppleScript?
2014/09/18 Javascript
AngularJS入门教程之Scope(作用域)
2016/07/27 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
js前端解决跨域问题的8种方案(最新最全)
2016/11/18 Javascript
浅谈jQuery的bind和unbind事件(绑定和解绑事件)
2017/03/02 Javascript
Nodejs 和Session 原理及实战技巧小结
2017/08/25 NodeJs
详解webpack4多入口、多页面项目构建案例
2018/05/25 Javascript
js取0-9随机取4个数不重复的数字代码实例
2019/03/27 Javascript
vue源码中的检测方法的实现
2019/09/26 Javascript
Node中对非阻塞I/O、事件循环的知识点总结
2020/01/05 Javascript
[01:03:36]Ti4 循环赛第三日DK vs Titan
2014/07/12 DOTA
Python中的defaultdict模块和namedtuple模块的简单入门指南
2015/04/01 Python
基于python yield机制的异步操作同步化编程模型
2016/03/18 Python
python函数式编程学习之yield表达式形式详解
2018/03/25 Python
python3实现高效的端口扫描
2019/08/31 Python
最新2019Pycharm安装教程 亲测
2020/02/28 Python
Python基于Tkinter编写crc校验工具
2020/05/06 Python
用Python实现童年贪吃蛇小游戏功能的实例代码
2020/12/07 Python
python switch 实现多分支选择功能
2020/12/21 Python
HTML5边玩边学(2)基础绘图实现方法
2010/09/21 HTML / CSS
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
2017/07/31 HTML / CSS
巴基斯坦购物网站:Goto
2019/03/11 全球购物
总经理职责范文
2013/11/08 职场文书
结婚典礼证婚词
2014/01/08 职场文书
开业庆典邀请函
2014/01/08 职场文书
大型营销活动计划书
2014/04/28 职场文书
毕业欢送会致辞
2015/07/29 职场文书
2019年干货:自我鉴定
2019/03/25 职场文书
Java详细解析==和equals的区别
2022/04/07 Java/Android
在python中读取和写入CSV文件详情
2022/06/28 Python