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 相关文章推荐
javascript模拟map输出与去除重复项的方法
Feb 09 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
Mar 07 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
Aug 05 Javascript
js获取浏览器的各种属性
Apr 27 Javascript
Vue学习笔记进阶篇之单元素过度
Jul 19 Javascript
微信JSSDK调用微信扫一扫功能的方法
Jul 25 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
Aug 16 Javascript
微信小程序返回多级页面的实现方法
Oct 27 Javascript
Vue+webpack项目基础配置教程
Feb 12 Javascript
详解create-react-app 自定义 eslint 配置
Jun 07 Javascript
深入探讨JavaScript的最基本部分之执行上下文
Feb 12 Javascript
vue-router的钩子函数用法实例分析
Oct 26 Javascript
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
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
php命令行(cli)模式下报require 加载路径错误的解决方法
2015/11/23 PHP
PHP开发APP端微信支付功能
2017/02/17 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
用Javascript来生成ftp脚本的小例子
2013/07/03 Javascript
IE6-IE9中tbody的innerHTML不能赋值的解决方法
2014/09/26 Javascript
Jquery中CSS选择器用法分析
2015/02/10 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
javascript下拉列表中显示树形菜单的实现方法
2015/11/17 Javascript
实现JavaScript的组成----BOM和DOM详解
2016/05/18 Javascript
JQuery DIV 动态隐藏和显示的方法
2016/06/23 Javascript
jQuery插件EasyUI获取当前Tab中iframe窗体对象的方法
2016/08/05 Javascript
深入理解react-router@4.0 使用和源码解析
2017/05/23 Javascript
js图片轮播插件的封装
2017/07/21 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
详解如何构建Promise队列实现异步函数顺序执行
2018/10/23 Javascript
DatePickerDialog 自定义样式及使用全解
2019/07/09 Javascript
结合axios对项目中的api请求进行封装操作
2020/09/21 Javascript
基于VUE实现简单的学生信息管理系统
2021/01/13 Vue.js
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
跟老齐学Python之复习if语句
2014/10/02 Python
python3 实现的人人影视网站自动签到
2016/06/19 Python
python3实现基于用户的协同过滤
2018/05/31 Python
python和C++共享内存传输图像的示例
2020/10/27 Python
美国著名的团购网站:Woot
2016/08/02 全球购物
大女孩胸罩:Big Girls Bras
2016/12/15 全球购物
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
程序员经常用到的UNIX命令
2015/04/13 面试题
党委书记岗位职责
2013/11/24 职场文书
债务纠纷委托书
2014/08/30 职场文书
公司2014年度工作总结
2014/12/10 职场文书
2015年女工委工作总结
2015/07/27 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
MySQL中的全表扫描和索引树扫描
2022/05/15 MySQL