Heim  >  Artikel  >  Web-Frontend  >  JavaScript基本编码模式小结_基础知识

JavaScript基本编码模式小结_基础知识

WBOY
WBOYOriginal
2016-05-16 17:53:211007Durchsuche

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

基本上目前想到的只有这些,欢迎大家补充讨论:)
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn