通過循環(huán)優(yōu)化 JavaScript 程序
前言
對于提高 JavaScript 程序的性能這個問題,最簡單同時也是很容易被忽視的方法就是學習如何正確編寫高性能循環(huán)語句。本文將會幫你解決這個問題。
我們將看到 JavaScript 中主要的循環(huán)類型,以及如何針對它們進行高效編碼。
現(xiàn)在開始!
循環(huán)性能
談到循環(huán)性能,爭論的焦點始終會集中到關于應該使用哪種循環(huán),哪個是速度最快、性能最好的?事實上,在 JavaScript 提供的四種循環(huán)類型中,只有一種比其他循環(huán)慢得多 —— for-in 循環(huán)。 對循環(huán)類型的選擇應基于你的需求而不是性能問題。
有兩個主要因素有助于改善循環(huán)性能 —— 每次迭代完成的工作和迭代次數(shù)。
在下面的內(nèi)容中,我們將會看到通過對這兩點的優(yōu)化,可以對循環(huán)的整體性能產(chǎn)生積極的影響。
For 循環(huán)
在 ECMA-262(定義JavaScript的基本語法和行為的規(guī)范)第三版中,定義了四種循環(huán)類型。第一個是標準的 for 循環(huán),它與其他類 C 語言的語法相同:
for (var i = 0; i < 10; i++){
//循環(huán)體
}
這可能是最常用的 JavaScript 循環(huán)結構。要了解應該怎樣對其進行優(yōu)化,需要先進行一些分析。
解析
for 循環(huán)由四部分組成:初始化,預測試條件,循環(huán)體和后執(zhí)行。它的工作方式如下:首先,執(zhí)行初始化代碼(var i = 0;)。然后是預測試條件(i <10;)。如果預測試條件的計算結果為 true,則執(zhí)行循環(huán)體。之后運行后執(zhí)行代碼(i ++)。
優(yōu)化
要優(yōu)化循環(huán)中的工作量,第一步是最小化對象成員和數(shù)組項查找的數(shù)量。
還可以通過反轉順序來提高循環(huán)的性能。在 JavaScript 中,反轉循環(huán)對循環(huán)的性能提升不大,除非你消除了額外的操作。
// 原始循環(huán)
for (var i = 0; i < items.length; i++){
process(items[i]);
}
// 最小化屬性查找
for (var i = 0, len = items.length; i < len; i++){
process(items[i]);
}
// 最小化屬性查找并反序
for (var i = items.length; i--; ){
process(items[i]);
}
While 循環(huán)
第二種是 while 循環(huán)。下面是一個簡單的預測試循環(huán),由預測試條件和循環(huán)體組成。
var i = 0;
while(i < 10){
//循環(huán)體
i++;
}
解析
如果預測試條件的計算結果為 true,則執(zhí)行循環(huán)體。如果不是 —— 它就會被跳過。每個 while 循環(huán)都可以用 for 替換,反之亦然。
優(yōu)化
// 原始循環(huán)
var j = 0;
while (j < items.length){
process(items[j++]);
}
// 最小化屬性查找
var j = 0,
count = items.length;
while (j < count){
process(items[j++]);
}
// 最小化屬性查找和反序
var j = items.length;
while (j--){
process(items[j]);
}
Do-While 循環(huán)
do-while 是第三種循環(huán),它是 JavaScript 中唯一的后測試循環(huán)。由循環(huán)體和后測試條件組成:
var i = 0;
do {
//循環(huán)體
} while (i++ < 10);
解析
在這種類型的循環(huán)中,循環(huán)體總是至少執(zhí)行一次。然后評估測試后的條件,如果它是true,則執(zhí)行另一個循環(huán)周期。
優(yōu)化
// 原始循環(huán)
var k = 0;
do {
process(items[k++]);
} while (k < items.length);
// 最小化屬性查找
var k = 0,
num = items.length;
do {
process(items[k++]);
} while (k < num);
// 最小化屬性查找和反序
var k = items.length - 1;
do {
process(items[k]);
} while (k--);
For-In 循環(huán)
最后一種是 for-in 循環(huán)。它有一個非常特殊的用途 —— 枚舉 JavaScript 對象的命名屬性。 它的語法如下:
for (var prop in object){
//loop body
}
解析
它的名稱與 for 循環(huán)類似。但是工作方式完全不同。而這種差異使它比另外三種循環(huán)慢得多,后者具有相同的性能特征,所以爭論哪個循環(huán)最快是沒有用的。
每次循環(huán)執(zhí)行時,變量 prop 會得到 object 的一個屬性。它將會不斷執(zhí)行,直到返回所有屬性為止。這些是對象自身的以及通過其原型鏈繼承的屬性。
注意事項
永遠不要用“ for-in ”來迭代數(shù)組成員。
這種循環(huán)的每次迭代都會在實例或原型上進行屬性查找,這使得 for-in 循環(huán)比其它循環(huán)要慢得多。對于相同次數(shù)的迭代,可能會比其它循環(huán)慢七倍。
結論
for , while 和 do-while 循環(huán)都有類似的性能特征,因此沒有哪種類型比其他的更快或更慢。
避免使用 for-in 循環(huán),除非你需要對大量未知對象屬性進行迭代。
提高循環(huán)性能的最佳方法是減少每次迭代完成的工作量并減少循環(huán)迭代次數(shù)。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
js和jquery中循環(huán)的退出和繼續(xù)學習記錄
這篇文章主要介紹了js和jquery中循環(huán)的退出和繼續(xù)學習記錄,下哦功能不簡單,需要的朋友可以參考下2014-09-09
如何在CocosCreator中使用http和WebSocket
這篇文章主要介紹了在Cocos Creator中使用的Http和WebSocket,對websocket感興趣的同學,一定要看下2021-04-04
javascript實現(xiàn)點擊產(chǎn)生隨機圖形
這篇文章主要為大家詳細介紹了javascript實現(xiàn)點擊產(chǎn)生隨機圖形,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-01-01

