摘要:这篇文章主要内容的来源是《javascript高级程序设计第三版》,因为第二遍读完,按照书里面的规范,发觉自己在工作中没有好好遵守。所以此文也是对自己书写js的一种矫正。

1、可维护性

1.1

可理解性——其他人可以接手代码并理解它的意图和一般途径,而无需原开发人员的完整解释。

直观性——代码中的东西一看就能明白,不管其操作过程多么复杂。

可适应性——代码以一种数据上的变化不要求完全重写的方法撰写。

可扩展性——在代码架构上已考虑到在未来允许对核心功能进行扩展。

可调试性——当有地方出错时,代码可以给予你足够的信息来尽可能直接地确定问题所在。

1.2 代码约定:

变量和函数命名

  命名的一般规则如下所示:

  变量名应为名词如 car 或 person。

  函数名应该以动词开始,如 getName()。返回布尔类型值的函数一般以 is 开头,如isEnable()。

  变量和函数都应使用合乎逻辑的名字,不要担心长度。长度问题可以通过后处理和压缩来缓解。

变量类型透明:

// 通过初始化来指定变量的类型
var found=false; //布尔型
var count=-1; //数字
var name=''; //字符串
var array=[]; //数组

  

1.3松散耦合:

1.3.1、解耦HTML/javascript

就是说一些事件不要在html元素里面加onclick等来执行,而是将HTML和javascript分离,通过外部文件和使用DOM附加行为来包含javascript

1.3.2、解耦CSS/javascript 

就是说尽量是通过class名来控制样式,而不是在js里面书写样式。这样如果大量用js来改样式,维护上来说将是一场噩梦。

例如:

// bad
element.style.color="red"; //good
element.className="edit";

1.3.3、解耦应用逻辑 / 事件处理程序

就是说 将应用逻辑 和事件处理程序相分离 ,这样两者分别处理各自的东西。如下:

//bad
function handlekeyPress(event){
event=EventUtil.getEvent(event);
if(event.keyCode==13){
var target=EventUtil.getTarget(event);
var value=5*parseInt(target.value);
if(value>10){
document.getElementById("error-msg").style.display="block";
} }
} // good
function validateValue(value){
var value=5*parseInt(value);
if(value>10){
document.getElementById("error-msg").style.display="block";
}
}
function handlekeyPress(event){
event=EventUtil.getEvent(event);
if(event.keyCode==13){
var target=EventUtil.getTarget(event);
validateValue(target.value)
}
}

1.4 编程实践

1.4.1避免全局变量:

 // bad  两个全局变量,避免

 var name="Nicholas";
function sayName(){
alert(name);
} // good 一个全局变量,推荐
var MyApplication={
name:"Nicholas",
sayName:function(){
alert(this.name);
}
}

或者

// 如果变量和函数不需要在“外面”引用,可以写一个自执行函数
(function(){
var name = 'Nicholas';
function sayName(){
alert(name);
}
})();

1.4.2避免与null进行比较

// bad
function sortArray(values){
if(values !=null){
values.sort(comparator);
}
} //good
function sortArray(values){
if(values instanceof Array){
values.sort(comparator);
}
}

 

2、性能

2.1注意作用域,使用全局查找要比局部查找开销大很多

// bad
//包含了三个对于全局document对象的引用。如果很多次,影响性能
function updateUI(){
var imgs=document.getElementsByTagName('img');
for(var i=0,len=imgs.length;i<len;i++){
imgs[i].title=document.title+"image"+i;
}
var msg=document.getElementById('msg');
mgs.innerHTML="Update complete .";
} // good
//将document对象存在本地的doc中,然后在余下的代码中替换原来的document,只需要一次全局查找
function updateUI(){
var doc=document;
var imgs=doc.getElementsByTagName('img');
for(var i=0,len=imgs.length;i<len;i++){
imgs[i].title=doc.title+"image"+i;
}
var msg=doc.getElementById('msg');
mgs.innerHTML="Update complete .";
}

2.2 选择正确的方法:

2.2.1. 避免不必要的属性查找

计算机算法的复杂度使用O来表示,其中最简单,最快捷的是O(1)。看下图

