在一次采访中,我得到了以下 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" / 3
和 12 / 3
产生正确的答案,即 4
.在第一种情况下,JavaScript 首先将字符串 "0012"
进入号码12
.因此,我们意外地得到了这个特定输入的正确答案。
关于javascript - 为什么这个不正确的 JavaScript 程序会产生正确的答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60652932/