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

注:本文多次用到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开发的好书吧!下列书单都是我的最爱:

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

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条小建议。各位亲爱的朋友,你们的看法呢?你们有什么快速小贴士吗?感谢你的耐心阅读。

(0)

相关推荐

  • JavaScript 新手24条实用建议[TUTS+]

    注:本文多次用到Firebug的console对象,请参考Firebug Console API .关于firebug的更详细介绍,请猛击这里.1. 用 === 代替 == JavaScript里有两种不同的相等运算符:===|!== 和==|!=.相比之下,前者更值得推荐.请尽量使用前者. 引用: "如果两个比较对象有着同样的类型和值,===返回true,!==返回false." – JavaScript: The Good Parts不过,如果使用==和!=,在操作不同数据类型时,

  • 24个实用JavaScript 开发技巧

    目录 1. 初始化数组 2. 数组求和.求最大值.最小值 3. 过滤错误值 4. 使用逻辑运算符 5. 判断简化 6. 清空数组 7. 计算代码性能 8. 拼接数组 9. 对象验证方式 10. 验证undefined和null 11. 数组元素转化为数字 12. 类数组转为数组 13. 对象动态声明属性 14. 缩短console.log() 15. 获取查询参数 16. 数字取整 17. 删除数组元素 18. 检查对象是否为空 19. 使用 switch case 替换 if/else 20.

  • 提高正则表达式性能的几点实用建议汇总

    目录 为什么正则表达式效率很重要? 低效正则表达式的剖析 真实例子 编写高效正则表达式的指南 考虑故障场景 注意通配符标记的多次重复 不要以通配符重复开始正则表达式 只匹配你真正需要的 试着快速失败 Profile-尤其是故障案例 尽量减少从主机中提取的数据 除非绝对必要,否则不要使用组 考虑正则表达式 TPL触发器的正则表达式优化 索引 试着给点提示 尝试做出独特的提示 总结 当正则表达式通常与大型数据集相匹配时它们的编写必须高效. 为什么正则表达式效率很重要? 虽然写得好的正则表达式可能非常

  • javascript 网页进度条简单实例

    javascript 网页进度条简单实例 最近学习新的知识,遇到一个小功能网页进度条,发现一篇文章还是不错的,这里记录下,也许能帮助到大家, 实例代码: <!DOCTYPE html> <html> <head> <style> #box {float:left;width:100%;height:18px;border:1px solid;} #bar {float:left;width:100%;height:18px;border:0px;backgr

  • JavaScript实现非常简单实用的下拉菜单效果

    本文实例讲述了JavaScript实现非常简单实用的下拉菜单效果.分享给大家供大家参考.具体如下: 这是一款实用的JS下拉菜单,鼠标移上菜单就显示出二级菜单,是从其它网站上整理下来的,修改花了不少时间,现在去除了一些无用代码,更简洁了,而且代码兼容性似乎也表现不错,这款两级下拉菜单,基本是由CSS和JavaScript共同实现的,真的挺简洁实用. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-css-down-show-menu-code

  • 24条货真价实的PHP代码优化技巧

    PHP代码优化24条真经,希望对大家开发php项目有所帮助,具体内容如下 1.echo比print快. 2.使用echo的多重参数代替字符串连接. 3.在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替. 4.对global变量,应该用完就unset()掉. 5.用单引号代替双引号来包含字符串,这样做会更快一些.因为PHP会在双引号包围的字符串中搜寻变量,单引号则不会. 6.函数代替正则表达式完成相同功能. 7.当执行变量$i的递增或递减时,$i++会比+

  • JavaScript如何调试有哪些建议和技巧附五款有用的调试工具

    以下内容是关于javascript如何调试有哪些建议和技巧的相关知识,具体详情请看下文吧. 浏览器开发者工具 我个人最喜欢Chrome开发者工具.虽然Safari和Firefox无法达到Chrome那么高的标准,但它们也在逐渐改善.在Firefox中,可以将Firebug和Firefox开发者工具组合使用.如果Firefox小组在改进内置开发者工具方面继续表现优异的话,Firebug有一天可能会被淘汰. 先把个人偏好放在一边,你应该能够在目标浏览器中对任意代码进行试验和调试.你的目标浏览器可能包

  • Javascript新手入门之字符串拼接与变量的应用

    1. 课程大纲 字符串拼接(+)的学习和应用 坐标变换在飞机大战游戏中的应用 2.1 字符串的拼接 在JS中使用"+"号,连接字符串.变量.数值等. 2.2 在警告框上显示朋友的数量 在警告框上显示朋友的数量,显示效果如下 声明变量 friends表示朋友的数量,在警告框上显示"我的朋友数量为:7",使用字符串拼接符"+" ,代码如下' var friends = 7; alert("我的朋友数量为:" +friends);

  • 原生JavaScript实现进度条

    JavaScript实现进度条的具体代码,供大家参考,具体内容如下 进度条实现介绍 使用JavaScript实现进度条功能. 原理:通过鼠标移动事件,获取鼠标移动的距离. 步骤: (1)html 中 div 布局 (2)css 样式编写 (3)JavaScript特效编写 html代码 <body> <!-- 整体盒子 --> <div id="box"> <!-- 进度条整体 --> <div id="progress&

  • android布局优化的一些实用建议

    前言 Android的绘制优化其实可以分为两个部分,即布局(UI)优化和卡顿优化,而布局优化的核心问题就是要解决因布局渲染性能不佳而导致应用卡顿的问题,所以它可以认为是卡顿优化的一个子集. 本文主要包括以下内容 为什么要进行布局优化及android绘制,布局加载原理 获取布局文件加载耗时的方法 介绍一些布局优化的手段与方法 一些常规优化手段 为什么要进行布局优化? 为什么要进行布局优化?答案是显而易见的,如果布局嵌套过深,或者其他原因导致布局渲染性能不佳,可能会导致应用卡顿 那么布局到底是如何导

随机推荐