【问题标题】:Why does this incorrect JavaScript program produce the correct answer?为什么这个不正确的 JavaScript 程序会产生正确的答案?
【发布时间】:2020-06-24 10:26:01
【问题描述】:

我在一次采访中得到了以下 JavaScript 程序。

const average = xs => {
    let sum = 0;
    for (let num in xs) sum += num;
    return sum / xs.length;
};

const result = average([2, 4, 6]);

console.log(result); // 4

面试官让我解释一下这段代码是如何工作的。我认为平均函数只是将数组中的所有数字相加,然后将总和除以数组的长度。但是,这不是正确的解释。

上面的代码有一个错误。然而,它产生了正确的答案。你能找到错误并修复它吗?另外,你能解释一下为什么上面的代码即使不正确也能产生正确的答案?

【问题讨论】:

  • for (let num in xs) { sum += num; console.log(num,sum); }
  • 看起来测试是关于 for...in(或 for...of)循环。不喜欢这样的测试。详细掌握所有 JS API 的工作原理是非常非常困难的。不过,谢谢分享。
  • 好问题。我花了一段时间才弄明白

标签: javascript ecmascript-6 for-in-loop for-of-loop


【解决方案1】:

问题在于您使用的是for...in 循环而不是for...of 循环。 for...of 循环将遍历数组元素,并不管输入如何产生正确的答案。但是,for...in 循环会遍历数组索引。因此,在大多数情况下,它会产生错误的答案。然而,对于这个特定的输入,它会产生正确的答案。

|  sum   | num |
| ------ | --- |
|  0     | "0" |
| "00"   | "1" |
| "001"  | "2" |
| "0012" |     |

数组的索引是"0""1""2"。索引是字符串,而不是数字。因此,当您将索引"0" 添加到sum 的初始值,即0 时,JavaScript 会将sum 转换为字符串,将两个字符串连接起来,并将连接后的字符串存储回sum .在循环结束时,sum 的值是"0012",而不是预期的值12

但是,"0012" / 312 / 3 都会产生正确的答案,即 4。在第一种情况下,JavaScript 首先将字符串"0012" 转换为数字12。因此,我们意外地得到了这个特定输入的正确答案。

【讨论】:

    【解决方案2】:

    for... in 用于获取对象中的键。由于数组是具有键作为数字索引的对象的特殊实现,for...in 返回这些键。

    键为 '0','1','2'

    每次迭代后字符串连接发生“0”+“0”+“1”+“2” sum = "0012"

    当您尝试除以它时,它会隐式转换为数字 12/3=4

    所以输出为 4。

    可以在下面的代码sn-p中查看

    let xs = [2,4,6], sum=0 
    for (let num in xs) { sum += num; console.log(num,sum); }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多