JavaScript 新手24条实用建议[TUTS+]_javascript技巧

注:本文多次用到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> <!--0--><!--1-->


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


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


引自[/i][i] Douglas Crockford 所作:[/i][i] 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开发的好书吧!下列书单都是我的最爱:

  • Object-Oriented JavaScript(暂无中文版)
  • JavaScript: The Good Parts(中文版)
  • Learning jQuery 1.3(暂无中文版,但你可以看看老版本的中文版)
  • Learning JavaScript(中文版)

阅读他们…… 反复阅读很多次!我现在都还在读。

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.name + ' : ' + response.email + '</li>';
}


关于JSON,请查看更多介绍。

24. 移去“Language”

很多年前,language还是每段script标签必备属性:

复制内容到剪贴板

代码:

<script type="text/javascript" language="javascript">
...
</script>


不过现在,这属性已经没啥用很久了…… 所以,删掉算啦!

就这些了,朋友们~

就是这些了,这就是我给JavaScript初学者的24条小建议。各位亲爱的朋友,你们的看法呢?你们有什么快速小贴士吗?感谢你的耐心阅读。

时间: 2024-11-08 21:23:40

JavaScript 新手24条实用建议[TUTS+]_javascript技巧的相关文章

HTML5游戏开发的5条实用建议

HTML5很棒,因为它几乎无所不能--它并不是为某种特殊的应用设计的.更重要的是,HTML5几乎是无处不在的.它就在你的PC机上.你的手机上.你的平板设备上--它甚至可能就在你的厨房电器上. 正是由于HTML5具有丰富的功能并且无处不在,所以它给开发者带来了很多的灵感.俗话说得好,"一旦开发者有了灵感,他们就开始编写游戏了."(这句话应该是作者编的) 幸运的是,有关HTML5游戏开发的指南现在已经有很多了.而这篇文章则是要告诉开发者在开发HTML5游戏以前应该具备的一些全局概念.你能

Javascript基础知识盲点总结之函数_javascript技巧

函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.本文重点给大家介绍js基础知识盲点总结之函数. 一.函数中的arguments对象 每个函数内部都有一个arguments,它能返回函数所接受的所有参数 注意:argumens接收的是实参 如下是利一个利用arguments特性编写的求和函数: function sumOnSteroids(){ var I, res = 0; var number_of_params = arguments.length; for(I = 0; I <

javascript判断firebug是否开启的方法_javascript技巧

本文实例讲述了javascript判断firebug是否开启的方法.分享给大家供大家参考,具体如下: 经常用Firefox + Firebug调试JavaScript的朋友都知道,一但开启firebug,页面js的运行将显著变慢. 页面的javascript是否能够主动判断当前Firebug是否已开启呢? 答案是肯定的. Firebug已经更新了很多个版本了.印象中某个旧版本可以通过检测console.firebug来判断,不过现在已经无效了. 最近几个版本的firebug可以通过console

javascript弹性运动效果简单实现方法_javascript技巧

本文实例讲述了javascript弹性运动效果简单实现方法.分享给大家供大家参考,具体如下: 弹性运动实现原理:加速运动+减速运动+摩擦运动 运行效果截图如下: 实例代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <style> #div1{ width:100px; height:100px

javascript合并表格单元格实例代码_javascript技巧

本文为大家介绍了一段来源于网络上的代码实例,能够合并单元格,下面和大家分享一下,希望能够给需要的朋友或多或少带来一定的帮助. 代码实例如下: <!DOCTYPE HTML> <html> <head> <meta charset="utf-8"/> <title>表格单元格合并代码</title> <script type="text/javascript"> function au

javascript随机显示背景图片的方法_javascript技巧

本文实例讲述了javascript随机显示背景图片的方法.分享给大家供大家参考.具体如下: 将以下代码加入HTML的<head></head>之间: <script LANGUAGE="JavaScript"> bg = new Array(2); //设定图片数量,如果图片数为3,这个参数就设为2,依次类推 bg[0] = 'bg1.gif' //显示的图片路径,可用http:// bg[1] = 'bg2.gif' bg[2] = 'bg3.gi

JavaScript提高网站性能优化的建议(二)_javascript技巧

在javascript关于提高网站性能的几点建议(一)中,从HTTP请求到页面渲染几个方面对提高网站性能提出了几点建议,本文是学习Steve Sounders的另外一本书<高性能网站建设进阶指南>之后,从JavaScript性能的角度进行总结概括,诸君共勉. JavaScript性能是实现高性能Web应用程序的关键 --Steve Sounders 1 利用js作用域链 作用域链(scope chain) 当执行一段JavaScript代码(全局代码或函数)时,JavaScript引擎会创建为

javascript写的简单的计算器,内容很多,方法实用,推荐_javascript技巧

最近用javascript写了一个简单的计算器,自己测试感觉还好,先给大家观赏下界面: 界面就是这样了,但是功能如何呢? 现在只是个简单的标准计算器,能进行加减乘除连续运算,以及求余运算.如果发生被除数为零的错误,下面会给出提示,就像这样: 自己不知道写的怎么样,但是对于新手来说,这肯定是一份大餐,里面可以接触到的东西不少,可以拿来学习.如果有高手看出里面的疏漏.错误等望不吝赐教,给予指点. 下面贴上代码,希望里面的注释足够多了. js部分: 复制代码 代码如下: var num=0,resul

分享Javascript实用方法二_javascript技巧

JavaScript一种直译式脚本语言,是一种动态类型.弱类型.基于原型的语言,内置支持类型.它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能. 承接上一篇, Object keys object的keys方法能够获取一个给定对象的所有键(key/属性名)并以数组的形式返回.这个方法可以用于键的筛选.匹配等. var basket = { strawberry: 12,