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

标签 javascript ecmascript-6 for-in-loop 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


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

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

最佳答案

问题是您使用的是 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 .因此,我们意外地得到了这个特定输入的正确答案。

关于javascript - 为什么这个不正确的 JavaScript 程序会产生正确的答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60652932/

相关文章:

javascript - ionic 改变位置不起作用

javascript - WebExtensions 是否有等同于 nsIBrowserSearchService 的工具?

javascript - 使用 for in 循环访问嵌套对象

linux - 如何 tgz 目录中的所有项目并使用 GnuPG 即时加密?

javascript - javascript中函数体后的参数列表有什么用?

javascript - Angular 路由器看不到要重定向的组件

javascript - 在构造函数中定义路由

javascript - 在对象数组中查找所有匹配的元素

javascript - es6类方法无法访问本地状态?

swift - Swift 上的不可变值初始化错误?