Javascript 点滴: 性能


1. 尽量避免使用Eval
   Eval在Javascript中是属于运行效率很慢一类的代码。

None.gif < input  id ="txtNumber"  name ="txtNumber"   />
ExpandedBlockStart.gifContractedBlock.gif
< script  language ="javascript"  type ="text/javascript" > dot.gif  
InBlock.gif
var start = new Date();
InBlock.gif
for(var i=0;i<10000;i++)  
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    eval(
"txtNumber").value = i;
ExpandedSubBlockEnd.gif}

InBlock.gif
var end = new Date();
InBlock.gifalert(end
-start);
InBlock.gif
InBlock.gif
// 较好的方式
InBlock.gif
start = new Date();
InBlock.gif
for(var i=0;i<10000;i++)  
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    document.getElementById(
"txtNumber").value = i;
ExpandedSubBlockEnd.gif}

InBlock.gifend 
= new Date();
ExpandedBlockEnd.gifalert(end
-start);
None.gif
</ script >

   运行上面这段脚本,差异是比较大的。在代码中应该当尽量避免使用Eval。在一些无法避免的情况下,应该使用临时变量来缓存eval运算的结果,像上面的代码可以改成

1 None.gif var  myInput  =  eval( " txtNumber.value " )
2 None.gif for ( var  i = 0 ;i < 10000 ;i ++ )  
3 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
4InBlock.gif    myInput.value = i;
5ExpandedBlockEnd.gif}

2.使用最短的对象链

 1 None.gif < div  id ="container" >< table >< tr >< td ></ td ></ tr ></ table ></ div >
 2 ExpandedBlockStart.gifContractedBlock.gif < script  language ="javascript"  type ="text/javascript" > dot.gif  
 3InBlock.gifvar start = new Date();
 4InBlock.gifvar myContainer = document.getElementById("container");
 5InBlock.giffor(var i=0;i<10000;i++)
 6ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 7InBlock.gif    myContainer.childNodes[0].childNodes[0].childNodes[0].innerText =i;
 8InBlock.gif    myContainer.childNodes[0].childNodes[0].childNodes[0].style.color = "#330000";
 9InBlock.gif    myContainer.childNodes[0].childNodes[0].childNodes[0].style.backgroundColor = "#ffffcc";
10ExpandedSubBlockEnd.gif}

11InBlock.gif
12InBlock.gifvar end = new Date();
13InBlock.gifalert(end-start);
14InBlock.gif// 较好的方式
15InBlock.gifstart = new Date();
16InBlock.gifvar myContainer = document.getElementById("container").childNodes[0].childNodes[0].childNodes[0];
17InBlock.giffor(var i=0;i<10000;i++)
18ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
19InBlock.gif    myContainer.innerText =i;
20InBlock.gif    myContainer.style.color = "#330000";
21InBlock.gif    myContainer.backgroundColor = "#ffffcc";
22ExpandedSubBlockEnd.gif}

23InBlock.gif
24InBlock.gifend = new Date();
25ExpandedBlockEnd.gifalert(end-start);
26None.gif
</ script >  

尽量使用短的对象链,好的方法也是用临时变量来缓存要操作的对象。

3. 循环

 1 None.gif 假设页面上有较多的Input元素
 2 ExpandedBlockStart.gifContractedBlock.gif < script  language ="javascript"  type ="text/javascript" > dot.gif  
 3InBlock.gifvar inputs = document.getElementsByTagName("INPUT");
 4InBlock.gifvar start = new Date();
 5InBlock.giffor(var i=0;i<inputs.length;i++)
 6ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
 7InBlock.gif    inputs[i].value = i;
 8ExpandedSubBlockEnd.gif}

 9InBlock.gifvar end = new Date();
10InBlock.gifalert(end-start);
11InBlock.gif
12InBlock.gif// 较好的方式
13InBlock.gifstart = new Date();
14InBlock.giffor(var i=0,len=inputs.length;i<len;i++)
15ExpandedSubBlockStart.gifContractedSubBlock.gifdot.gif{
16InBlock.gif    inputs[i].value = i;
17ExpandedSubBlockEnd.gif}

