成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

強力推薦幾個編寫高性能的JavaScript的小建議

開發 前端
即使在當前硬件性能已經大大提升的時代,在編寫Javascript代碼時,若能遵循Javascript規范和注意一些性能方面的知識,對于提升代碼的可維護性和優化性能將大有好處。那么,接下來我們討論幾種能夠提高JavaScript性能的方法。

 

強力推薦幾個編寫高性能的JavaScript的小建議

 

前言

隨著計算機硬件的不斷升級,開發者越發覺得JavaScript性能優化的好不好對網頁的執行效率影響不明顯,所以一些性能方面的知識被很多開發者忽視。但在某些情況下,不優化的JavaScript代碼必然會影響用戶的體驗。因此,即使在當前硬件性能已經大大提升的時代,在編寫Javascript代碼時,若能遵循Javascript規范和注意一些性能方面的知識,對于提升代碼的可維護性和優化性能將大有好處。那么,接下來我們討論幾種能夠提高JavaScript性能的方法。

1、js文件加載和執行

(1)將<script>標簽放到<body>標簽的底部

(2)可以合并多個js文件,減少頁面中<script>標簽改善性能

(3)使用 defer 屬性,加載后續文檔元素的過程將和script.js的加載并行進行,但是 script.js的執行要在所有元素解析完成之后,DOMContentLoaded 事件觸發之前完成。

(4)使用 async 屬性,加載和渲染后續文檔元素的過程將和script.js的加載與執行并行進行

(5)動態加載腳本元素,無論在何時啟動瞎子,文件的下載和執行過程都不會阻塞頁面其它進程

  1. var script = document.createElement('script'); 
  2. script.type = 'text/javascript'
  3. script.src = 'file.js'
  4. document.getElementsByTagName('head')[0].appendChild(script); 

2、標識符所在的作用域鏈的位置越深

