客戶端js性能優(yōu)化小技巧整理
更新時(shí)間:2013年11月05日 16:11:18 作者:
說(shuō)起javascript無(wú)人不知無(wú)人不曉吧,下面是一些關(guān)于客戶端JS性能的一些優(yōu)化的小技巧,希望對(duì)大家有所幫助
下面是一些關(guān)于客戶端JS性能的一些優(yōu)化的小技巧:
1. 關(guān)于JS的循環(huán),循環(huán)是一種常用的流程控制。JS提供了三種循環(huán):for(;;)、while()、for(in)。在這三種循環(huán)中 for(in)的效率最差,因?yàn)樗枰樵僅ash鍵,因此應(yīng)盡量少用for(in)循環(huán),for(;;)、while()循環(huán)的性能基本持平。當(dāng)然,推薦使用for循環(huán),如果循環(huán)變量遞增或遞減,不要單獨(dú)對(duì)循環(huán)變量賦值,而應(yīng)該使用嵌套的++或--運(yùn)算符。
2. 如果需要遍歷數(shù)組,應(yīng)該先緩存數(shù)組長(zhǎng)度var len=arr.length; for(i=0;i<len;i++),將數(shù)組長(zhǎng)度放入局部變量中,避免多次查詢數(shù)組長(zhǎng)度。
3. 局部變量的訪問(wèn)速度要比全局變量的訪問(wèn)速度更快,因?yàn)槿肿兞科鋵?shí)是window對(duì)象的成員,而局部變量是放在函數(shù)的棧里的。
4. 盡量少使用eval,每次使用eval需要消耗大量時(shí)間,特別是在循環(huán)內(nèi),json[i][變量]=1;這樣的語(yǔ)句可以不使用eval。
5. 盡量避免對(duì)象的嵌套查詢,對(duì)于obj1.obj2.obj3.obj4這個(gè)語(yǔ)句,需要進(jìn)行至少3次查詢操作,先檢查obj1中是否包含 obj2,再檢查obj2中是否包含obj3,然后檢查obj3中是否包含obj4...這不是一個(gè)好策略。應(yīng)該盡量利用局部變量,將obj4以局部變量 保存,從而避免嵌套查詢。
6. 使運(yùn)算符時(shí),盡量使用+=,-=、*=、\=等運(yùn)算符號(hào),而不是直接進(jìn)行賦值運(yùn)算。
7. 當(dāng)需要將數(shù)字轉(zhuǎn)換成字符時(shí),采用如下方式:"" + 1。從性能上來(lái)看,將數(shù)字轉(zhuǎn)換成字符時(shí),有如下公式:("" +) > String() > .toString() > new String()。String()屬于內(nèi)部函數(shù),所以速度很快。而.toString()要查詢?cè)椭械暮瘮?shù),所以速度遜色一些,new String()需要重新創(chuàng)建一個(gè)字符串對(duì)象,速度最慢。
8. 當(dāng)需要將浮點(diǎn)數(shù)轉(zhuǎn)換成整型時(shí),應(yīng)該使用Math.floor()或者M(jìn)ath.round()。而不是使用parseInt(),該方法用于將字符串轉(zhuǎn)換成數(shù)字。而且Math是內(nèi)部對(duì)象,所以Math.floor()其實(shí)并沒(méi)有多少查詢方法和調(diào)用時(shí)間,速度是最快的。
9.盡量作用JSON格式來(lái)創(chuàng)建對(duì)象,而不是var obj=new Object()方法。因?yàn)榍罢呤侵苯訌?fù)制,而后者需要調(diào)用構(gòu)造器,因而前者的性能更好。
10.當(dāng)需要使用數(shù)組時(shí),也盡量使用JSON格式的語(yǔ)法,即直接使用如下語(yǔ)法定義數(shù)組:[parrm,param,param...],而不是采用 new Array(parrm,param,param...)這種語(yǔ)法。因?yàn)槭褂肑SON格式的語(yǔ)法是引擎直接解釋的。而后者則需要調(diào)用Array的構(gòu)造器。
11. 對(duì)字符串進(jìn)行循環(huán)操作,例如替換、查找,就使用正則表達(dá)式。因?yàn)镴S的循環(huán)速度比較慢,而正則表達(dá)式的操作是用C寫成的API,性能比較好。
最后有一個(gè)基本原則,對(duì)于大的JS對(duì)象,因?yàn)閯?chuàng)建時(shí)時(shí)間和空間的開銷都比較大,因此應(yīng)該盡量考慮采用緩存。
1. 關(guān)于JS的循環(huán),循環(huán)是一種常用的流程控制。JS提供了三種循環(huán):for(;;)、while()、for(in)。在這三種循環(huán)中 for(in)的效率最差,因?yàn)樗枰樵僅ash鍵,因此應(yīng)盡量少用for(in)循環(huán),for(;;)、while()循環(huán)的性能基本持平。當(dāng)然,推薦使用for循環(huán),如果循環(huán)變量遞增或遞減,不要單獨(dú)對(duì)循環(huán)變量賦值,而應(yīng)該使用嵌套的++或--運(yùn)算符。
2. 如果需要遍歷數(shù)組,應(yīng)該先緩存數(shù)組長(zhǎng)度var len=arr.length; for(i=0;i<len;i++),將數(shù)組長(zhǎng)度放入局部變量中,避免多次查詢數(shù)組長(zhǎng)度。
3. 局部變量的訪問(wèn)速度要比全局變量的訪問(wèn)速度更快,因?yàn)槿肿兞科鋵?shí)是window對(duì)象的成員,而局部變量是放在函數(shù)的棧里的。
4. 盡量少使用eval,每次使用eval需要消耗大量時(shí)間,特別是在循環(huán)內(nèi),json[i][變量]=1;這樣的語(yǔ)句可以不使用eval。
5. 盡量避免對(duì)象的嵌套查詢,對(duì)于obj1.obj2.obj3.obj4這個(gè)語(yǔ)句,需要進(jìn)行至少3次查詢操作,先檢查obj1中是否包含 obj2,再檢查obj2中是否包含obj3,然后檢查obj3中是否包含obj4...這不是一個(gè)好策略。應(yīng)該盡量利用局部變量,將obj4以局部變量 保存,從而避免嵌套查詢。
6. 使運(yùn)算符時(shí),盡量使用+=,-=、*=、\=等運(yùn)算符號(hào),而不是直接進(jìn)行賦值運(yùn)算。
7. 當(dāng)需要將數(shù)字轉(zhuǎn)換成字符時(shí),采用如下方式:"" + 1。從性能上來(lái)看,將數(shù)字轉(zhuǎn)換成字符時(shí),有如下公式:("" +) > String() > .toString() > new String()。String()屬于內(nèi)部函數(shù),所以速度很快。而.toString()要查詢?cè)椭械暮瘮?shù),所以速度遜色一些,new String()需要重新創(chuàng)建一個(gè)字符串對(duì)象,速度最慢。
8. 當(dāng)需要將浮點(diǎn)數(shù)轉(zhuǎn)換成整型時(shí),應(yīng)該使用Math.floor()或者M(jìn)ath.round()。而不是使用parseInt(),該方法用于將字符串轉(zhuǎn)換成數(shù)字。而且Math是內(nèi)部對(duì)象,所以Math.floor()其實(shí)并沒(méi)有多少查詢方法和調(diào)用時(shí)間,速度是最快的。
9.盡量作用JSON格式來(lái)創(chuàng)建對(duì)象,而不是var obj=new Object()方法。因?yàn)榍罢呤侵苯訌?fù)制,而后者需要調(diào)用構(gòu)造器,因而前者的性能更好。
10.當(dāng)需要使用數(shù)組時(shí),也盡量使用JSON格式的語(yǔ)法,即直接使用如下語(yǔ)法定義數(shù)組:[parrm,param,param...],而不是采用 new Array(parrm,param,param...)這種語(yǔ)法。因?yàn)槭褂肑SON格式的語(yǔ)法是引擎直接解釋的。而后者則需要調(diào)用Array的構(gòu)造器。
11. 對(duì)字符串進(jìn)行循環(huán)操作,例如替換、查找,就使用正則表達(dá)式。因?yàn)镴S的循環(huán)速度比較慢,而正則表達(dá)式的操作是用C寫成的API,性能比較好。
最后有一個(gè)基本原則,對(duì)于大的JS對(duì)象,因?yàn)閯?chuàng)建時(shí)時(shí)間和空間的開銷都比較大,因此應(yīng)該盡量考慮采用緩存。
您可能感興趣的文章:
- js性能優(yōu)化 如何更快速加載你的JavaScript頁(yè)面
- JS性能優(yōu)化筆記搜索整理
- JS 網(wǎng)站性能優(yōu)化筆記
- web性能優(yōu)化之javascript性能調(diào)優(yōu)
- javascript模版引擎-tmpl的bug修復(fù)與性能優(yōu)化分析
- 關(guān)于Javascript加載執(zhí)行優(yōu)化的研究報(bào)告
- 有關(guān)javascript的性能優(yōu)化 (repaint和reflow)
- js性能優(yōu)化技巧
- JavaScript性能優(yōu)化之小知識(shí)總結(jié)
- JavaScript性能優(yōu)化總結(jié)之加載與執(zhí)行
相關(guān)文章
20個(gè)常見的JavaScript數(shù)組操作總結(jié)
JavaScript中的Array對(duì)象與其他編程語(yǔ)言中的數(shù)組一樣,是一組數(shù)據(jù)的集合。在JavaScript中,數(shù)組里面的數(shù)據(jù)可以是不同類型的,并具有用于執(zhí)行數(shù)組常見操作的方法,本文整理了一些常用的,需要的可以參考一下2022-09-09nest.js 使用express需要提供多個(gè)靜態(tài)目錄的操作方法
這篇文章主要介紹了nest.js 使用express需要提供多個(gè)靜態(tài)目錄的操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10JS?getRandomValues和Math.random方法深入解析
這篇文章主要為大家介紹了JS?getRandomValues和Math.random方法深入詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04JS 實(shí)現(xiàn)Base64編碼與解碼實(shí)例詳解
這篇文章主要介紹了JS 實(shí)現(xiàn)Base64編碼與解碼實(shí)例詳解的相關(guān)資料,并附實(shí)例代碼,幫助大家學(xué)習(xí)理解此部分知識(shí),需要的朋友可以參考下2016-11-11關(guān)于javascript document.createDocumentFragment()
documentFragment 是一個(gè)無(wú)父對(duì)象的document對(duì)象.2009-04-04js實(shí)現(xiàn)指定時(shí)間倒計(jì)時(shí)效果
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)指定時(shí)間倒計(jì)時(shí)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08JS關(guān)于for循環(huán)中使用setTimeout的四種解決方案
這篇文章主要介紹了JS關(guān)于for循環(huán)中使用setTimeout的四種解決方案,想深入了解JS的同學(xué),一定要看下2021-05-05