使用变量和数组要比访问对象上的属性更有效率前者是O(1)的操作,后者是一个 O(n)操作,

因为对象上的任何属性查找都要访问变量或者数组花费更长时间,因为必须在原型链中对拥有该名称的属性进行一次搜索。简而言之,属性查找越多,执行时间就越长。

例如:

//快
var value = 5;
var sum = 10 + value;
alert(sum); // 快
var values = [5, 10];
var sum = values[0] + values[1];
alert(sum); //较慢
var values = { first: 5, second: 10};
var sum = values.first + values.second;
alert(sum);

2.2.2   Switch 语句较快

如果有一系列复杂的 if-else 语句,可以转换成单个 switch 语句则可以得到更快的代码。 还可以通过将 case 语句按照最可能的到最不可能的顺序进行组织, 来进一步优化 switch 语句

2.2.3  最小化语句数

  有个地方很多开发人员都容易创建很多语句,那就是多个变量的声明。很容易看到代码中由多个
var 语句来声明多个变量

  然而,在 JavaScript 中所有的
变量都可以使用单个 var 语句来声明。

但是个人倾向于第一种写法。

//4 个语句 —— 很浪费
var count = 5;
var color = "blue";
var values = [1,2,3];
var now = new Date(); //一个语句
var count = 5,
color = "blue",
values = [1,2,3],
now = new Date(); //但是为了更好的维护,还是第一种写法比较好。而且不会那么容易出错。
//所以支持第一种写法

使用数组和对象字面量

// bad

//用 4 个语句创建和初始化数组——浪费
var values = new Array();
values[0] = 123;
values[1] = 456;
values[2] = 789; //用 4 个语句创建和初始化对象——浪费
var person = new Object();
person.name = "Nicholas";
person.age = 29;
person.sayName = function(){ alert(this.name);
}; // good //只用一条语句创建和初始化数组
var values = [123, 456, 789];
//只用一条语句创建和初始化对象
var person = {
name : "Nicholas",
age : 29,
sayName : function(){ alert(this.name); }
};

2.2.4  在For语句之外声明变量

// bad
// 每次迭代都需要检查数组的长度,并且每次都要遍历DOM树找到container元素—效率低
for(var i = 0; i < someArray.length; i++) {
var container = document.getElementById('container');
container.innerHtml += 'number: ' + i;
console.log(i);
} // good
var container = document.getElementById('container');
for(var i = 0, len = someArray.length; i < len; i++) {
container.innerHtml += 'number: ' + i;
console.log(i);
}

2.2.5 构建字符串的最快方式

// 这个方法比使用for更快
var arr = ['item 1', 'item 2', 'item 3', ...];
var list = '<ul><li>' + arr.join('</li><li>') + '</li></ul>';

2.3 压缩

2.3.1 文件压缩

原则:

删除额外的空白(包括换行) ;
 删除所有注释;
 缩短变量名。

JavaScript 有不少压缩工具可用其中最优秀的(有争议的)是 YUI 压缩器  http://yuilibrary.com/

检测js代码是否有错的工具:JSLint   www.jslint.com

总结下来,发觉自己平时没有好好遵守这些规范,慢慢纠正

                                                                                               

