`
touchinsert
  • 浏览: 1325287 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

javaScript——优化

 
阅读更多

javaScript是一门解释性的语言、它不像java、C#等程序设计语言、由编译器先进行编译再运行、而是直接下载到用户的客户端进行执行。因此代码本身的优劣就直接决定了代码下载的速度以及执行的效率。

        1、减缓代码下载时间:

        Web浏览器下载的是javaScript的源码、其中包含的长变量名、注释、空格和换行等多余字符大大减缓了代码下载的时间。这些字符对于团队编写时十分有效、但在最后工程完成上传到服务器时、应当将它们全部删除。例如:

  1. function  showMeTheMoney(){  
  2.         if (!money){  
  3.                 return   false ;  
  4.         }else {  
  5.                 ...  
  6.         }  
  7. }  

可优化成:
  1. function  showMeTheMoney(){ if (!money){ return   false ;} else {...}}  

        这样、优化后就节约了25个字节、倘若是一个大的javaScript工程、将节省出非常大的空间、不但提高了用户的下载速度、也减轻了服务器的压力。相信这样的代码大家见过不少、很多优秀的js插件源码都这么干!

        另外、对于布尔型的值true和false、true都可以用1来代替,而false可以用0来代替。对于true节省了3个字节、而false则节省了4个字节、例如:

  1. var  bSearch =  false ;  
  2.         for ( var  i=0;i<aChoices.length&&!bSearch;i++){  
  3.             if (aChoices[i] == vValue)  
  4.                 bSearch = true  ;  
  5.         }  

替换成:
  1. var  bSearch = 0;  
  2.         for ( var  i=0;i<aChoices.length&&!bSearch;i++){  
  3.             if (aChoices[i] == vValue)  
  4.                 bSearch = 1 ;  
  5.         }  

        替换了布尔值之后、代码的执行效率、结果都相同、但节省了7个字节。

        代码中常常会出现检测某个值是否为有效值的语句、而很多条件非的判断就判断某个变量是否为"undefined"、"null"、或者"false"、例如:

  1. if (myValue != undefined){  
  2.             //...   
  3.         }  
  4.           
  5.         if (myValue != null ){  
  6.             //...   
  7.         }  
  8.           
  9.         if (myValue !=  false ){  
  10.             //...   
  11.         }  

        这些虽然都正确、但采用逻辑非操作符"!"也可以有同样的效果、代码如下:
  1. if (!myValue){  
  2.             //...   
  3.         }  

        这样的替换也可以节省一部分字节、而且不太影响代码的可读性。类型的代码优化还有将数组定义时的 new Array()直接用"[]"代替、对象定义时的 new Object()用"{}"代替等、例如:
  1. var  myArray =  new  Array();  
  2.         var  myArray = [];  
  3.         var  myObject =  new  Object();  
  4.         var  myObject = {};  

        显然、第二行和第四行的代码较为精简、而且也很容易理解。

        另外、在编写代码时往往为了提高可读性、函数名称、变量名称使用了很长的英文单词、同时也大大增加了代码的长度、例如:

  1. function  AddThreeVarsTogether(firstVar,secondVar,thirdVar){  
  2.             return  (firstVar+secondVar+thirdVar);  
  3.         }  

可优化成:
  1. function  A(a,b,c){ return  (a+b+c);}  

         注意:在进行变量名称替换时、必须十分小心、尤其不推荐使用文本编辑器的"查找"、"替换"功能、因为编辑器不能很好地区分变量名称或者其他代码。例如、希望将变量"tion"全部替换成"io"、很可能导致关键字"function"也被破坏。

        对于上面说的这些减少代码体积的方法、有一些很实用的小工具可以自动完成类似的工作、例如ECMAScript Cruncher、JSMin、Online JavaScript Compressor等。

        2、合理声明变量

        减少代码的体积仅仅只能使得用户下载的速度变快、但执行程序的速度并没有改变。要提高代码执行的效果、还得在各方面做调整。

        在浏览器中、JavaScript默认的变量范围是window对象、也就是全局变量。全局变量只有在浏览器关闭才释放。而JavaScript也有局部变量、通常在function中执行完毕就会立即被释放。因此在函数体中要尽可能使用var关键字来声明变量:

  1. function  First(){  
  2.             a = ""  ;    //直接使用变量   
  3.         }  
  4.         function  Second(){  
  5.             alert(a);  
  6.         }  
  7.         First();  
  8.         Second();  

        这样、变量"a"就成为了全局变量、直到页面关闭时才会被销毁、浪费了不必要的资源、如果在"a"的前面加上"var"、这样"a"就成为了当前function的局部变量。在执行完First()便立即被销毁。因此、在函数体中、如果不是特别需要的全局变量、都应当使用"var"进行声明、从而节省系统资源。

        

        3、使用内置函数缩短编译时间

        只要可能、应当尽量使用JavaScript的内置函数。因为这些内置的属性、方法都是用类似C、C++之类的言语编译过的、运行起来比实时编译的JavaScript快很多。例如计算指数函数、可以自己编写:

  1. < html >   
  2.   < head >   
  3.     < base   href = "<%=basePath%>" >   
  4.     < title > 内置函数 </ title >   
  5.     < meta   http-equiv = "pragma"   content = "no-cache" >   
  6.     < meta   http-equiv = "cache-control"   content = "no-cache" >   
  7.     < meta   http-equiv = "expires"   content = "0" >       
  8.     < meta   http-equiv = "keywords"   content = "keyword1,keyword2,keyword3" >   
  9.     < meta   http-equiv = "description"   content = "This is my page" >   
  10.     < script   type = "text/javascript" >   
  11.         function myPower(iNum,n){  
  12.             var iResult  =  iNum  ;  
  13.             for(var i = 0 ;i < n ;i++)  
  14.                 iResult *= iNum ;  
  15.             return iResult;  
  16.         }  
  17.         var myDate1  =  new  Date();  
  18.         for(var i = 0 ;i < 150000 ;i++){  
  19.             myPower(7,8);  //自定义方法  
  20.         }  
  21.         var myDate2  =  new  Date();  
  22.         document.write(myDate2 - myDate1);  
  23.         document.write("< br /> ");  
  24.         myDate1  =  new  Date();  
  25.         for(var i = 0 ;i < 150000 ;i++){  
  26.             Math.pow(7,8);  //采用系统内置方法  
  27.         }  
  28.         myDate2  =  new  Date();  
  29.         document.write(myDate2 - myDate1);  
  30.     </ script >   
  31.   </ head >   
  32.   < body >   
  33.   </ body >   
  34. </ html >   

        我运行的结果是、自定义方法用了15、内置方法用了1(不同的计算机运行速度会有差别)、这样就能看出、系统内置的方法要快很多。

        

        4、合理书写if语句。

        if语句恐怕是所有代码中使用最频繁的、然而很可惜的是它的执行效率并不是很高。在用if语句和多个else语句时、一定要把最有可能的情况放在第一个、然后是可能性第二的、依此类推。例如预计某个数值在0~100之间出现的概率最大、则可以这样安排代码:

  1. if (iNum>0&&iNum <100){  
  2.             alert("在0和100之间" );  
  3.         }else   if (iNum>99&&iNum<200){  
  4.             alert("在100和200之间" );  
  5.         }else   if (iNum>199&&iNum<300){  
  6.             alert("在200和300之间" );  
  7.         }else {  
  8.             alert("小于等于0或者大于等于300" );  
  9.         }  

        总是将出现概率最多的情况放在前面、这样就减少了进行多次测试后才能遇到正确条件的情况。当然也要尽可能减少使用else if 语句、例如上面的代码还可以进一步优化成如下代码:
  1. if (iNum>0){  
  2.             if (iNum<100){  
  3.                 alert("在0和100之间" );  
  4.             }else {  
  5.                 if (iNum<200){  
  6.                     alert("在100和200之间" );  
  7.                 }else {  
  8.                     if (iNum<300){  
  9.                         alert("在200和300之间" );  
  10.                     }else {  
  11.                         alert("大于等于300" );  
  12.                     }  
  13.                 }  
  14.             }  
  15.         }else {  
  16.             alert("小于等于0" );  
  17.         }  

        上面的代码看起来比较复杂、但因为考虑了很多代码潜在的判断问题、执行问题、因此执行速度要较前面的代码快。

        另外、通常当超过两种情况时、最好能够使用switch语句。经常用switch语句代替if语句、可令执行速度快甚至10倍。另外、由于case语句可以使用任何类型、也大大方便switch语句的编写。

 

        5、最小化语句数量

        脚本找哦个的语句越少执行的时间就越短、而且代码的体积也会相应减少。例如使用var定义变量时可以一次定义多个、代码如下:

  1. var  iNum = 365;  
  2.         var  sColor =  "yellow" ;  
  3.         var  aMyNum = [8,7,12,3] ;  
  4.         var  oMyDate =  new  Date();  

        上面的多个定义可以用var关键字一次性定义、代码如下:
  1. var  iNum = 365, sColor =  "yellow"  , aMyNum = [8,7,12,3],oMyDate =  new  Date() ;  

        同样在很多迭代运算的时候、也应该尽可能减少代码量、如下两行代码:
  1. var  sCar = aCars[i];  
  2.         i++;  

        可优化成:
  1. var  sCar = aCars[i++];  

        

        6、节约使用DOM

        JavaScript对DOM的处理可能是最耗费时间的操作之一。每次JavaScript对DOM的操作都会改变页面的表现、并重新渲染整个页面、从而有明显的时间消耗。比较快捷的方法就是尽可能不在页面进行DOM操作、如下例中为ul添加了10个条目。

  1. var  oUl = document.getElementById( "ulItem" );  
  2.         for ( var  i=0;i<10;i++){  
  3.             var  oLi = document.createElement( "li" );  
  4.             oUl.appendChild(oLi);  
  5.             oLi.appendChild(document.createTextNode("Item " +i));  
  6.         }  

         以上代码在循环中调用oUl.appendChild(oLi)、每次执行这条语句后、浏览器就会重新渲染页面、其次给列表添加文本节点oLi.appendChild(document.createTextNode("Item "+i))、这也会造成页面被重新渲染。因此每次运行都会造成两次重新渲染页面、共20次。

        通常应当尽可能减少DOM的操作、将列表项目在添加文本节点之后在添加、并合理地使用createDocumentFragment()、代码如下:

  1. var  oUl = document.getElementById( "ulItem" );  
  2.         var  oTemp = document.createDocumentFragment();  
  3.         for ( var  i=0;i<10;i++){  
  4.             var  oLi = document.createElement( "li" );  
  5.             oLi.appendChild(document.createTextNode("Item " +i));  
  6.             oTemp.appendChild(oLi);  
  7.         }  
  8.         oUl.appendChild(oTemp); 

16
5
分享到:
评论
11 楼 yunchow 2011-07-15  
最后一条不错,前面的好像作用不大,像压缩都知道的,就不说了
10 楼 tarsean 2011-07-14  
效率都是通过这些细节提升出来的!对于变量名至少要保证可读性的情况下尽量短,感觉最后一条应该对效率有较大的提升~~受教!
9 楼 xlxiazlw 2011-07-14  
受益了!
8 楼 lifangling_2010 2011-07-14  
这个 不错。
7 楼 txin0814 2011-07-14  
学习!
6 楼 wcily123 2011-07-14  
最后一条讲的很好
5 楼 hyj1254 2011-07-13  
if (!myValue)...

这个漏了个!
引用
最后一条有点苛刻!

其实最后一条挺好的
4 楼 june1233 2011-07-13  
挺好的!js多应该很受用!
3 楼 爱蓝子 2011-07-13  
学习了! 。。。
2 楼 yangkuan 2011-07-13  
想不到,有这么讲究啊,平时都没注意
1 楼 java_xiaoyi 2011-07-13  
最后一条有点苛刻!

相关推荐

    21天学通javascript——PDF完整版下载.zip

    第三篇讲解的是Javascript的高级技术,主要讲解了Javascript与XML技术、正 则表达式、Ajax基础、Ajax高级应用、Javascript与插件和Javascript的调试与优化等。最后一篇综合案例篇用一个完整的例子讲解了如何使用...

    将Java编译成JavaScript——Artima对话Google工程师Scott Blum.pdf

    3. 웹应用性能优化:Java编译成JavaScript技术能够对生成的JavaScript代码进行优化,使得Web应用的性能提高。 四、结论 Java编译成JavaScript技术是web开发领域中的一个重要技术。GWT是Google推出的AJAX应用开发包...

    JavaScript凌厉开发——Ext JS3详解与实践

    《JavaScript凌厉开发——Ext JS3详解与实践》是一本深度探讨JavaScript库Ext JS3的专著,旨在帮助开发者深入理解和高效运用这一强大的前端框架。本文将围绕标题、描述及标签,详细介绍Ext JS3的核心概念、关键特性...

    利用JavaScript实现图片标注——SearchMapIdentityTask

    8. **性能优化**:对于大型地图,处理大量标注时需要注意性能问题。可能需要使用分块加载、懒加载或空间索引等策略。 9. **源码分析**:既然提到“源码”,意味着我们可能需要阅读和理解`SearchMapIdentityTask`的...

    浅谈JavaScript 库———jQuery, ExtJs 的对比研究

    ### 浅谈JavaScript库——jQuery与ExtJs的对比研究 #### 一、引言 随着Web 2.0和RIA(Rich Internet Applications)技术的普及,JavaScript作为一种前端开发的重要工具,逐渐占据了重要的地位。它不再仅仅是用于...

    JavaScript实战手册——第七版代码

    《JavaScript实战手册——第七版代码》是一本专为JavaScript开发者准备的实践指南,它涵盖了从基础到高级的各种JavaScript编程技术。这本书的代码示例旨在帮助读者深入理解语言机制,并提升在实际项目中的应用能力。...

    Javascript列表空间——collist

    JavaScript列表空间——Collist,是一种基于JavaScript实现的可排序列表控件,专为网页开发者设计,以方便在网页上创建和管理动态数据列表。这个控件具有轻量级、高效和用户友好的特点,适用于各种网页应用,尤其...

    众妙之门——JavaScript与jQuery技术精粹

    《众妙之门——JavaScript与jQuery技术精粹》是一本由Smashing Magazine出版的高端IT图书,它汇聚了全球顶尖网站设计专家的经验与智慧,旨在深入解析JavaScript和jQuery的关键技术,帮助读者提升在网页设计与开发中...

    网页模板——javascript 在线打字练习.zip

    【标题】"网页模板——javascript 在线打字练习"揭示了这个压缩包文件的主要内容,它是一个基于JavaScript技术实现的在线打字练习平台的网页模板。JavaScript,作为全球最广泛使用的编程语言之一,通常用于增强网页...

    《Web前端设计基础——HTML5、CSS3、JavaScript》课后答案整理.pdf

    它具有更快的访问速度、更好的搜索引擎优化、支持更多多媒体元素、跨平台兼容性以及后台一致性等特点。 - CSS3是层叠样式表的最新版本,提供了更多样式和动画功能,增强了样式表的表现力。 - JavaScript是一种脚本...

    fibjs——Javascript on Fiber.zip

    《FibJS——JavaScript on Fiber》是一份深入探讨FibJS技术的资料,它揭示了如何将JavaScript语言的优势与Fiber的高性能特性相结合,为开发者提供了全新的编程体验。FibJS是一个基于Chrome V8引擎的JavaScript运行时...

    XMPP高级编程——使用JavaScript和jQuery

    在《XMPP高级编程——使用JavaScript和jQuery》一书中,作者深入探讨了如何利用这两种强大的Web技术来实现XMPP功能。JavaScript作为浏览器端的主要编程语言,为网页添加动态交互性,而jQuery则简化了DOM操作,提供了...

    03妙味课堂——javascript彩虹圈效果

    在本课程“03妙味课堂——javascript彩虹圈效果”中,我们将深入探讨如何使用JavaScript实现一种视觉上吸引人的彩虹圈动态效果。JavaScript是一种广泛应用于网页开发的编程语言,它赋予了网页动态交互的能力,而这个...

    安卓Android源码——Android调用JavaScript.zip

    本资源"安卓Android源码——Android调用JavaScript.zip"聚焦于这一主题,提供了如何在Android应用中调用JavaScript的具体实现。下面我们将详细探讨这个过程中的关键知识点。 首先,Android系统提供了`WebView`组件...

    javascript 学习资料——适合WEB初学者

    8. **性能优化**:学习如何编写高效的JavaScript代码,减少内存占用,提升页面加载速度,理解垃圾回收机制。 9. **跨域通信**:理解同源策略及其限制,以及如何通过JSONP、CORS、WebSocket等方式实现跨域请求。 10...

    JavaScript特效代码集——rar

    6. **按钮特效类**:按钮是网页中最常见的交互元素之一,其样式和行为的优化直接影响用户的操作体验。这个代码集可能会包含不同类型的按钮动画效果,如按下效果、渐变颜色、悬浮效果等,使按钮更具吸引力。 这些...

    javascript小工具之——cookie操作

    这篇博客“javascript小工具之——cookie操作”很可能会探讨如何利用JavaScript进行有效的Cookie操作。 Cookie是由Web服务器发送到用户的浏览器并存储在本地的小型文本文件。它们由键值对组成,可以设置过期时间,...

    网页模板——javascript 物理弹性漂浮广告.zip

    【标题】"网页模板——javascript 物理弹性漂浮广告.zip" 涉及到的知识点主要集中在网页设计、JavaScript编程以及广告展示技术上。在网页设计领域,漂浮广告通常指的是那些在用户滚动页面时始终停留在屏幕某个位置的...

    图解Javascript——作用域、作用域链、闭包

    作用域是JavaScript中一个非常核心的概念,它决定了代码块中变量和函数的可访问性。全局作用域中的变量和函数可以被整个程序中的其他代码所访问,而局部作用域则限制了变量和函数的可访问范围到代码块内部。在...

Global site tag (gtag.js) - Google Analytics