18InBlock.gifend = new Date();
19ExpandedBlockEnd.gifalert(end-start);
20None.gif
</ script >
21 None.gif

上面这段主要的问题是在判断i < inputs.length时,每次都会计算inputs.length,这个也是很费事的计算,如果inputs.length是1000的,下面的循环就减少了999次inputs.length的计算。
while 结构的效率与for的效率基本是一样的

4.字符串的连接

 字符串的问题似乎到哪是都是个问题。

ExpandedBlockStart.gif ContractedBlock.gif < script  language ="javascript"  type ="text/javascript" > dot.gif  
InBlock.gif
var start = new Date();
InBlock.gif
for(var i=0;i<10000;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
var h ="hello"// 创建第一个字符串
InBlock.gif
    var j ="javascript!"// 创建第二个字符串
InBlock.gif
    var s = h;
InBlock.gif    s
+=" ,"// 创建第三个字符串
InBlock.gif
    s+=j; // 创建第四个字符串
ExpandedSubBlockEnd.gif
}

InBlock.gif
var end = new Date();
InBlock.gifalert(end
-start);
InBlock.gif
InBlock.gif
// 较好的方式
InBlock.gif
start = new Date();
InBlock.gif
for(var i=0;i<10000;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    
var s = "hello"  + " ," + "javascript!"// 创建一个字符串      
ExpandedSubBlockEnd.gif
}

InBlock.gifend 
= new Date();
InBlock.gifalert(end
-start);
InBlock.gif
InBlock.gif
// 较好的方式
InBlock.gif

InBlock.gif
var strings = [];
InBlock.gif
for(var i=0;i<10000;i++)
ExpandedSubBlockStart.gifContractedSubBlock.gif
dot.gif{
InBlock.gif    strings.push(
"hello");
InBlock.gif    strings.push(
"javascript");
ExpandedSubBlockEnd.gif}

InBlock.gif
var s = strings.join("\n");

4.JSON

 JSON
是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。 它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。

None.gif var customers =[{Name:"张三",Address:"北京",},{Name:"李四",Address:"上海"},{Name:"王二",Address:"广州"}];
None.giffor(var i=0,len=customers.length;i
< len ;i++)
None.gif{
None.gif    alert("Name:"+customer[i].Name + " Address:"+customer[i].Address);
None.gif}

另外声明数组可以用 var array =[]代替 var array = new Array(); 曾经看过一点资料,说效率会更好一些,但好像不是很好做测试,但我还是很相信,至少看上去更精简。

5.DOM
 与DOM的交互是javascript编码中很大的一部分,因此,这部分代码的运行效率很大程序上就影响了整个javascript的效率。
 但这一块的确非常大,很难非常深入去比较其中的细节。
 从以前的开发经验来讲,我的感觉就是尽量少用document.createTextNode之类的方法来创建新的对象,而应该尽量用innerHTML,innerText,insertAdjacentHTML之类方法和属性
 cloneNode也会比createElement的效率会高一些。

 
6.代码风格
 javascript是一种解释型的脚本语言,调试一直是Web的恶梦。好的代码风格是非常必要的,方便阅读和维护。例好,声明变量一定要加上var(不加上var 可能会使局部变量和全局变量混在一起)
 ,每条语句要加上分号结尾(为了减少js文件的大小,在发布时通常会对js文件去掉换行符之类对行压缩,没有分号结尾,这个压缩基本就不行了)

 
7.CSS和页面布局
  对HTML元素进行样式控制是常有的事,前景色,后景色,背景图,定位,如果全部用JS来设置,10行代码都不定能搞定,用CSS一行就好了。
  好的页面布局能很好的改善DOM结构,会方便javascript的编码。

转载于:https://www.cnblogs.com/PengNian/archive/2007/08/02/840764.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值