【原】javascript最佳实践的更多相关文章

  1. JavaScript 最佳实践

    这个文档是基于JavaScript社区众多开发者的意见和经验,在开发JavaScript代码上的最佳实践和首选的方案的明细表.因为这是一个推荐的表而非原则性的方案,经验丰富的开发者可能对下面的表达会有 ...

  2. JavaScript最佳实践:可维护性

    代码约定 一.可读性 代码缩进 包含注释 二.变量和函数命名 变量名应为名词如car或person 函数名应该以动词开始,如getName().返回布尔类型值的函数一般以is开头,如isEnable( ...

  3. javascript 最佳实践 ( 24 章 )

    代码约定 易于维护, 形成了一套 JavaScript 代码书写的约定: 跟别的语言差不多, 不过 javascript 中的大括号一定要放在 行尾, 例如: function abc() { // ...

  4. JavaScript最佳实践

    作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5540469.html 举个例子:用户在点击某个链接的时候弹出一个新窗口 弹出窗口的方法采用:wind ...

  5. 15条JavaScript最佳实践很经典噢

    感觉比较经典,特转载腾讯大讲堂.本文档整理大部分公认的.或者少有争议的JavaScript良好书写规范(Best Practice).一些显而易见的常识就不再论述(比如要用对象支持识别判断,而不是浏览 ...

  6. 学习JavaScript最佳实践方法

    首先要说明的是,咱现在不是高手,最多还是一个半桶水,算是入了JS的门. 谈不上经验,都是一些教训. 这个时候有人要说,“靠,你丫半桶水,凭啥教我们”.您先别急着骂,先听我说. 你叫一个大学生去教小学数 ...

  7. 15条JavaScript最佳实践【转】

    本文档整理大部分公认的.或者少有争议的JavaScript良好书写规范(Best Practice).一些显而易见的常识就不再论述(比如要用对象支持识别判断,而不是浏览器识别判断:比如不要嵌套太深). ...

  8. 45个实用的JavaScript技巧、窍门和最佳实践

    在这篇文章中,我将分享一组JavaScript的技巧.窍门和最佳实践,这些都是JavaScript程序员应该知晓的,不管他们是使用在浏览器/引擎上,还是服务器端(SSJS——Service Side ...

  9. javascript编程的最佳实践推荐

    推荐的javascript编程的最佳实践,摘要记录在这里: 可维护的代码保证代码的性能部署代码 1 可维护的代码1.1什么是维护的代码:可理解性——其他人可以接手代码并理解它的意图和一般途径,而无需原 ...

随机推荐

  1. factor graph model

    主实验 文慧:用户,商品,评分,review,ranking. 数据集:数据规模,论文源代码

  2. 代码设计工具——PowerDesigner

    详情请参考博客: http://www.blogjava.net/wangdetian168/archive/2011/04/07/347847.html

  3. C 语言学习的第 03 课:你的 idea 是怎么变成能够执行的程序的

    在上一篇文章中,我们说到,C 语言系统应该由程序开发环境,C 语言本身和 C 语言的库组成.且同时说了程序开发环境做了“编写”,“预处理”,“编译”和“链接”这几件事情.但是细节并没有一一呈现.不知道 ...

  4. 12-rm 命令总结

    rm remove files or directories 删除目录或文件 [语法]: rm [选项] [参数] [功能介绍] rm命令可以删除一个目录中的一个或多个文件或目录,也可以将某个目录及其 ...

  5. Android NestedScrolling与分发机制

    在Android5.0之间要实现控件的嵌套滑动,都是要自己处理View事件即分发机制. 共有三个方法:    dispatchTouchEvent().onInterceptTouchEvent()和 ...

  6. 在Windows .NET平台下使用Memcached

    网上关于Memcached的文章很多,但据我观察,大多是互相转载或者抄袭的,千篇一律.有些则是直接整理的一些超链接然后贴出来.那些超链接笔者大概都进去看了,其实关于Memcached的中文的技术文章, ...

  7. iOS开发--二维码的扫描

    一.需要包含头文件 #import <AVFoundation/AVFoundation.h> 二.通过设置<AVCaptureMetadataOutputObjectsDelega ...

  8. 【BZOJ 3083】遥远的国度

    这道题很简单的连剖+分类讨论,但是SDOI Round2要来了,不会手动栈怎么办呢?只好用一下这道题练习一下手动栈了,结果调了一天多QwQ 链剖的第一个dfs用bfs水过就行,但是我自以为是地把倍增写 ...

  9. Spring不支持依赖注入static静态变量

    在springframework里,我们不能@Autowired一个静态变量,使之成为一个spring bean,例如下面这样: 可以试一下,yourClass在这种状态下不能够被依赖注入,会抛出运行 ...

  10. 为简单而努力:Android封装类详解

    一.简单说明 1, IntentService IntentService继承自Service,并在其内部创建了工作线程,用来处理耗时操作,其中onHandleIntent方法就是在子线程执行的,我们 ...