iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >怎么优化JS代码
  • 970
分享到

怎么优化JS代码

2024-04-02 19:04:59 970人浏览 八月长安
摘要

这篇文章主要讲解了“怎么优化js代码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么优化JS代码”吧!1、字符串的拼接 字符串的拼接在我们开发中

这篇文章主要讲解了“怎么优化js代码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么优化JS代码”吧!

1、字符串的拼接

 字符串的拼接在我们开发中会经常遇到,所以我把其放在首位,我们往往习惯的直接用+=的方式来拼接字符串,其实这种拼接的方式效率非常的低,我们可以用一种巧妙的方法来实现字符串的拼接,那就是利用数组的join方法。

<div class="one" id="one"></div>   <input type="button" value="效率低" onclick="func1()" />   <input type="button" value="效率高" onclick="func2()" />
//效率低的   function func1(){       var start = new Date().getTime();       var template = "";       for(var i = 0; i < 10000; i++){           template += "<input type='button' value='a'>";       }       var end = new Date().getTime();       document.getElementById("one").innerhtml = template;       alert("用时:" + (end - start) + "毫秒");   }   //效率高的   function func2(){       var start = new Date().getTime();       var array = [];       for(var i = 0; i < 10000; i++){           array[i] = "<input type='button' value='a'>";       }       var end = new Date().getTime();       document.getElementById("one").innerHTML = array.join("");       alert("用时:" + (end - start) + "毫秒");   }

我们看看其在不同浏览器下执行的情况

怎么优化JS代码

我们会发现,在IE6下其差别是相当明显的,其实这种情况在IE的高版本中体现的也非常明显,但是在Firefox下却没有多大的区别,相反第二种的相对效率还要低点,不过只是差别2ms左右,而Chrome也和Firefox类似。另外在这里顺便说明一下,在我们给数组添加元素的时候,很多人喜欢用数组的原生的方法push,其实直接用arr[i]或者arr[arr.length]的方式要快一点,大概在10000次循环的情况IE浏览器下会有十几毫秒的差别。

2、for循环

for循环是我们经常会遇到的情况,我们先看看下面例子:

<input type="button" value="效率低" onclick="func1()" />   <input type="button" value="效率高" onclick="func2()" />
var arr = [];   for(var i = 0; i < 10000; i++){       arr[i] = "<div>" + i + "</div>";   }   document.body.innerHTML += arr.join("");       //效率低的   function func1(){       var divs = document.getElementsByTagName("div");       var start = new Date().getTime();       for(var i = 0; i < divs.length; i++){           //"效率低"       }       var end = new Date().getTime();       alert("用时:" + (end - start) + "毫秒");   }   //效率高的   function func2(){       var divs = document.getElementsByTagName("div");       var start = new Date().getTime();       for(var i = 0, len = divs.length; i < len; i++){           //"效率高"       }       var end = new Date().getTime();       alert("用时:" + (end - start) + "毫秒");   }

怎么优化JS代码

由上表可以看出,在IE6.0下,其差别是非常明显,而在Firefox和Chrome下几乎没有差别,之所以在IE6.0下会有这种情况,主要是因为for循环在执行中,第一种情况会每次都计算一下长度,而第二种情况却是在开始的时候计算长度,并把其保存到一个变量中,所以其执行效率要高点,所以在我们使用for循环的时候,特别是需要计算长度的情况,我们应该开始将其保存到一个变量中。但是并不是只要是取长度都会出现如此明显的差别,如果我们仅仅是操作一个数组,取得的是一个数组的长度,那么其实两种方式的写法都差不多,我们看下面的例子:

<input type="button" value="效率低" onclick="func1()" />   <input type="button" value="效率高" onclick="func2()" />
var arr2 = [];   for(var i = 0; i < 10000; i++){       arr2[i] = "<div>" + i + "</div>";   }   //效率低的   function func1(){       var start = new Date().getTime();       for(var i = 0; i < arr2.length; i++){           //"效率低"       }       var end = new Date().getTime();       alert("用时:" + (end - start) + "毫秒");   }   //效率高的   function func2(){       var start = new Date().getTime();       for(var i = 0, len = arr2.length; i < len; i++){           //"效率高"       }       var end = new Date().getTime();       alert("用时:" + (end - start) + "毫秒");   }

怎么优化JS代码

