为什么这个函数返回NAN ?

Why does this function return NAN

本文关键字:NAN 返回 函数 为什么      更新时间:2023-09-26

如果我使用<=而不是<,我将得到NaN,为什么?

function addArgs(){
    var sum = 0, count = 0;
    while(count <= arguments.length){
         sum += arguments[count];
         count++;
    }
    return sum;
}

在循环的最后一次迭代中,countarguments.length,因此为arguments[count] === arguments[arguments.length] === undefined, sum += undefinedsum === NaN

假设你的参数是3个元素:

arguments = [0,1, 2]

你的计数将迭代为0 => 1 => 2 => 3(并且在第3次你超出了数组的边界,因为它有3个元素,但从0开始索引。

当您遍历列表并使用索引访问列表中的项时(就像您正在做的那样),您总是迭代到length - 1< length。原因是列表索引从0开始,而不是1。例如,一个包含3个项目的列表,其length等于3,其项目的索引为0、1和2。没有索引为3的项,所以如果迭代到length<= length,计数器将在最后一次迭代中达到3,并且尝试检索索引为3的项将失败并返回undefined

最后,由于undefined不是数字,将undefined加到总和中将得到NaN

似乎arguments[count]不是一个数字(NaN)。在Javascript中,当表达式中的第二个参数不是数字时,第一个参数也被视为不是数字。

因此,sum函数最终被视为另一种数据类型。

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

所有的迭代都从0开始(同样,在您的代码中也是count = 0)。所以,max count = arguments.length-1

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

除此之外,当count1开始时,您可以使用<=

function addArgs(){
    var sum = 0, count = 1;
    while(count <= arguments.length){
         sum += arguments[count-1];
         count++;
    }
    return sum;
}
addArgs(2,3,4);//9