JavaScript 高效编码模式与最佳实践指南

作者:霁月时间:2026-10-27 05:20:16浏览:597

本文系统整理了 JavaScript 开发中常用的编码模式与技巧,涵盖变量定义、字面量使用、正则表达式、默认值设置、条件判断、三元运算符、迭代处理、DOM 操作、事件代理、命名空间、链式调用、私有作用域、配置对象、类型转换、原型扩展、循环优化、新特性使用、惰性载入及调试技巧。旨在帮助开发者提升代码质量与执行效率。

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

迭代与 DOM 操作优化

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
} 
} 

基本上目前想到的只有这些,欢迎大家补充讨论:)

作者最新文章