从上表可以看出,如果仅仅是一个数组的话,我们看到其实两种写法都是差不多的,其实如果我们把循环再上调到100000次的话,也仅仅是差别几毫秒而已,所以在数组的情况下,我认为都是一样的。对于for循环的优化,也有人提出很多点,有人认为用-=1,或者从大到小的方式循环等等,我认为是完全没有必要的,这些优化往往实际情况下根本没有表现出来,换句话说只是计算机级别的微小的变化,但是给我们带来的却是代码的可读性大大的降低,所以实在是得不偿失。

3、减少页面的重绘

减少页面重绘虽然本质不是JS本身的优化,但是其往往是由JS引起的,而重绘的情况往往是严重影响页面性能的,所以完全有必要拿出来,我们看下面例子:

<div id="demo"></div>   <input type="button" value="效率低" onclick="func1()" />   <input type="button" value="效率高" onclick="func2()" />
var str = "<div>这是一个测试字符串</div><div>这是一个测试字符串</div><div>这是一个测试字符串</div><div>这是一个测试字符串</div><div>这是一个测试字符串</div><div>这是一个测试字符串</div><div>这是一个测试字符串</div><div>这是一个测试字符串</div><div>这是一个测试字符串</div><div>这是一个测试字符串</div><div>这是一个测试字符串</div><div>这是一个测试字符串</div><div>这是一个测试字符串</div>";   //效率低的   function func1(){       var obj = document.getElementById("demo");       var start = new Date().getTime();       for(var i = 0; i < 100; i++){           obj.innerHTML += str + i;       }       var end = new Date().getTime();       alert("用时 " + (end - start) + " 毫秒");   }   //效率高的   function func2(){       var obj = document.getElementById("demo");       var start = new Date().getTime();       var arr = [];       for(var i = 0; i < 100; i++){           arr[i] = str + i;       }       obj.innerHTML = arr.join("");       var end = new Date().getTime();       alert("用时 " + (end - start) + " 毫秒");   }

在例子中,我只是用了100次的循环,因为如果用10000次循环的话,浏览器基本上就卡住不动了,但是即使是100次的循环,我们看看下面的执行结果。

怎么优化JS代码

可以看到的是,这简直是一个惊人的结果,仅仅100次的循环,不管是在什么浏览器下,都出现了如此之大的差别,另外我们还发现,在这里,IE6的执行效率居然比起Firefox还要好很多,可见Firefox在页面重绘这方面并没有做一些的优化。这里还要注意的是,一般影响页面重绘的不仅仅是innerHTML,如果改变元素的样式,位置等情况都会触发页面重绘,所以在平时一定要注意这点。

4、减少作用域链上的查找次数

我们知道,js代码在执行的时候,如果需要访问一个变量或者一个函数的时候,它需要遍历当前执行环境的作用域链,而遍历是从这个作用域链的前端一级一级的向后遍历,直到全局执行环境,所以这里往往会出现一个情况,那就是如果我们需要经常访问全局环境的变量对象的时候,我们每次都必须在当前作用域链上一级一级的遍历,这显然是比较耗时的,我们看下面的例子:

<div id="demo"></div>   <input id="but1" type="button" onclick="func1()" value="效率低"/>   <input id="but2" type="button" onclick="func2()" value="效率高"/>
function func1(){       var start = new Date().getTime();       for(var i = 0; i < 10000; i++){           var but1 = document.getElementById("but1");           var but2 = document.getElementById("but2");           var inputs = document.getElementsByTagName("input");           var divs = document.getElementsByTagName("div");           var but1 = document.getElementById("but1");           var but2 = document.getElementById("but2");           var inputs = document.getElementsByTagName("input");           var divs = document.getElementsByTagName("div");           var but1 = document.getElementById("but1");           var but2 = document.getElementById("but2");           var inputs = document.getElementsByTagName("input");           var divs = document.getElementsByTagName("div");           var but1 = document.getElementById("but1");           var but2 = document.getElementById("but2");           var inputs = document.getElementsByTagName("input");           var divs = document.getElementsByTagName("div");           var but1 = document.getElementById("but1");           var but2 = document.getElementById("but2");           var inputs = document.getElementsByTagName("input");           var divs = document.getElementsByTagName("div");           var but1 = document.getElementById("but1");           var but2 = document.getElementById("but2");           var inputs = document.getElementsByTagName("input");           var divs = document.getElementsByTagName("div");       }       var end = new Date().getTime();       alert("用时 " + (end - start) + " 毫秒");   }   function func2(){       var start = new Date().getTime();       var doc = document;       for(var i = 0; i < 10000; i++){           var but1 = doc.getElementById("but1");           var but2 = doc.getElementById("but2");           var inputs = doc.getElementsByTagName("input");           var divs = doc.getElementsByTagName("div");           var but1 = doc.getElementById("but1");           var but2 = doc.getElementById("but2");           var inputs = doc.getElementsByTagName("input");           var divs = doc.getElementsByTagName("div");           var but1 = doc.getElementById("but1");           var but2 = doc.getElementById("but2");           var inputs = doc.getElementsByTagName("input");           var divs = doc.getElementsByTagName("div");           var but1 = doc.getElementById("but1");           var but2 = doc.getElementById("but2");           var inputs = doc.getElementsByTagName("input");           var divs = doc.getElementsByTagName("div");           var but1 = doc.getElementById("but1");           var but2 = doc.getElementById("but2");           var inputs = doc.getElementsByTagName("input");           var divs = doc.getElementsByTagName("div");           var but1 = doc.getElementById("but1");           var but2 = doc.getElementById("but2");           var inputs = doc.getElementsByTagName("input");           var divs = doc.getElementsByTagName("div");       }       var end = new Date().getTime();       alert("用时 " + (end - start) + " 毫秒");   }

