2011-12-14 41 views
2

這是JsFromHell如何定義一個函數找到一個數值數組(http://jsfromhell.com/array/sum)的總和有人可以解釋從JsFromHell此功能:數字數組的總和在JavaScript

sum = function(o){ 
    for(var s = 0, i = o.length; i; s += o[--i]); 
    return s; 
}; 
//sum([1, 2, 3, 4, 5, 6, 7, 8, 9]) 

有人可以解釋for循環的第二部分中發生了什麼嗎? 「我」的含義是什麼?它看起來像i> = 0一樣。但是它返回一個NaN。

回答

3

JavaScript有強制將非布爾值強制爲truefalse的各種方法。其中之一與數字有關:零是false,其他號碼是true

對於字符串,空字符串是false,其他是truenull的值被強制爲false,就像有點像禪宗的「未定義」的非值。

你可以寫代碼:

for (var s = 0, i = o.length; i > 0; s += o[--i]); 

,它可能會更有效。 (或者它可能不是;這是一種微型優化,只有圖書館維護人員應該擔心,因爲下週瀏覽器廠商可能會翻譯他們的翻譯並將其翻轉)

最後,重新獲得NaN,這意味着你並沒有真正的數字。如果數組中有一個單詞不能在「for」循環的第三部分中完全轉換爲數字值,則會得到一個NaN結果。 編輯 —哦,等等,我明白了;你試過i >= 0而不是i > 0。這意味着循環將嘗試訪問未定義的o[-1]。當您嘗試將其轉換爲數字時,會給您一個NaN

+1

嗯,你已經將前綴遞減改爲後綴遞減,這應該會觸發一個越界錯誤(或者被默默地忽略),我不確定它會改善perf ;-) – 2011-12-14 13:26:01

0
for(var s = 0, i = o.length; i; s += o[--i]); 

在每一步發生以下情況:

  1. 檢查,如果我是false
  2. 如果它是錯誤的停止,否則繼續。 0 == false。因此,當i將等於0時,循環將停止。
  3. 從i減去1(--i)。
  4. i的值加到os
  5. 轉到1
0

不正像for循環條件是檢查是否i是truthy IR falsy。其效果等同於做i !== 0

0

首先,它定義s是0和i在陣列長度

var s = 0, i = o.length; 

然後將它傳遞i因爲它有條件的,當JS解析數字格式布爾,你會看到0 or lessfalse1 or moretrue

i; //is true until it became 0 
3

循環作爲一個整體:

for(var s = 0, i = o.length; i; s += o[--i]); 

環路初始化(這實際上是設置兩個變量):

var s = 0   // set sum = 0 
var i = o.length // set "current item index" equal to last index in array 

迴路測試條件(當此爲假時,循環結束)

i // so this will become false when i == 0 

Coun廷表達:

s += o[--i] 

這增加了「當前」數組元素的值的總和,並遞減循環索引改變的「當前」的數組元素。 非常重要的是,它使用預減,因此:

  • 它不訪問越界值(當i == o.lengtho[i]會出界,而最後一個元素將通過o[i-1]訪問)
  • 它實際處理在o[0]的元件(迴路測試寫入的方式,當i == 0環路將立即退出,使得o[0]實際上需要被處理時i == 1
0
sum = function(o){ 
    for(var s = 0, i = o.length; i; s += o[--i]); 
    return s; 
}; 
//sum([1, 2, 3, 4, 5, 6, 7, 8, 9]) 

第一部分(聲明): s = 0i =長度陣列o

第二部分(條件) i是要反映數組的索引,這是我們開始在陣列o的長度。如果我們的指數變成0,它將相當於false

第3部分(動作) s被增加了數組o的位置--i的整數。 --是定義運算符,相當於i = i-1。這個操作員的位置很重要。由於它在信件i之前,程序在讀取之前將其減去i。所以第一次到達那裏時,i已經是o.length - 1

相關問題