JavaScript大杂烩16 - 推荐实践

JavaScript部分

1. 总是使用===来进行相等判断

原因:由于 == 和 != 操作符存在类型转换问题,而为了保持代码中数据类型的完整性,推荐使用全等 === 和不全等 !=== 操作符。

2. 总是使用";"来结束一条语句

原因:JavaScript允许不使用";"来结束语句,当没发现";"的时候,JavaScript会自己判断何时是语句结束了,这种不确定性大大的提高了出错的几率,所以请严格要求自己,使用";"结束一条语句。

3. 总是使用字面量去创建内置类型的实例

原因:使用new创建的包装类型与使用字面量定义的轻量化的"值类型",拥有的方法列表是一样的,有什么理由用new?

示例:

var name = ‘Frank‘;
var age = 10;
var util = {/*...*/};
var m1 = function() {/*...*/};

4. 总是使用var去定义变量

原因:虽然可以不使用var去定义变量,但是最好不要这么做,除非你想自找麻烦。

示例:

var name = ‘Frank‘,
    age = 10,
    util = {/*...*/};

上面例子中是推荐的一种单行定义多个变量的写法。

5. 如非必要,避免使用全局变量

原因:全局就代表不安全,容易被修改,容易被覆盖,如非必要,避免使用。

6. 在if/for等语句块中,总是写上大括号{},即使只有一条语句

原因:避免歧义。

示例:

if (true) {
  alert(‘msg‘);
}

7. 起始的大括号总是写在上一行行末

原因:避免其他的一些问题导致JavaScript编译器错误断句。

示例:

var foo = function() {

alert(‘foo‘);

};

8. 使用命名空间

原因:避免命名冲突。

示例:

var util = {};
util.checkName = function() {/*...*/};

9. 除了"构造函数"外,所有的函数(也包括变量)总是使用驼峰命名规范

原因:公认的推荐写法。

示例:

var myName = ‘bar‘;
function checkName(name) {
  //...
}

10. 正确使用循环

1). 使用for循环或者foreach方法遍历数组,使用for..in循环遍历对象,这个不多说了,前面遇到多次了。

2). 缓存边界,提高效率,示例如下:

for(var i=0, len = arr.length; i < len; i++) {
  //...
}

3). 尽量不要在循环体中创建变量,特别是jQuery对象或者DOM对象,开始循环前缓存起来吧:

var obj = $(‘.name‘);
for(/*...*/){
  // 使用obj去做某些事
}

11. 尽量多使用单引号表示字符串

原因:HTML元素中多使用双引号,所以JavaScript代码中尽量多使用单引号吧。

示例:

var name = ‘Frank‘;

当然了,出现字符串嵌套的时候就要混用单双引号了。

12. 尽量不使用with语法

with的本意是减少键盘输入。比如

obj.a = obj.b;
obj.c = obj.d;

可以简写成

with(obj) {
  a = b;
  c = d;
}

但是,在实际运行时,解释器会首先判断obj.b和obj.d是否存在,如果不存在的话,再判断全局变量b和d是否存在。这样就导致了低效率,而且可能会导致意外,因此最好不要使用with语句。

13. 尽量不使用eval函数

eval用来直接执行一个字符串。这条语句也是不应该使用的,因为它有性能和安全性的问题,并且使得代码更难阅读。

eval能够做到的事情,不用它也能做到。比如

eval("myValue = myObject." + myKey + ";");

可以直接写成

myValue = myObject[myKey];

至于ajax操作返回的json字符串并执行的需求,可以直接使用JQuery的$.getScript方法实现。

同样的道理适用于setInterval或setTimeout函数的第一个参数,直接传函数吧。

14. 尽量不使用switch贯穿

switch结构中的case语句,默认是顺序执行,除非遇到break,return和throw。有的程序员喜欢利用这个特点,比如

switch(n) {
  case 1:
  case 2:
    break;
}

这样写容易出错,而且难以发现。因此建议避免switch贯穿,凡是有case的地方,一律加上break。

switch(n) {
  case 1:
    break;
  case 2:
    break;
}

15. 不使用位运算符

原因:Javascript完全套用了Java的位运算符,包括按位与&、按位或|、按位异或^、按位非~、左移<<、带符号的右移>>和用0补足的右移>>>。这套运算符针对的是整数,所以对Javascript完全无用,因为Javascript内部,所有数字都保存为双精度浮点数。如果使用它们的话,Javascript不得不将运算数先转为整数,然后再进行运算,这样就降低了速度。而且"按位与运算符"&同"逻辑与运算符"&&,很容易混淆。

16. 不要扩展内置类型的原型

原因:这样会导致可维护性的问题,因为这会让你的代码的移植性变差。其他的开发人员使用你的代码的时候,可能只需要原生的方法,并不需要额外的功能。

17. 大型程序推荐使用面向对象的写法使用JavaScript(闭包实现封装性,原型链实现继承)

原因:便于扩展,便于使用。

18. 小心使用typeof, instanceof进行类型判断

原因:我们前面在总结对象的若干问题的时候(http://www.cnblogs.com/dxy1982/p/3766606.html)已经详细讲解过这两个操作了,大部分情况下得不到我们想要的结果,其实在弱化类型的动态语言中,个人并不太推荐进行类型检查。这里简单看个例子:

var arr = [0, 1];
alert(typeof arr); // object
alert(arr instanceof Array); // true
alert(Array.isArray(arr)); // 比instanceof更好的写法

19. 谨慎对浮点数经行判等

这个是所有计算机语言浮点数都可能存在的问题,看例子以及常见方案:

// 错误比较浮点数
alert((0.1+0.2) === 0.3);
// 常见的解决方案
var epsEqual = function () {
  var EPSILON = Math.pow(2, -53);
  return function epsEqual(x, y) {
      return Math.abs(x - y) < EPSILON;
  };
}();
alert(epsEqual(0.1+0.2, 0.3));

20. 时刻检查传入数组中的index参数是否是负数

原因:有的函数可以接收负数,这样用好能达到奇效,但是误用可能导致奇怪的问题。

看例子:

var arr = [1,2,3,4,5];
var index = arr.indexOf(‘foo‘); // index = -1
alert(arr.splice(index, 2)); // 5

是你想要的结果吗?

21. 原始运算符始终比函数高效

原因:原生的操作符执行效率最高。

看例子:

// 使用函数是有开销的
var min = Math.min(a, b);
// 推荐的写法
var min = a < b ? a : b;

22.将脚本放在页面的底部,并且采用HTML5的写法

原因:这个做法的用意是让页面尽可能快的呈献给用户,脚本的加载默认是阻塞的,脚本加载并执行完之前,浏览器不能继续渲染下面的内容。因此,用户将被迫等待更长时间。这绝对是个有益的实践。看个例子:

<script src="path/to/file.js"></script>
<script src="path/to/anotherFile.js"></script>
</body>
</html>

23. 总是使用数组的toString方法(简单)或者join方法(可以自定义格式)输出数组字符串

原因:啥也别说了,相当快捷:

var arr = [1,2,3,4,5];
alert(arr.toString());
alert(arr.join(‘,‘));
// 稍微复杂一点的例子
var arr = [‘item 1‘, ‘item 2‘, ‘item 3‘, ...];
var list = ‘<ul><li>‘ + arr.join(‘</li><li>‘) + ‘</li></ul>‘;

这种情况下,忘了for循环吧。

24. 时刻提供清晰的调用目标来减少作用域链的检查

原因:提高执行效率。

示例:

// 低效率方法
var url = location.href;
// 相对高效一点的用法
var url = window.location.href;

这个原理同样适用于"多定义局部变量,少定义全局变量"。

JQuery部分

1. 总是使用最新版本的JQuery

原因:这个不用多说,大部分情况下,新版本代表更好的性能,更多的功能。

2. 优先使用ID与标记选择器

原因:选择器的选择速度从快到慢依次是:ID,TAG,CLASS。所以如果ID能访问就用id,否则就尝试用tag访问,再不行才用class。快的原因是有原生方法的支持,比如getElementById就很快。当然伪类选择器和属性选择器比上面这些方式更慢。

3. 需要多次使用同一个jQuery对象时缓存该对象

原因:选中某一个网页元素,是开销很大的步骤。所以,使用选择器的次数应该越少越好,并且尽可能缓存选中的结果,便于以后反复使用。

比如,下面这样的写法就是糟糕的写法:

$(‘#top‘).find(‘p.classA‘);
$(‘#top‘).find(‘p.classB‘);

更好的写法是:

var cached = $(‘#top‘);
cached.find(‘p.classA‘);
cached.find(‘p.classB‘);

4. 多使用链式操作

$(‘div‘).find(‘h3‘).eq(2).html(‘Hello‘);

原因:采用链式写法时,jQuery自动缓存每一步的结果,因此比非链式写法要快。

5. 使用data方法缓存数据

在jQuery中,可以通过data()方法将数据缓存,虽然使用局部或全局的变量可以保存数据,但变量并不能进行数据的缓存,而且并不依附于某个元素自身;如果使用data方法,可以针对元素定义数据,在元素中存取数据,从而避免数据被循环引用的风险。而且data方法支持存放JSON数据,相当方便:

var cached = $(‘#p‘);
cached.data(‘_data‘);//初始化
cached.data(‘_data‘,{//赋值
name: ‘haha‘
});
cached.data(‘_data‘).name;//获取JSON中的name值

虽然使用data()方法可以很方便地存取全局性数据,但存储的数据随着操作的变化,会越来越大,如果不及时进行清理,将会影响原有程序的执行。

还有一点,如果你真的要在DOM元素上储存数据,不要写成下面这样:

var elem = $(‘#elem‘);
elem.data(key,value);

而要写成

var elem = $(‘#elem‘);
$.data(elem[0],key,value);

根据测试,后一种写法要比前一种写法,快了将近10倍。因为elem.data()方法是定义在jQuery函数的prototype对象上面的,而$.data()方法是定义jQuery函数上面的,调用的时候不从复杂的jQuery对象上调用,所以速度快得多。

6. 如非必要,尽量使用原生方法

原因:原生方法比对应的JQuery方法要快很多,所以如非必要,应少用一些JQuery方法,多使用一些JavaScript的原生DOM方法。比如插入html代码的时候,浏览器原生的innterHTML()方法比jQuery对象的html()更快。又如JavaScript原生循环方法for和while,要比jQuery的.each()方法快,应该优先使用原生方法。

7. 少改动DOM结构

1). 改动DOM结构开销很大,因此不要频繁使用.append()、.insertBefore()和.insetAfter()这样的方法。

如果要插入多个元素,就先把它们合并,然后再一次性插入。根据测试,合并插入比不合并插入,快了将近10倍。

2). 如果你要对一个DOM元素进行大量处理,应该先用.detach()方法,把这个元素从DOM中取出来,处理完毕以后,再重新插回文档。根据测试,使用.detach()方法比不使用时,快了60%。

8. 如有可能,多使用工具方法(静态方法),而不是jQuery对象的方法(实例方法)

许多jQuery方法都有两个版本,一个是供jQuery对象使用的版本,另一个是供jQuery函数使用的版本。下面两个例子,都是取出一个元素的文本,使用的都是text()方法。

你既可以使用针对jQuery对象的版本:

var $text = $("#text");
var $ts = $text.text();

也可以使用针对jQuery函数的版本:

var $text = $("#text");
var $ts = $.text($text);

由于后一种针对jQuery函数的版本不通过jQuery对象操作,所以相对开销较小,速度比较快。

JavaScript大杂烩16 - 推荐实践

时间: 2024-07-30 13:50:51

JavaScript大杂烩16 - 推荐实践的相关文章

JavaScript大杂烩12 - 理解Ajax

AJAX缘由 再次谈起这个话题,我深深的记得就在前几年,AJAX被炒的如火如荼,就好像不懂AJAX,就不会Web开发一样.要理解AJAX为什么会出现,就要先了解Web开发面临的问题. 我们先来回忆一下Web页面的申请过程,这个咱们在第一篇中就介绍过了:Web页面开发就是在无连接和无状态的HTTP协议上管理页面的状态.每次申请页面的时候,服务器都会返回完整的HTML文本(当然还有其他的文本文件),浏览器就负责解析这个文本并在浏览器中显示. 在这个过程中,不管当前页面的内容是不是都变化了,服务器都会

JavaScript相关图书推荐

JavaScript语言精粹(修订版) 作      者 Douglas Crockford(道格拉斯·克罗克福德) 著:赵泽欣 等 译 出 版 社 电子工业出版社 出版时间 2012-09-01 版      次 1 页      数 172 印刷时间 2012-09-01 开      本 16开 纸      张 胶版纸 印      数 3 I S B N 9787121177408 推荐指数:★★★★★ 购买地址:立即购买 JavaScript & jQuery 交互式Web前端开发

JavaScript大杂烩17 - 性能优化

在上一节推荐实践中其实很多方面是与效率有关的,但那些都是语言层次的优化,这一节偏重学习大的方面的优化,比如JavaScript脚本的组织,加载,压缩等等. 当然在此之前,分析一下浏览器的特征还是很有意义的. 浏览器的特征1. 浏览器的渲染过程 在详细讨论脚本文件的优化前,我们先来看一下浏览器是如何渲染一个HTML页面的. 当浏览器渲染一个HTML页面的时候,它总是从页面的开始位置按顺序向页面末尾依次渲染,当页面遇到引用外部文件的时候(JavaScript脚本,CSS文件等),页面渲染就会停下来等

超实用的JavaScript技巧及最佳实践

众所周知,JavaScript是一门非常流行的编程语言,开发者用它不仅可以开发出炫丽的Web程序,还可以用它来开发一些移动应用程序(如PhoneGap或Appcelerator),它还有一些服务端实现,比如NodeJS.Wakanda以及其它实现.此外,许多开发者都会把JavaScript选为入门语言,使用它来做一些弹出窗口等小东西. 在这篇文章中,作者将会向大家分享JavaScript开发的小技巧.最佳实践等非常实用的内容,不管你是前端开发者还是服务端开发者,都应该来看看这些小技巧,它们绝对会

JavaScript设计模式与开发实践 – 观察者模式 http://web.jobbole.com/87809/

概述 观察者模式又叫发布 – 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫做订阅者,将目标对象叫做发布者).发布者的状态发生变化时就会通知所有的订阅者,使得它们能够自动更新自己. 观察者模式的使用场合就是:当一个对象的改变需要同时改变其它对象,并且它不知道具体有多少对象需要改变的时候,就应该考虑使用观察者模式. 观察者模式的中心思想就是促进松散耦合,一为时间上的解耦,二为对象之间的解耦.让耦合的

JavaScript大杂烩5 - JavaScript对象的若干问题

1. 类型检查:instanceof与typeof 这是两个相似的操作符,instanceof用于检测函数的实例类型,主要是在面向对象编程中检查new出来的对象类型,需要注意instanceof是检查function对象的,前面实现的复制继承中的例子就不适用于使用instanceof来检查继承关系了.typeof,它用于检测变量的类型,在实际情况中应用的不是很多,稍微了解一下就可以了. 在使用typeof之前,有一点需要确认,那就是string与String不是同一个类型,这个不用多说了,我们前

JavaScript大杂烩9 - 理解BOM

毫无疑问,我们学习JavaScript是为了完成特定的功能.在最初的JavaScript类型系统中,我们已经分析过JavaScript在页面开发中充当着添加逻辑的角色,而且我们知道JavaScript不仅仅包含基本的语法规范.下面我们就重点看一下JavaScript在页面中干的那些事.总的来说,JavaScript在页面端就干两件事:操作DOM与操作BOM (当然了向Server获取数据也是它的工作,不过获取到数据后还是回来干这两件事,大家对JavaScript最直接的印象应该就是各种光怪陆离的

JavaScript大杂烩6 - 理解JavaScript中的this

在JavaScript开发中,this是很常用的一个关键字,但同时也是一个很容易引入bug的一个关键字,在这里我们就专门总结一下页面中可能出现的this关键字(包括几种在其他页面文件中出现的this). JavaScript中的this关键字通常只使用在函数中,它指向当前函数的调用者,这是this关键字的本质,所有的使用方式都是围绕这个展开的,让我们来看一下在各种性质的函数中this的用法.1. 在对象的函数中使用this var person = { name: 'Frank', say: f

《JavaScript设计模式与开发实践》读书笔记之观察者模式

1.<JavaScript设计模式与开发实践>读书笔记之观察者模式 观察者模式定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知. JavaScript中通常采用事件模型替代传统的观察者模式 1.1 逐步实现观察者模式 以客户看房为例 首先指定谁充当发布者,如售楼处 然后给发布者添加一个缓存列表,用于存放回调函数以便通知订阅者.这里为了让订阅者只接收自己感兴趣的消息,增加一个标识key 最后发布消息时候,发布者遍历缓存列表,依次触发里面存放的订阅者的回