资讯专栏INFORMATION COLUMN

JavaScript最佳实践20则

fuchenxuan / 3278人阅读

摘要:本文总结了则的最佳实践,希望对各位爪哇国编剧有用。使用有两种等值运算符,分别是和,以及和。比较两个值的时候,请使用前者,避免讨厌的强制类型转换带来预料之外的结果。下只提供无强制类型转换的别名和别名,不用头疼选哪种。

本文总结了20则JavaScript的最佳实践,希望对各位爪哇国编剧有用。(顺带推销下CoffeeScript)

1. 使用 ===

JavaScript有两种等值运算符,分别是=====,以及!==!=。比较两个值的时候,请使用前者,避免JavaScript讨厌的强制类型转换带来预料之外的结果。

CoffeeScript下只提供无强制类型转换的==(别名is)和!=(别名isnt),不用头疼选哪种。

2. eval很邪恶

eval让我们将字符串作为参数执行,这是非常强大的特性。然而,eval会大幅降低脚本的性能,也会引起安全问题。除非你打算用JavaScript写一个编译器,还是对eval敬而远之的好。

3. 少打字多费脑

省掉一些花括号,大多数浏览器仍然能理解,例如:

if(someVariableExists)  
   x = false

然而,复杂一点的代码就可能带来问题:

if(someVariableExists)  
   x = false  
   anotherFunctionCall();

你想表达的也许是:

if(someVariableExists) {  
   x = false;  
   anotherFunctionCall();  
}

然而实际上等价于:

if(someVariableExists) {  
   x = false;  
}  
anotherFunctionCall();

所以,还是乖乖地写花括号吧,这能为你省去无数麻烦。

如果你真那么讨厌花括号,还是投入CoffeeScript的怀抱吧:

if someVariable?
  x = false

if someVariable?
  x = false
  anotherFunctionCall()

同理,大多数浏览器允许你省略分号:

var someItem = "some string"  
function doSomething() {  
  return "something"  
}

这和省略花括号一样糟糕,还是老实一点好:

var someItem = "some string";  
function doSomething() {  
  return "something";  
}

或者,投奔CoffeeScript吧,不用分号了:

someItem = "some string"
doSomething = -> "something"

函数的写法是不是也很帅?直接定义一个匿名函数,然后把它赋给一个变量即可。

4. 使用JSLint

JSLint是一款非常棒的调试器,它会迅速找出代码中的问题,包括语法错误、编码风格和程序结构问题。

5. 将脚本放在页面的底部

脚本加载是阻塞的,脚本加载并执行完之后,浏览器不能继续渲染下面的内容。因此,用户被迫等待更长时间。如果你的JavaScript脚本只是用来增强效果,那么请将它放在页面的最后:

And now you know my favorite kinds of corn.

6. 避免在for语句中声明变量

糟糕的例子:

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 = "
  • " + arr.join("
  • ") + "
";
8. 减少全局变量

避免模块和类库互相干扰。

var name = "Jeffrey";  
var lastName = "Way";  

function doSomething() {...}  

console.log(name);

更好:

var DudeNameSpace = {  
   name : "Jeffrey",  
   lastName : "Way",  
   doSomething : function() {...}  
}  
console.log(DudeNameSpace.name)

CoffeeScipt下变量默认非全局,不需要加var,而且编译的时候,整个.coffee文件处于一个函数之中,也就是说,一个独立的命名空间。使用CoffeeScript,不用再操心全局变量问题。

9. 注释

良好的注释,帮助别人或者几个月之后的你理解你的代码。

10. 渐进增强

“大多数访问者启用了JavaScript,不必担心”这是很大的误区。

花费一点时间查看下你漂亮的页面在javascript被关闭时是什么样的吧。设计网站时,首先假定 JavaScript 是被禁用的,在此基础上,渐进增强网站。

11. 不要给setIntervalsetTimeout传递字符串参数
setInterval(  
"document.getElementById("container").innerHTML += "My new number: " + i", 3000  
);

上面的代码和eval如出一辙,效率低下。我们应该传递函数:

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()

new加构造函数可以创建对象:

var o = new Object();  
o.name = "Jeffrey";  
o.lastName = "Way";  
o.someFunction = function() {  
   console.log(this.name);  
}

这种方法多受诟病,更好的做法是:

var o = {  
   name: "Jeffrey",  
   lastName = "Way",  
   someFunction : function() {  
      console.log(this.name);  
   }  
};

这样我们就不需要直接调用构造函数,也不需要为传递给函数的参数的正确顺序而提心吊胆。

14. 使用[]代替new Array()

创建数组也是一样的道理。

var a = new Array();  
a[0] = "Joe";  
a[1] = "Plumber";

不如

