繁体   English   中英

请帮我在 Javascript 中调试有关 for/in 的此错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM