您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關如何通過循環優化JavaScript 程序的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
前言
對于提高 JavaScript 程序的性能這個問題,最簡單同時也是很容易被忽視的方法就是學習如何正確編寫高性能循環語句。本文將會幫你解決這個問題。
我們將看到 JavaScript 中主要的循環類型,以及如何針對它們進行高效編碼。
現在開始!
循環性能
談到循環性能,爭論的焦點始終會集中到關于應該使用哪種循環,哪個是速度最快、性能最好的?事實上,在 JavaScript 提供的四種循環類型中,只有一種比其他循環慢得多 —— ?for-in 循環。 對循環類型的選擇應基于你的需求而不是性能問題。
有兩個主要因素有助于改善循環性能 —— 每次迭代完成的工作和迭代次數。
在下面的內容中,我們將會看到通過對這兩點的優化,可以對循環的整體性能產生積極的影響。
For 循環
在 ECMA-262(定義JavaScript的基本語法和行為的規范)第三版中,定義了四種循環類型。第一個是標準的 for 循環,它與其他類 C 語言的語法相同:
for (var i = 0; i < 10; i++){ //循環體 }
這可能是最常用的 JavaScript 循環結構。要了解應該怎樣對其進行優化,需要先進行一些分析。
解析
for 循環由四部分組成:初始化,預測試條件,循環體和后執行。它的工作方式如下:首先,執行初始化代碼(var i = 0;)。然后是預測試條件(i <10;)。如果預測試條件的計算結果為 true,則執行循環體。之后運行后執行代碼(i ++)。
優化
要優化循環中的工作量,第一步是最小化對象成員和數組項查找的數量。
還可以通過反轉順序來提高循環的性能。在 JavaScript 中,反轉循環對循環的性能提升不大,除非你消除了額外的操作。
// 原始循環 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 循環
第二種是 while 循環。下面是一個簡單的預測試循環,由預測試條件和循環體組成。
var i = 0; while(i < 10){ //循環體 i++; }
解析
如果預測試條件的計算結果為 true,則執行循環體。如果不是 —— 它就會被跳過。每個 while 循環都可以用 for 替換,反之亦然。
優化
// 原始循環 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 循環
do-while 是第三種循環,它是 JavaScript 中唯一的后測試循環。由循環體和后測試條件組成:
var i = 0; do { //循環體 } while (i++ < 10);
解析
在這種類型的循環中,循環體總是至少執行一次。然后評估測試后的條件,如果它是true,則執行另一個循環周期。
優化
// 原始循環 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 循環
最后一種是 for-in 循環。它有一個非常特殊的用途 —— 枚舉 JavaScript 對象的命名屬性。 它的語法如下:
for (var prop in object){ //loop body }
解析
它的名稱與 for 循環類似。但是工作方式完全不同。而這種差異使它比另外三種循環慢得多,后者具有相同的性能特征,所以爭論哪個循環最快是沒有用的。
每次循環執行時,變量 prop 會得到 object 的一個屬性。它將會不斷執行,直到返回所有屬性為止。這些是對象自身的以及通過其原型鏈繼承的屬性。
注意事項
永遠不要用“ for-in ”來迭代數組成員。
這種循環的每次迭代都會在實例或原型上進行屬性查找,這使得 for-in 循環比其它循環要慢得多。對于相同次數的迭代,可能會比其它循環慢七倍。
結論
for , while 和 do-while 循環都有類似的性能特征,因此沒有哪種類型比其他的更快或更慢。
避免使用 for-in 循環,除非你需要對大量未知對象屬性進行迭代。
提高循環性能的最佳方法是減少每次迭代完成的工作量并減少循環迭代次數。
感謝各位的閱讀!關于“如何通過循環優化JavaScript 程序”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。