2015-10-01 209 views
0

如果我用< =而不是<,我會得到NaN,爲什麼?爲什麼這個函數返回NAN

function addArgs(){ 
    var sum = 0, count = 0; 

    while(count <= arguments.length){ 

     sum += arguments[count]; 
     count++; 
    } 
    return sum; 
} 
+4

'參數count開始[統計]'是不確定的。將undefined添加到0 = undefined。如果使用'<',函數永遠不會評估while塊中的內容 –

回答

2

當你遍歷一個列表,然後使用索引來訪問列表中的項目(如你正在做的),你總是重複最多length - 1< length。原因是列表索引從零開始,而不是一個。例如,有3個項目的列表,它的length等於3,其項目的索引是0,1和2.沒有索引爲3的項目,所以如果迭代到length<= length,則計數器將達到3在上次迭代中,嘗試檢索索引爲3的項目將失敗並返回undefined

最後,將undefined添加到總和將導致NaN,因爲undefined不是數字。

3
在循環的最後一次迭代

countarguments.length,因此arguments[count] === arguments[arguments.length] === undefinedsum += undefined導致sum === NaN

2

看來參數[計數]不是數字(NAN)。在JavaScript中,當表達式中的第二個參數不是數字時,第一個參數也被視爲不是數字。

因此,sum會將該函數視爲另一種數據類型。

http://www.w3schools.com/js/js_datatypes.asp

3

假設你的參數是3個元素:

參數= [0,1,2]

你的計數將迭代0 => 1 => 2 => (和上3你是越界的數組,因爲它有3個元素,但進行索引從0開始

這是通過迭代循環的基礎。

1

所有迭代從開始(另外,在您的代碼中爲count = 0)。所以,最大count等於arguments.length-1

addArgs(2,5,8); - >arguments[0] = 2; arguments[1] = 5; arguments[2] = 8;

除此之外,你可以使用<=當從1

function addArgs(){ 
    var sum = 0, count = 1; 

    while(count <= arguments.length){ 

     sum += arguments[count-1]; 
     count++; 
    } 
    return sum; 
} 
addArgs(2,3,4);//9