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 相关文章推荐
利用js获取服务器时间的两个简单方法
Jan 08 Javascript
jQuery+css实现百度百科的页面导航效果
Dec 16 Javascript
举例讲解JavaScript中关于对象操作的相关知识
Nov 16 Javascript
Select下拉框模糊查询功能实现代码
Jul 22 Javascript
jQuery加密密码到cookie的实现代码
Apr 18 jQuery
微信小程序之圆形进度条实现思路
Feb 22 Javascript
基于layui数据表格以及传数据的方式
Aug 19 Javascript
js设计模式之代理模式及订阅发布模式实例详解
Aug 15 Javascript
详解React 条件渲染
Jul 08 Javascript
javascript canvas实现简易时钟例子
Sep 05 Javascript
Nuxt.js nuxt-link与router-link的区别说明
Nov 06 Javascript
vue 根据选择的月份动态展示日期对应的星期几
Feb 06 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
ADODB类使用
2006/11/25 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
Laravel 6.2 中添加了可调用容器对象的方法
2019/10/22 PHP
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
javascript中强制执行toString()具体实现
2013/04/27 Javascript
JavaScript数字和字符串转换示例
2014/03/26 Javascript
使用JSON.parse将json字符串转换成json对象的时候会出错
2014/09/04 Javascript
js实现头像图片切割缩放及无刷新上传图片的方法
2015/07/17 Javascript
JS模拟实现Select效果代码
2015/09/24 Javascript
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
JS实现页面内跳转的简单代码
2017/09/03 Javascript
zTree树形菜单交互选项卡效果的实现方法
2017/12/25 Javascript
判断iOS、Android以及PC端的示例代码
2018/11/15 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
使用beaker让Facebook的Bottle框架支持session功能
2015/04/23 Python
Python多线程爬虫简单示例
2016/03/04 Python
Python利用Beautiful Soup模块搜索内容详解
2017/03/29 Python
Python之pymysql的使用小结
2019/07/01 Python
python pandas cumsum求累计次数的用法
2019/07/29 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
Python列表切片常用操作实例解析
2019/12/16 Python
Python类中self参数用法详解
2020/02/13 Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
2020/05/12 Python
详解Java中一维、二维数组在内存中的结构
2021/02/11 Python
详解HTML5中的picture元素响应式处理图片
2018/01/03 HTML / CSS
最好的意大利皮夹克:D’Arienzo
2018/12/04 全球购物
幼儿园母亲节活动总结
2015/02/10 职场文书
教师聘用意向书
2015/05/11 职场文书
山楂树之恋观后感
2015/06/11 职场文书
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL
微信小程序 根据不同用户切换不同TabBar
2022/04/21 Javascript