2016-08-03 43 views
2

我正在完成一些JavaScript算法挑戰,我不得不因爲其中一個數字的一​​部分而對數字進行因式分解。在搜索堆棧和其他地方後,我輸入了一個正確的代碼塊:JavaScript - Factorialization'For Loop'瞭解?

function factorialize(num) { 

    if(num === 0) { 
     return 1; 
    } 

    if(num < 0) { 
     return undefined; 
    } 

    for(var i = num; --i;) { 
     num *= i; 
    } 
     return num; 
} 

factorialize(5); 

它返回正確的結果。然而,我很難理解的是爲什麼for循環沒有第二個語句,爲什麼它可以永遠運行?我有一個暗示,因爲只要i的值是0,隨後生成的負數將乘以0,因此只有整數會形成結果。但是爲什麼函數返回一個有效的數字,如果循環仍然運行到-infinity並且在達到某個值時沒有被告知停止?

+0

它沒有第三個語句...並且這是足夠有效的......第二個語句在我爲1時打斷循環(即--i將爲0)... for循環定義爲(for [initial]; [條件]; [final-expression])'...條件是什麼測試,看看循環是否應該繼續運行,只要它評估真相,循環繼續。在第一個循環之前運行初始化,在每個循環結束時運行終結 –

回答

1

for-loop表達式中的所有元素都是可選的。

for循環的第二部分用於表示for循環的條件。該條件在每次迭代中評估,當它計算爲false時,退出循環。

在這種情況下,表示條件的第二部分是--i。這意味着在每次迭代中,i將減1,直到它最終達到零(0)。由於0被認爲是Javascript中的falsey值,因此循環退出。

+0

感謝Robby,這很有道理 – dreamkiller

0

通常你會:

for(var i = 0; i < num; i++) 

第二條語句是一個布爾表達式延續。 所以當你有

for(var i = num; i--;) 

第二仍然是一個布爾表達式延續,當我到達0時結果爲假。

1

for (a; b; c)

是直接等同於

a; 
while (b) { 
    c; 
} 

你錯了,因爲在這裏你似乎認爲c是什麼決定了循環的結束,但b實際上是。如果你不需要它(以及第一個),你可以省略第三個循環語句。

在這裏,你的循環相當於:

var i = num; 
while (--i) { 
    num *= i; 
} 

while (--i)做了兩兩件事:

  • 遞減i(之前別的)
  • 檢查i != 0(這是實際的循環條件)。

如果是i--,請注意操作將按相反順序完成。

如果發現代碼難以閱讀,你也可以把它寫這種方式相同的結果:

for (var i = num - 1; i != 0; i--) { 
    num *= i; 
} 
2

for循環的第二部分是條件:

的表達式在每次循環迭代之前被評估。如果此表達式的計算結果爲true,則執行語句。這個條件測試是可選的。如果省略,則條件始終爲真。如果表達式計算結果爲false,則執行跳到for結構之後的第一個表達式。

一旦--i達到0時,計算結果爲falsefalsey)和for 「退出」

添加console.log(i)你的for循環將有助於證明

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for

+0

感謝Luca,這很有道理, – dreamkiller

+0

不用說,有趣的問題。 – Luca