转载:http://www.yeeyan.com/articles/view/benhuoer/46746?tag_related
为JavaScript做一点性能小提升吧!
本文列出了24条能让你的代码编写过程更为轻松高效的建议。也许您还是JavaScript初学者,刚刚写完自己的Hello World,那这里有很多对您的工作将十分有用的小贴士;也许有些技巧您已经知道,那就试试快速浏览一下,看能不能发现一点新东西吧!
注:本文多次用到Firebug的console对象,请参考Firebug Console API 。关于firebug的更详细介绍,请猛击这里。
1. 用 === 代替 ==
JavaScript里有两种不同的相等运算符:===|!==
和==|!=
。相比之下,前者更值得推荐。请尽量使用前者。
“如果两个比较对象有着同样的类型和值,===返回true,!==返回false。”
– JavaScript: The Good Parts
不过,如果使用==
和!=
,在操作不同数据类型时, 你可能会遇到一些意想不到的问题。在进行相等判断前,JavaScript会试图将它们转换为字符串、数字或 Boolean量。
2. 避免使用Eval函数
Eval函数把一个字串作为参数,并把字串作为JavaScript语句执行,返回结果(参考)。
此函数不仅会降低你脚本的执行效率,而且还大大增加了安全风险,因为它赋予了作为文本的参数太大的权利。千万别用!
3. 不要使用快速写法
技术上说,你可以省略掉大部分花括弧和句尾分号,绝大多数浏览器都能正确执行以下语句:
if(someVariableExists)
x = false
不过,如果是这样的呢:
if(someVariableExists)
x = false
anotherFunctionCall();
你可能会认为它和下面的语句相等:
if(someVariableExists) {
x = false;
anotherFunctionCall();
}
不幸的是,事实并非如此。现实情况是它等价于:
if(someVariableExists) {
x = false;
}
anotherFunctionCall();
如您注意到的,再漂亮的缩进也不能代替这华丽的花括弧。在所有情况下都请写清楚花括号和句尾分号。在只有一行语句的时候能偶尔省略掉,虽然下这么做也是极度不被推荐的:
if(2 + 2 === 4) return 'nicely done';
多考虑下将来吧,孩子
假设,在将来的开发过程中,你需要为这个 if 语句添加更多的命令呢?到时候你还不是得把括号给加上?
4. 好好利用JS Lint
JSLint 是由 Douglas Crockford 编写的一个调试器。你只需要贴上你的代码,它就能快速为您扫描出任何明显的错误和问题。
“JSLint 扫描接收的代码。发现问题,描述问题,并给出其在源码中的大概位置。可发现的问题包括但不限于语法错误,虽然语法错误确实是最常见的。JSLint也会用 约定俗成的习惯检查代码的格式化风格,以及结构错误。通过JSLint的扫描并不能保证你的程序就完全正确。它只是为您提供了额外一双发现错误的眼睛。”
– JSLint 文档
完成代码之前,把它放到JSLint里检查一下,快速消灭你的无心之过。
5. 在页面底部加载脚本
正如下图所示:
请记住—— 我们要千方百计保证客户端的页面载入速度尽可能的快。而脚本没载入完成,浏览器就没法加载页面的剩余部分。
如果你的JS文件只是添加一些额外功能——例如,为点击某链接绑定事件——那大可以等页面加载基本完成后再做。把JS文件放到页面最后,body的结束标签之前,这样做最好了。
更好的写法是
<p>超哥是世界上最帅的人。benhuoer.com是世界上最好看的博客。</p>
<script type="text/javascript" src="path/to/file.js"></script>
<script type="text/javascript" src="path/to/anotherFile.js"></script>
</body>
</html>
6. 在 For 语句外部声明变量
当需要执行冗长的for语句时,不要让JavaScript引擎每次都重复那些没有必要的操作。例如:
这样不好
for(var i = 0; i < someArray.length; i++) {
var container = document.getElementById('container');
container.innerHtml += 'my number: ' + i;
console.log(i);
}
这段代码每次都重新定义数组长度,每次都在遍历DOM寻找container元素 —— 太傻了!
这样好多了
var container = document.getElementById('container');
for(var i = 0, len = someArray.length; i < len; i++) {
container.innerHtml += 'my number: ' + i;
console.log(i);
}
我要给留言改进这段代码的人额外惊喜!欢迎大家留言讨论!
7. 快速构建字串
要对一个数组或对象做循环操作时,不要老惦记着一表人才的for语句,拿点创意出来嘛!明明就还有很多更快的办法:
var arr = ['item 1', 'item 2', 'item 3', ...];
var list = '<ul><li>' + arr.join('</li><li>') + '</li></ul>';
“没那么多繁文缛节来烦你;你就信我一次好了(或者你也可以自己试一试)—— 这真的是迄今能找到的最快办法了!
用点土办法,也别管它背后究竟发生了什么抽象的东西,通常土办法都比那些优雅的办法要快捷得多!”
– James Padolsey, james.padolsey.com
8. 减少全局变量
“把你踩在全局的那些乱七八糟的脚印都归于一人名下,能显著降低与其他应用、小工具或JS库冲突的可能性。”
– Douglas Crockford
var name = 'Jeffrey';
var lastName = 'Way';
function doSomething() {...}
console.log(name); // Jeffrey -- or window.name
更好的写法
var DudeNameSpace = {
name : 'Jeffrey',
lastName : 'Way',
doSomething : function() {...}
}
console.log(DudeNameSpace.name); // Jeffrey
注意看,我们是如何戏剧化地把“乱七八糟的脚印”都归到“DudeNameSpace”这对象之下的。
9. 写好注释
可能一开始你会觉得并无必要,但相信我,你将来会主动想要尽可能写好代码的注释的。当你几个月后再回看某项目时,结果却发现很难想起当时写某句东西时脑子在想的什么了,是不是很让人沮丧呢?或者,如果有同事要修订你的代码呢?一定,一定要为你代码里的重要部分加上注释。
// 遍历数组,输出各自名称
for(var i = 0, len = array.length; i < len; i++) {
console.log(array[i]);
}
10. 试试渐进增强
一定要记得为未启用JavaScript的情况提供替代方案。大家可能会认为,“大部分我的访客都启用了JavaScript的,我才不用担心”。这样的话,你可就大错特错了!
你有没有试过看看禁用JavaScript后你那漂亮的滑动器都成啥样了?(你可以下载 Web Developer ToolBar 轻松完成这项任务。)禁用之后你的网站可能就彻底失去了可用性!经验之谈:开发初期总是按照没有JavaScript来设计你的网站,之后再进行渐进地功能增强,小心翼翼地改变你地布局。
11. 不要传递字串给 “setInterval” 或 “setTimeout”
看看下面的代码:
setInterval(
"document.getElementById('container').innerHTML += 'My new number: ' + i", 3000
);
不仅执行不高效,而且和 eval 函数有着同样的高风险。千万不要把字串传递给 setInterval 和 setTimeout。恰当的做法是,传递一个函数名:
setInterval(someFunction, 3000);
12. 不要使用with语句
初识之下,“with”语句似乎还挺好用的。它用于设置代码在特定对象中的作用域。其基本用法是提供深入到对象中处理元素的快速写法。例如:
with (being.person.man.bodyparts) {
arms = true;
legs = true;
}
– 等价于 —
being.person.man.bodyparts.arms = true;
being.person.man.bodyparts.legs= true;
不幸的是,测试表明,若你要为对象插入新成员,with的表现非常糟糕,它的执行速度非常缓慢。替代方案是声明一个变量:
var o = being.person.man.bodyparts;
o.arms = true;
o.legs = true;
13. 使用 {},而不用New Object()
在JavaScript有多种方式能新建对象。最传统的方法是 new 语句,如下:
var o = new Object();
o.name = 'Benhuoer';
o.lastName = 'Yang';
o.someFunction = function() {
console.log(this.name);
}
不过,这一方法读起来却比较糟糕。我强烈建议你采用下面这种在文字样式上更为强健的写法:
更好的写法
var o = {
name: 'Jeffrey',
lastName = 'Way',
someFunction : function() {
console.log(this.name);
}
};
注意,如果你想新建一个空对象,用 {} 就能行:
var o = {};
“对象字面符(Objects literals)帮助我们写出支持很多特性,同时又关联性强、简明直接的代码。没必要直接调用新建语句,然后再费心维护声明变量和传递变量的语句之间的正确顺序,等等。” – dyn-web.com
14. 使用[],而不用New Array()
新建数组时的同类型运用。
行得通的写法
var a = new Array();
a[0] = "Joe";
a[1] = 'Plumber';
更好的写法
var a = ['Joe','Plumber'];
“在JavaScript编程中经常遇到的一个错误是,该用数组时却用了对象,该用对象时却用了数组。规则其实很简单:当属性名是小的连续整数时,你应该使用数组。其他情况,使用对象。” – Douglas Crockford
15. 一长列变量声明?别写那么多var,用逗号吧
var someItem = 'some string';
var anotherItem = 'another string';
var oneMoreItem = 'one more string';
更好的写法
var someItem = 'some string',
anotherItem = 'another string',
oneMoreItem = 'one more string';
…不言自明。我不知道这样做能否提升代码执行速度,但是确实让你的代码干净许多。
17. 千万千万记得写分号
大部分浏览器都允许你不写句尾分号:
var someItem = 'some string'
function doSomething() {
return 'something'
}
之前已经说过,这样做会造成潜在的更大、更难以发现的问题:
更好的写法
var someItem = 'some string';
function doSomething() {
return 'something';
}
18. “For in” 语句
遍历对象时,你可能会发现你还需要获取方法函数。所以遇到这种情况时,请一定记得给你的代码包一层 if 语句,用以过滤信息。
for(key in object) {
if(object.hasOwnProperty(key) {
...then do something...
}
}
引自 Douglas Crockford 所作: JavaScript: The Good Parts
19. 使用Firebug的“Timer”功能优化你的代码
想要轻松地快速了解某项操作的用时吗?使用Firebug的timer功能来记录结果好了。
function TimeTracker(){
console.time("MyTimer");
for(x=5000; x > 0; x--){}
console.timeEnd("MyTimer");
}
20. 读,读,读……Read, Read, Read…
虽然我是Web开发博客(就像这个!)的超级粉丝,但吃饭和睡觉前除了看书好像也别无选择~ 在你的床头柜上摆一本Web开发的好书吧!下列书单都是我的最爱:
阅读他们…… 反复阅读很多次!我现在都还在读。
21. 自决的函数
相比于调用函数,让函数在页面载入或者某一父函数被调用时自动执行,是十分简单方便的做法。你只需要把你的函数包在父辈之内,然后添上一个额外的括号,本质上这括号就触发了你定义的函数(了解更多)。
(function doSomething() {
return {
name: 'jeff',
lastName: 'way'
};
})();
22. 原生 JavaScript 总是会比使用代码库来的快
诸如jQuery和Mootools这样的JavaScript库,能为你写代码的过程省下不少时间——尤其是当需要 AJAX 操作时。不过你可得记住,只要你的代码写得恰当,原生JavaScript总是会比利用代码库的写法执行得快一些。
jQuery的“each” 方法对于循环操作十分便利,但是使用原生态的for语句总归会快很多。
23. Crockford 的 JSON.Parse
尽管 JavaScript 2会内建JSON处理器,但写这篇文章之时,我们还是需要自己实现。Douglas Crockford,JSON的创建者,已经为我们创作出能直接使用的处理器了。您可以在这里下载。
导入这段代码,你就能新建 JSON 全局对象,然后处理你的 .json 文件。
var response = JSON.parse(xhr.responseText);
var container = document.getElementById('container');
for(var i = 0, len = response.length; i < len; i++) {
container.innerHTML += '<li>' + response[i].name + ' : ' + response[i].email + '</li>';
}
关于JSON,请查看更多介绍。
24. 移去“Language”
很多年前,language还是每段script标签必备属性:
<script type="text/javascript" language="javascript">
...
</script>
不过现在,这属性已经没啥用很久了…… 所以,删掉算啦!
就这些了,朋友们~
就是这些了,这就是我给JavaScript初学者的24条小建议。各位亲爱的朋友,你们的看法呢?你们有什么快速小贴士吗?感谢你的耐心阅读。
英文原文:24-javascript-best-practices-for-beginners
译文原文:给JavaScript新手的24条建议
© 请尊重版权,若需转载,务必保留链接。
分享到:
相关推荐
《Effective JavaScript:编写高质量JavaScript代码的68个有效方法》是David Herman撰写的一本JavaScript编程指南,该书基于作者在Ecma的JavaScript标准化委员会的工作经验,深入探讨了JavaScript的内部工作机制、...
以上就是编写性能高效的JavaScript事件处理的一些技术要点。在实际开发过程中,理解这些原理并结合具体的项目需求,选择合适的方法和工具,可以有效地提升Web应用的性能。随着Web技术的不断进步,前端开发者应当持续...
通过不断学习和实践,可以进一步提升JavaScript编程能力,创建出更加健壮、高效的应用程序。《Effective JavaScript》扫描识别版(中文).pdf这本书可能会提供更多深入的见解和技巧,值得深入阅读和研究。
在这个"javascript 编写的绘制图表程序"中,我们看到一个纯JavaScript实现的图表库,无需依赖任何外部插件,这使得它具有轻量级、可定制性强的特点。下面我们将深入探讨这个程序涉及的主要知识点。 1. **SVG或...
在这个场景中,我们讨论的是一个使用JavaScript编写的经典游戏——Tetris(俄罗斯方块)。Tetris是一款起源于1984年的电子游戏,由阿列克谢·帕基特诺夫设计,因其简单的规则和高度上瘾性而广受欢迎。 编写...
### 编写可维护的JavaScript #### 书籍信息概览 - **书名**:《Maintainable JavaScript》 - **作者**:Nicholas C. Zakas - **出版年份**:2012年 - **出版社**:O'Reilly Media, Inc. - **ISBN**:978-1-449-...
JavaScript中的`Array.prototype.filter`和`Array.prototype.some`方法可以辅助我们高效地进行碰撞检测。 背景和画面的精美程度往往依赖于HTML5的Canvas API。Canvas提供了丰富的绘图功能,允许开发者在画布上绘制...
这就是为什么开发者开始寻找优化JavaScript执行的方法,其中一种方法就是通过编译器将JavaScript转换为更高效的形式。本文将深入探讨一个使用Rust语言编写的JavaScript到JavaScript编译器——SWC。 SWC(Speedy Web...
在讨论《编写可维护的JavaScript》一书之前,需要明确几个核心的概念和最佳实践,它们对编写可维护的代码至关重要。 1. **可维护性的定义**:可维护性指的是软件产品在出现问题时,能够快速找到原因并修复,或是在...
《高效JavaScript》是一本专注于提升JavaScript编程效率的专业书籍。作者通过深入探讨JavaScript的内在机制,提供了许多实用的技巧和最佳实践,旨在帮助开发者编写出更高效、更优化的代码。在阅读这本书的过程中,...
1st JavaScript Editor是一款专为JavaScript编程设计的强大编辑器,它为开发者提供了高效且便捷的代码编写环境,尤其适合初学者和专业人士使用。该编辑器以其对JavaScript、HTML和CSS的全面支持,使得开发者能够一站...
在"accp 5.0 s2 javascript 第六章"的学习中,我们聚焦于JavaScript这一强大的编程语言,特别是在上机阶段。JavaScript是互联网应用开发的关键技术,尤其在网页动态交互方面有着不可替代的作用。本章的内容可能包括...
根据提供的文件信息,这里主要关注的是“编写可维护的JavaScript”这一主题,而提供的部分内容却集中在PHP内核的理解与环境搭建上...通过遵循以上建议,可以帮助开发人员创建出既高效又易于维护的JavaScript应用程序。
为了快速开发功能丰富的日历组件,可以借助现有的JavaScript库或框架,如FullCalendar、jQuery UI Datepicker、Pickadate.js等,它们提供了丰富的配置选项和插件支持,能帮助开发者高效地完成日历功能。 综上所述,...
在JavaScript中,由于其独特的原型继承和动态类型,理解并运用设计模式能帮助开发者编写更高效、更易于维护的代码。 二、基本技巧 这部分可能涵盖变量作用域、闭包、异步编程(如回调函数、Promise、async/await)...
在《JavaScript模式》这本书中,作者深入探讨了JavaScript的各种编程模式,这些模式是解决常见编程问题的最佳实践,可以帮助开发者编写出更加清晰、可维护的代码。书中可能涵盖了以下内容: 1. **函数式编程**:...