为什么这个不正确的 JavaScript 程序会产生正确的答案?

Aad*_*hah 4 javascript for-in-loop ecmascript-6 for-of-loop

我在一次采访中得到了以下 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
Run Code Online (Sandbox Code Playgroud)

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

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

Aad*_*hah 7

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

|  sum   | num |
| ------ | --- |
|  0     | "0" |
| "00"   | "1" |
| "001"  | "2" |
| "0012" |     |
Run Code Online (Sandbox Code Playgroud)

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

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