[英]Please help me debug this error about for/in in Javascript
我正在学习 javascript 基本知识,但我对 for/in 和 for/of 有疑问。
var courses = [1, 2, 3, 4];
Array.prototype.reduce2 = function (callback, initialValue) {
var sum = initialValue;
for(var value of this) {
sum = callback(sum, value);
}
return sum;
}
function func(total, number) {
return total + number;
}
var sum = courses.reduce2(func, 0);
console.log(sum);
该程序用于定义reduce2 function,它计算数组中值的总和。 在 reduce2 中,我使用 for/of 并返回正确的结果。
for(var value of this) {
sum = callback(sum, value);
}
但是,当我使用 for/in 时,它会返回不正确的结果。
for(var i in this) {
sum = callback(sum, this[i]);
}
这就是结果。
10function (callback, initialValue) {
var sum = initialValue;
for(var i in this) {
sum = callback(sum, this[i]);
}
return sum;
}
请帮帮我,万分感谢!!!
从for...in
文档
for...in 语句遍历 object 的所有可枚举属性
因此,在您的情况下,当在数组值的末尾使用for...in
时, i
将是reduce2
,所以this[i]
指的是reduce2
function。 使用for...in
时,您可以看到以下代码段的 output 。
var courses = [1, 2, 3, 4]; Array.prototype.reduce2 = function(callback, initialValue) { var sum = initialValue; for (var i in this) { console.log(`this[${i}]: ${this[i]}`); sum = callback(sum, this[i]); } return sum; } function func(total, number) { return total + number; } var sum = courses.reduce2(func, 0);
因为, this[i]
被传递给回调 function,它被附加到最终的 output 即,function 在这种情况下声明本身被附加到10
。
为了避免在使用for...in
这种情况,我们可以利用hasOwnProperty
并获得所需的 output。
var courses = [1, 2, 3, 4]; Array.prototype.reduce2 = function (callback, initialValue) { var sum = initialValue; for(var i in this) { if(this.hasOwnProperty(i)){ sum = callback(sum, this[i]); } } return sum; } function func(total, number) { return total + number; } var sum = courses.reduce2(func, 0); console.log(sum);
for..in
不是 go 通过索引。 正如@nithish 提到的,它将迭代属性。 最好使用经典for loop
来迭代索引并获得数组项的所需行为。
var courses = [1, 2, 3, 4]; Array.prototype.reduce2 = function (callback, initialValue) { var sum = initialValue; for (var i = 0; i < this.length; i++) { sum = callback(sum, this[i]); } return sum; }; function func(total, number) { return total + number; } var sum = courses.reduce2(func, 0); console.log(sum);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.