上面代码中,第二种情况是先把全局对象的变量放到函数里面先保存下来,然后直接访问这个变量,而第一种情况是每次都遍历作用域链,直到全局环境,我们看到第二种情况实际上只遍历了一次,而第一种情况却是每次都遍历了,所以我们看看其执行结果:

怎么优化JS代码

从上表中可以看出,其在IE6下差别还是非常明显的,而且这种差别在多级作用域链和多个全局变量的情况下还会表现的非常明显。

5、避免双重解释

双重解释的情况也是我们经常会碰到的,有的时候我们没怎么考虑到这种情况会影响到效率,双重解释一般在我们使用eval、new Function和setTimeout等情况下会遇到,我们看看下面的例子:

<div id="demo"></div>   <input id="but1" type="button" onclick="func1()" value="效率低"/>   <input id="but2" type="button" onclick="func2()" value="效率高"/>
var sum, num1 = 1, num2 = 2;   function func1(){       var start = new Date().getTime();       for(var i = 0; i < 10000; i++){           var func = new Function("sum+=num1;num1+=num2;num2++;");           func();       }       var end = new Date().getTime();       alert("用时 " + (end - start) + " 毫秒");   }       function func2(){       var start = new Date().getTime();       for(var i = 0; i < 10000; i++){           sum+=num1;           num1+=num2;           num2++;       }       var end = new Date().getTime();       alert("用时 " + (end - start) + " 毫秒");   }

第一种情况我们是使用了new Function来进行双重解释,而第二种是避免了双重解释,我们看看在不同浏览器下的表现:

怎么优化JS代码

可以看到,在所有的浏览器中,双重解释都是有很大开销的,所以在实际当中要尽量避免双重解释。

感谢"SeaSunK"对第四点测试报告错误的指正,现在已经修改过来了。至于最后一点提出的func1每次都初始化,没有可比性,所以我给换了eval,结果发现,在IE6.0下还是有影响,而且在Firefox下,使用eval对效率的影响程度更加厉害,在Firefox下,如果10000次循环,需要十多秒的时间,所以我把循环都变成了1000次。看代码和报告。

var sum, num1 = 1, num2 = 2;   function func1(){       var start = new Date().getTime();       for(var i = 0; i < 1000; i++){           eval("sum+=num1;num1+=num2;num2++;");       }       var end = new Date().getTime();       alert("用时 " + (end - start) + " 毫秒");   }   function func2(){       var start = new Date().getTime();       for(var i = 0; i < 1000; i++){           sum+=num1;           num1+=num2;           num2++;       }       var end = new Date().getTime();       alert("用时 " + (end - start) + " 毫秒");   }

怎么优化JS代码

感谢各位的阅读,以上就是“怎么优化JS代码”的内容了,经过本文的学习后,相信大家对怎么优化JS代码这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么优化JS代码