標識符所在的作用域鏈的位置越深,那么它的標識符解析的性能就越慢。所以一個好的性能提升的經驗法則是:如果某個跨作用域的值在函數中被引用一次以上,那么就把它存儲到局部變量里。

  1. function fun1() {  
  2. // 將全局變量的引用先存儲在一個局部變量中,然后使用這個局部變量代替全局變量,從而提高  
  3. // 性能;不然每次(3次)都要遍歷整個作用域鏈找到 
  4. document var doc = document;  
  5.  var bd = doc.body;  
  6.  var links = doc.getElementsByTagName('a');  
  7.  doc.getElementById('btn').onclick = function(){  
  8.  console.log('btn');  
  9.  } 

3、避免過長原型鏈繼承

方法或屬性在原型鏈中存在的位置越深,搜索它的性能也就越慢,所以要避免N多層原型鏈的寫法。

4、對象成員嵌套過深

對象的嵌套成員,對象成員嵌套越深,讀取速度也就越慢。所以好的經驗法則是:如果在函數中需要多次讀取一個對象屬性,最佳做法是將該屬性值保存在局部變量中,避免多次查找帶來的性能開銷。

  1. function f() {  
  2.  // 因為在以下函數中需要3次用到DOM對象屬性,所以先將它存儲在一個局部變量  
  3.  // 中,然后使用這個局部變量代替它進行后續操作,從而提高性能  
  4. var dom = YaHOO.util.Dom;  
  5. if(Dom.hasClass(element,'selected')){  
  6.  Dom.removeClass(elemet,'selected');  
  7. }else{  
  8.  Dom.addClass(elemet,'selected');  
  9.  } 

5、DOM操作

用js訪問和操作DOM都會帶來性能損失,可通過以下幾點來減少性能損失:

(1)盡可能減少DOM訪問次數;

(2)如果需要多次訪問某個DOM節點,請使用局部變量存儲它的引用;

(3)小心處理HTML集合,因為它實時連系著底層文檔;我們可以把集合的長度緩存到一個變量中,并在迭代中使用它;

(4)下述情況會發生重排:

  • 添加或刪除可見的DOM元素,請參閱JavaScript系統學習DOM系列文章之理解DOM節點關系
  • 元素位置改變;
  • 元素尺寸改變(包括:外邊距、內邊距、邊框厚度、寬度、高度等屬性);
  • 內容改變(例如:文本改變或圖片被另一個不同尺寸的圖片改變);
  • 頁面渲染器初始化;
  • 瀏覽器窗口尺寸改變

可通過以下方式減少重排:

  • 留意上面會導致重排的操作,盡量避免;
  • 獲取布局信息的操作會導致強制渲染隊列重排,應該盡量避免使用以下獲取布局信息的操作方法或屬性或者緩存布局信息,例如:offsetTop,offsetLeft,offsetWidthoffsetHeight,``scrollTop,scrollLeft,scrollWidth,scrollHeight,clientTop,clientLeft,clientWidth,clientHeight,getComputedStyle()等;
  • 批量修改樣式,推薦修改class來實現,例如使用:
  1. function f() {  
  2.  // 推薦使用以下操作  
  3.  var el1 = document.getElementById('mydiv');  
  4.  el1.className = 'mydiv';  
  5.  // 不推薦使用以下操作  
  6.  var el2 = document.getElementById('mydiv');  
  7.  el2.style.border = '1px';  
  8.  el2.style.padding = '2px';  
  9.  el2.style.margin = '3px'
  10.  
  11. .mydiv { 
  12.  border: 1px; 
  13.  padding: 2px; 
  14.  margin: 3px; 
  • 當需要批量修改DOM時,可以通過以下步驟減少重繪和重排的次數:
  • 使元素脫離文檔流(隱藏元素、拷貝元素、DocumentFragment 請參考JavaScript系統學習DOM系列文章之DocumentFragment
  • 對其應用多重改變;
  • 把元素帶回文檔中
  • 使用事件委托(事件逐層冒泡并能被父級元素捕獲,使用事件代理,只需給外層元素綁定一個處理器,就可以處理其子元素上觸發的所用事件),因為給DOM元素綁定事件以及瀏覽器需要跟蹤每個事件處理器都需要消耗性能。

6、字符串連接

  1. str += 'one'+'two'
  2. str= str+'one'+'two'

后者方式會比前者少在內存中創建一個臨時字符串,所以性能有相應的提升,所以,所以推薦后者的寫法。

7、直接使用字面量

創建對象和數組推薦使用字面量,因為這不僅是性能最優也有助于節省代碼量。

  1. var obj = {  
  2.  name:'tom',  
  3.  age:15,  
  4.  sex:'男' 

8、數組長度緩存

如果需要遍歷數組,應該先緩存數組長度,將數組長度放入局部變量中,避免多次查詢數組長度。

  1. for(let i = 0, len = arr.lenght; i < len; i++) { 
  2.  ... 

9、循環比較

JS提供了三種循環:for(;;)、while()、for(in)。在這三種循環中 for(in)的效率最差,因為它需要查詢Hash鍵,因此應盡量少用for(in)循環,for(;;)、while()循環的性能基本持平。

10、少用eval

盡量少使用eval,每次使用eval需要消耗大量時間,這時候使用JS所支持的閉包可以實現函數模板。

11、字符串轉換

當需要將數字轉換成字符時,采用如下方式:"" + 1。從性能上來看,將數字轉換成字符時,有如下公式:("" +) > String() > .toString() > new String()。String()屬于內部函數,所以速度很快。而.toString()要查詢原型中的函數,所以速度遜色一些,new String()需要重新創建一個字符串對象,速度最慢。

12、浮點數轉換整形

當需要將浮點數轉換成整型時,應該使用Math.floor()或者Math.round()。而不是使用parseInt(),該方法用于將字符串轉換成數字。而且Math是內部對象,所以Math.floor()其實并沒有多少查詢方法和調用時間,速度是最快的。

后記

暫時只記錄了這么多,大家如果有好的建議,歡迎在評論區備注,我會將大家是建議補充進文章中,方便我們在工作和面試中避免采坑 

責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2009-09-17 08:48:54

CCNA教材教程CCNA

2014-11-25 10:03:42

JavaScript

2012-12-17 13:51:22

Web前端JavaScriptJS

2009-09-14 10:23:59

CCNA自學教材

2009-06-24 15:00:39

Javascript代

2019-12-23 15:55:55

軟件WindowsLinux

2011-03-04 09:39:36

Windows

2011-04-19 10:15:34

CSS3CSS

2019-06-20 09:00:00

.NETIDE代碼編輯器

2017-09-05 16:27:28

GitHub

2009-03-11 20:25:13

Linux下載工具強力推薦

2009-12-08 17:11:58

思科企業級路由器

2011-05-04 09:43:20

黑白激光打印機

2011-05-04 16:41:09

激光打印機

2011-08-18 09:25:47

愛普生掃描儀

2014-04-25 09:02:17

LuaLua優化Lua代碼

2024-03-20 08:00:00

軟件開發Java編程語言

2012-05-03 16:17:12

復合一體機推薦

2011-05-04 13:33:33

惠普黑白激光打印機

2012-05-09 15:56:26

激光打印機推薦
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品一区二区第一页 | 一区二区三区中文字幕 | 欧美成人a∨高清免费观看 91伊人 | 美女天堂 | 久久精品a| 成年人在线观看视频 | 99精品视频免费观看 | 日本在线一二 | 伊人狼人影院 | 成人超碰在线 | 久久伊人久久 | 色婷婷精品久久二区二区蜜臂av | 国产精品久久久久久久久久久久午夜片 | 福利精品 | 综合久久av| 九色在线视频 | 一区二区国产在线 | 久久国产高清 | 久久精品国产99国产 | 精品一二三区在线观看 | 国产成都精品91一区二区三 | 欧美在线一区二区三区 | 成人免费视频 | 国产原创在线观看 | 免费的黄色片子 | www.中文字幕.com | 国产91在线观看 | 精品一区二区av | 一区二区视频在线观看 | 福利网站在线观看 | 天天草天天干天天 | 久草在线在线精品观看 | 欧美一级视频在线观看 | 日韩av一区二区在线观看 | 一区二区在线 | 国产日产精品一区二区三区四区 | 欧美视频一级 | 91精品国产综合久久久久久漫画 | 日韩另类视频 | 国产91av视频在线观看 | 色综网 |