首页 > 解决方案 > 为什么这个不正确的 JavaScript 程序会产生正确的答案?

问题描述

在一次采访中,我得到了以下 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

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

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

标签: javascriptecmascript-6for-in-loopfor-of-loop

解决方案


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

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

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

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


推荐阅读