本文链接: https://www.lsjlt.com/news/86740.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么优化JS代码
    这篇文章主要讲解了“怎么优化JS代码”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么优化JS代码”吧!1、字符串的拼接 字符串的拼接在我们开发中...
    99+
    2024-04-02
  • JS如何优化代码
    这篇文章主要介绍了JS如何优化代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、松耦合当修改一个组件而不需要更改其他组件时,就做到了松耦...
    99+
    2024-04-02
  • 怎么利用优化JS代码来进行网站优化
    怎么利用优化JS代码来进行网站优化,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。现在优化JS代码也是我们在进行网站优化时经常使用的手段,js在数据传输,用户交互以及增进页面...
    99+
    2023-06-07
  • 如何优化JS代码来适合网站优化
    这期内容当中小编将会给大家带来有关 如何优化JS代码来适合网站优化,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 如何优化JS代码来适合网站优化?现在优化JS代码也是我们在进行网站优化时经常使用...
    99+
    2023-06-07
  • 怎么优化SQL代码
    这篇文章主要介绍“怎么优化SQL代码”,在日常操作中,相信很多人在怎么优化SQL代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么优化SQL代码”的疑惑有所帮助!接下来,...
    99+
    2024-04-02
  • 如何使用js操作符优化代码
    这篇文章主要介绍“如何使用js操作符优化代码”,在日常操作中,相信很多人在如何使用js操作符优化代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何使用js操作符优化代码”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-27
  • 怎么优化if-else代码结构
    本篇内容主要讲解“怎么优化if-else代码结构”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么优化if-else代码结构”吧!需求写一个 returnWee...
    99+
    2024-04-02
  • 怎么用C语言优化Python代码
    这篇文章主要介绍“怎么用C优化Python代码”,在日常操作中,相信很多人在怎么用C优化Python代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用C优化Python代码”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-15
  • Linux程序设计代码怎么优化
    本篇内容主要讲解“Linux程序设计代码怎么优化”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Linux程序设计代码怎么优化”吧!全局变量VS函数参数全局变量在Linux下的驱动编程里边,用的是...
    99+
    2023-06-16
  • JS 有趣的eval优化输入验证实例代码
    复制代码 代码如下://eval就是计算字符串【可以放任何js代码】里的值//1、 var str1='12+3';      &n...
    99+
    2022-11-15
    JS eval 优化输入验证
  • Vue3中怎么利用CompositionAPI优化代码量
    Vue3中怎么利用CompositionAPI优化代码量,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。我们先来看看组件的整体代码结构,如下图所...
    99+
    2024-04-02
  • js如何格式化JSON代码
    这篇文章将为大家详细讲解有关js如何格式化JSON代码,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。格式化 JSON 代码相信大家都使用过JSON.stringify方法,该方法可以将一个 Ja...
    99+
    2023-06-17
  • js中DOM操作怎么优化
    这篇文章主要介绍js中DOM操作怎么优化,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、当想修改Dom样式时,应该尽可能合并所有的修改,并进行一次处理,以减少重排和重汇的次数。  // ...
    99+
    2023-06-25
  • 如何优化PHP代码
    这篇文章主要介绍了如何优化PHP代码,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言这是一个后台用户列表的搜索功能搜索条件可否并行是否必填...
    99+
    2024-04-02
  • Javascript前端优化代码
    目录if 判断的优化1、最简单的方法:if 判断2、好一点的方法:Switch3、更优的方法: 策略模式includes 的优化for 循环数组去重1、最传统的方法:利用数组的ind...
    99+
    2024-04-02
  • Python代码性能优化
    Python性能优化的一般步骤: 步骤1:找到性能 瓶颈 步骤2:优化性能 瓶颈 步骤3:goto 『步骤1』 找出瓶颈 不要相信直觉,使用专业工具 使用专业工具: profile / cprofil...
    99+
    2023-01-31
    性能 代码 Python
  • 如何优化jQuery代码
    本篇文章给大家分享的是有关如何优化jQuery代码,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。需要优化的代码大致是这样的,也不方便直接把人家...
    99+
    2024-04-02
  • CSS代码如何优化
    小编给大家分享一下CSS代码如何优化,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!div+css代码优化方案介绍-css代码优化...
    99+
    2024-04-02
  • 如何优化Python代码
    如何优化Python代码,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。优化是什么首先定义什么是优化。我们将使用一个直观的示例进行此操作。这是我们的问题:假设给定一个数组,其...
    99+
    2023-06-16
  • java怎么过滤js代码
    本篇内容介绍了“java怎么过滤js代码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   断点的分类,...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作