我有这个任务:“使用rest参数创建一个average()函数来计算无限数量的平均数”。我运行这段代码,我有 0 的答案。
function average(...nums) {
let total = 0;
for (const num of nums) {
total += num;
len = nums.length;
}
total = total/len;
return total;
}
console.log(average());
但为什么呢?为什么当我除以未声明的变量0时答案是 0 而不是 NaN ?如果我运行以下代码(使用声明的变量),那就是NaN。
function average(...nums) {
let total = 0,
len;
for (const num of nums) {
total += num;
len = nums.length;
}
total = total / len;
return total;
}
console.log(average());
P.S。任务中的正确答案是0。
答案 0 :(得分:0)
发生这种情况的原因是在松散模式(即非严格模式)下,分配未声明的变量会使它们成为全局变量。
因此,您使用一些参数运行average()
,这会将全局len
设置为任意数字,并返回正确的平均值。 (这也是udacity测试通过的原因,测试顺序很重要。如果他们先运行空输入测试,那就失败了)
然后在没有参数的情况下再次运行它,因为在循环内部设置len
,它不会再次发生,因为空数组上的for..of循环甚至不会输入,那么0
(总和)除以whatever
(前一个len,设置为任意数字)的结果将为0。
如果您在严格模式下运行它,那么即使您使用参数运行它,您也会收到有关分配给未声明变量的错误。
这就是你永远的原因:
'use strict'
添加到您的顶级功能或文件,如果您使用webpack或类似的捆绑包,则默认情况下会这样)这个的正确版本,假设他们想要一个空输入返回0,如下:
function average(...nums) {
'use strict'; // enter strict mode
if (nums.length === 0) { return 0; }
let total = 0;
for (const num of nums) {
total += num;
}
return total / nums.length;
}
console.log(average());
您必须直接定义空输入的行为,因为严格来说,一组0个数字的平均值是未定义的。