javascript - 为什么这个不正确的 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
面试官让我解释一下这段代码是如何工作的。我认为平均函数只是将数组中的所有数字相加,然后将总和除以数组的长度。然而,这不是正确的解释。
上面的代码有一个错误。然而,它产生了正确的答案。你能找到错误并修复它吗?另外,你能解释一下为什么上面的代码即使不正确也会产生正确的答案?
解决方案
问题是您使用的是for...in
循环而不是for...of
循环。循环将for...of
遍历数组元素,并不管输入如何都产生正确的答案。但是,for...in
循环会遍历数组索引。因此,在大多数情况下,它会产生错误的答案。然而,对于这个特定的输入,它会产生正确的答案。
| sum | num |
| ------ | --- |
| 0 | "0" |
| "00" | "1" |
| "001" | "2" |
| "0012" | |
数组的索引是"0"
、"1"
和"2"
。索引是字符串,而不是数字。因此,当您将索引添加"0"
到 的初始值sum
ie0
时,JavaScript 会将 转换sum
为字符串,将两个字符串连接起来,并将连接后的字符串存储回sum
. 在循环结束时,值sum
is"0012"
而不是期望值12
。
然而,两者都"0012" / 3
产生12 / 3
正确的答案,即4
。在第一种情况下,JavaScript 首先将字符串"0012"
转换为数字12
。因此,我们意外地得到了这个特定输入的正确答案。
推荐阅读
- java - 为什么默认的最大堆大小这么小
- text - 更改文本画布大小
- dataset - 夏令时转换日期时间的未来列表(英国)
- linux - 如何处理错误 libXdamage.so.1: cannot open shared object file on Centos VM?
- java - 带有图像的 RecyclerView 滚动不流畅(滞后)
- java - 如何检查我的应用程序是否失去焦点?
- php - 如何为未使用的 Symfony 数据实现冷存储?
- docker - 通过docker、kubernetes和google云平台部署应用的步骤
- c# - SimpleInjector:在测试数据库上对控制器方法进行端到端测试
- swift - Swift 4:“距离(到:)”不可用