用未声明的变量javascript除以零

时间:2018-06-19 08:06:45

标签: javascript ecmascript-6

我有这个任务:“使用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。

1 个答案:

答案 0 :(得分:0)

发生这种情况的原因是在松散模式(即非严格模式)下,分配未声明的变量会使它们成为全局变量。

因此,您使用一些参数运行average(),这会将全局len设置为任意数字,并返回正确的平均值。 (这也是udacity测试通过的原因,测试顺序很重要。如果他们先运行空输入测试,那就失败了)

然后在没有参数的情况下再次运行它,因为在循环内部设置len,它不会再次发生,因为空数组上的for..of循环甚至不会输入,那么0(总和)除以whatever(前一个len,设置为任意数字)的结果将为0。

如果您在严格模式下运行它,那么即使您使用参数运行它,您也会收到有关分配给未声明变量的错误。

这就是你永远的原因:

  1. 使用严格模式(将'use strict'添加到您的顶级功能或文件,如果您使用webpack或类似的捆绑包,则默认情况下会这样)
  2. 声明您的变量。
  3. 这个的正确版本,假设他们想要一个空输入返回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个数字的平均值是未定义的。