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