2015-10-01 180 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