var a = ["Joe","Plumber"];
15. 定义多个变量时,使用逗号
var someItem = "some string";  
var anotherItem = "another string";  
var oneMoreItem = "one more string";

不如这样:

var someItem = "some string",  
    anotherItem = "another string",  
    oneMoreItem = "one more string";

这样代码更清晰。

CoffeeScript?正如我们前面提到的,变量默认非全局,所以我们根本不需要var

16. for in

遍历对象的属性的时候,还会遍历方法函数,真浪费。加上一个if语句过滤下:

for(key in object) {  
   if(object.hasOwnProperty(key) {  
      ...then do something...  
   }  
}
17. 使用Firebug timer 作性能分析

Firebug timer 可以简单地确定操作消耗的时间:

function TimeTracker(){  
 console.time("MyTimer");  
 for(x=5000; x > 0; x--){}  
 console.timeEnd("MyTimer");  
}
18. 阅读,阅读,还是阅读

午餐之余或上床睡觉之前,读点书吧。床头常发一本web开发方面的书。我喜欢读的一些书包括:

Object-Oriented JavaScript

JavaScript: The Good Parts

Learning jQuery 1.3

Learning JavaScript

读下吧。多读几遍。我常读。

19. 自执行函数

用括号包裹函数定义,然后应用函数:

(function doSomething() {  
   return {  
      name: "jeff",  
      lastName: "way"  
   };  
})();

CoffeeScript版本更简洁:

(-> { name: "jeff", lastName: "way" })()

do的话更清楚:

do -> { name: "jeff", lastName: "way" }
20. 原生代码总能比使用库更快

jQuery和Mootools可以节约你大量的开发时间——特别是处理AJAX。但是别忘了,使用库永远不会比原生代码快(假定你编码正确)。


本文为24 JavaScript Best Practices for Beginners的衍生作品,在其基础上进行了归并调整,并加入了 CoffeeScript 的内容。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77988.html

相关文章

  • 前端学习资源

    摘要:掘金日报第四期使用怎么能不知道这些插件合集掘金日报主打分享优质深度技术内容,技术内容分前端后端产品设计工具资源和一些有趣的东西。目前已经涵盖了的相关资源链接,供大家参考与学习。 【掘金日报】第四期 使用Sublime?怎么能不知道这些 Sublime 插件合集! 掘金日报主打分享优质深度技术内容,技术内容分:前端、后端、Android、iOS、产品设计、工具资源和一些有趣的东西。 前端...

    xzavier 评论0 收藏0
  • 前端学习资源

    摘要:掘金日报第四期使用怎么能不知道这些插件合集掘金日报主打分享优质深度技术内容,技术内容分前端后端产品设计工具资源和一些有趣的东西。目前已经涵盖了的相关资源链接,供大家参考与学习。 【掘金日报】第四期 使用Sublime?怎么能不知道这些 Sublime 插件合集! 掘金日报主打分享优质深度技术内容,技术内容分:前端、后端、Android、iOS、产品设计、工具资源和一些有趣的东西。 前端...

    weij 评论0 收藏0
  • Webpack 最佳实践总结(一)

    摘要:它会代替所有的实例的值为,从而使知道那些判断表达式总是错误的,从而删除相关代码,进一步压缩打包文件模块机制项目中使用的,通过也能通过打包有用的代码,进一步减少大小。 好久没写文章,这次预计会带来3篇的 Webpack 系列文章,将会在这几天内更新完。 Webpack3 自今年6月20日正式发布而来,给我们带来Scope Hoisting和Magic Comments两大功能,可惜不在这...

    jubincn 评论0 收藏0
  • [ 好文分享 ] jQuery最佳实践

    摘要:所以,最佳选择是。事实上,这种处理完全不必要。这样的设计,使得读取局部变量比读取全局变量快得多。请看下面两段代码,第一段代码是读取全局变量第二段代码是读取局部变量第二段代码读取变量的时候,不用前往上一层作用域,所以要比第一段代码快五六倍。 转自:http://www.ruanyifeng.com/blog/2011/08/jquery_best_practices.html ...

    mzlogin 评论0 收藏0
  • jQuery最佳实践

    摘要:所以,最佳选择是。事实上,这种处理完全不必要。这样的设计,使得读取局部变量比读取全局变量快得多。请看下面两段代码,第一段代码是读取全局变量第二段代码是读取局部变量第二段代码读取变量的时候,不用前往上一层作用域,所以要比第一段代码快五六倍。 转自:阮一峰 日期: 2011年8月 4日http://www.ruanyifeng.com/blo... 上周,我整理了《jQuery设计思想》。...

    senntyou 评论0 收藏0

发表评论

0条评论

fuchenxuan

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<