溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何通過循環(huán)優(yōu)化JavaScript 程序

發(fā)布時(shí)間:2021-07-24 09:12:58 來源:億速云 閱讀:129 作者:小新 欄目:web開發(fā)

這篇文章給大家分享的是有關(guān)如何通過循環(huán)優(yōu)化JavaScript 程序的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。

前言

對(duì)于提高 JavaScript 程序的性能這個(gè)問題,最簡單同時(shí)也是很容易被忽視的方法就是學(xué)習(xí)如何正確編寫高性能循環(huán)語句。本文將會(huì)幫你解決這個(gè)問題。

我們將看到 JavaScript 中主要的循環(huán)類型,以及如何針對(duì)它們進(jìn)行高效編碼。

現(xiàn)在開始!

循環(huán)性能

談到循環(huán)性能,爭論的焦點(diǎn)始終會(huì)集中到關(guān)于應(yīng)該使用哪種循環(huán),哪個(gè)是速度最快、性能最好的?事實(shí)上,在 JavaScript 提供的四種循環(huán)類型中,只有一種比其他循環(huán)慢得多 —— ?for-in 循環(huán)。 對(duì)循環(huán)類型的選擇應(yīng)基于你的需求而不是性能問題。

有兩個(gè)主要因素有助于改善循環(huán)性能 —— 每次迭代完成的工作和迭代次數(shù)。

在下面的內(nèi)容中,我們將會(huì)看到通過對(duì)這兩點(diǎn)的優(yōu)化,可以對(duì)循環(huán)的整體性能產(chǎn)生積極的影響。

For 循環(huán)

在 ECMA-262(定義JavaScript的基本語法和行為的規(guī)范)第三版中,定義了四種循環(huán)類型。第一個(gè)是標(biāo)準(zhǔn)的 for 循環(huán),它與其他類 C 語言的語法相同:

for (var i = 0; i < 10; i++){
//循環(huán)體
}

這可能是最常用的 JavaScript 循環(huán)結(jié)構(gòu)。要了解應(yīng)該怎樣對(duì)其進(jìn)行優(yōu)化,需要先進(jìn)行一些分析。

解析

for 循環(huán)由四部分組成:初始化,預(yù)測試條件,循環(huán)體和后執(zhí)行。它的工作方式如下:首先,執(zhí)行初始化代碼(var i = 0;)。然后是預(yù)測試條件(i <10;)。如果預(yù)測試條件的計(jì)算結(jié)果為 true,則執(zhí)行循環(huán)體。之后運(yùn)行后執(zhí)行代碼(i ++)。

優(yōu)化

要優(yōu)化循環(huán)中的工作量,第一步是最小化對(duì)象成員和數(shù)組項(xiàng)查找的數(shù)量。
還可以通過反轉(zhuǎn)順序來提高循環(huán)的性能。在 JavaScript 中,反轉(zhuǎn)循環(huán)對(duì)循環(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)。下面是一個(gè)簡單的預(yù)測試循環(huán),由預(yù)測試條件和循環(huán)體組成。

var i = 0;
while(i < 10){
//循環(huán)體
i++;
}

解析

如果預(yù)測試條件的計(jì)算結(jié)果為 true,則執(zhí)行循環(huán)體。如果不是 —— 它就會(huì)被跳過。每個(gè) 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í)行一次。然后評(píng)估測試后的條件,如果它是true,則執(zhí)行另一個(gè)循環(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)。它有一個(gè)非常特殊的用途 —— 枚舉 JavaScript 對(duì)象的命名屬性。 它的語法如下:

for (var prop in object){
//loop body
}

解析

它的名稱與 for 循環(huán)類似。但是工作方式完全不同。而這種差異使它比另外三種循環(huán)慢得多,后者具有相同的性能特征,所以爭論哪個(gè)循環(huán)最快是沒有用的。

每次循環(huán)執(zhí)行時(shí),變量 prop 會(huì)得到 object 的一個(gè)屬性。它將會(huì)不斷執(zhí)行,直到返回所有屬性為止。這些是對(duì)象自身的以及通過其原型鏈繼承的屬性。

注意事項(xiàng)

永遠(yuǎn)不要用“ for-in ”來迭代數(shù)組成員。

這種循環(huán)的每次迭代都會(huì)在實(shí)例或原型上進(jìn)行屬性查找,這使得 for-in 循環(huán)比其它循環(huán)要慢得多。對(duì)于相同次數(shù)的迭代,可能會(huì)比其它循環(huán)慢七倍。

結(jié)論

for , while 和 do-while 循環(huán)都有類似的性能特征,因此沒有哪種類型比其他的更快或更慢。

避免使用 for-in 循環(huán),除非你需要對(duì)大量未知對(duì)象屬性進(jìn)行迭代。

提高循環(huán)性能的最佳方法是減少每次迭代完成的工作量并減少循環(huán)迭代次數(shù)。

感謝各位的閱讀!關(guān)于“如何通過循環(huán)優(yōu)化JavaScript 程序”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI