Javascript";对于“的…”;没有按预期工作。
我似乎误解了“for..of”循环的功能。在下面的示例中,我找到了数组中最大的子数组(在本例中为[2,-1,7])。当我使用“for..of”循环时,它返回“NaN”,但常规for循环(var I=0;IJavascript";对于“的…”;没有按预期工作。,javascript,ecmascript-6,Javascript,Ecmascript 6,我似乎误解了“for..of”循环的功能。在下面的示例中,我找到了数组中最大的子数组(在本例中为[2,-1,7])。当我使用“for..of”循环时,它返回“NaN”,但常规for循环(var I=0;I
var array = [2,-1,7,-7];
var largestSubArray = function (array) {
var current = 0;
var newest = 0;
for(var i of array){
newest = Math.max(0, newest + array[i]);
current = Math.max(newest, current);
}
return current;
};
console.log(largestSubArray(array));
// Returns NaN, should return 8
i
不是当前索引,而是当前值。请尝试以下方法:
for(var i of array){
newest = Math.max(0, newest + i);
current = Math.max(newest, current);
}
i
不是当前索引,而是当前值。请尝试以下方法:
for(var i of array){
newest = Math.max(0, newest + i);
current = Math.max(newest, current);
}
改变
newest = Math.max(0, newest + array[i]);
到
改变
newest = Math.max(0, newest + array[i]);
到
我认为你把中的和中的混为一谈了。两者之间的区别在于迭代期间
i
中存储的内容。两者分别区分数组元素的值和索引
for…of
将您的i
设置为迭代周期中当前元素的值
for…in
将您的i
设置为迭代周期中当前元素的值
将来测试这一点的更简单方法是console.log
您的变量。一个简单的测试通过稍微修改代码来说明上述行为:
var array = [2,-1,7,-7];
var largestSubArray = function (array) {
var current = 0;
var newest = 0;
for(var i of array){
console.log(i, array[i]);
newest = Math.max(0, newest + array[i]);
current = Math.max(newest, current);
}
return current;
};
console.log(largestSubArray(array));
综上所述,结果如下:
i array[i]
================
2 7
-1 undefined
7 undefined
-7 undefined
NaN
这是因为i
等于给定上述代码的值。但是,将其从
中的
更改为
中的
将产生以下结果:
i array[i]
================
0 2
1 -1
2 7
3 -7
8
注意您的行latest=Math.max(0,latest+array[i])代码>。在原始代码中,当使用for…of
循环时,数组[i]
可以简单地替换为i
。我认为您将for…of
与for…混为一谈。两者之间的区别在于迭代期间i
中存储的内容。两者分别区分数组元素的值和索引
for…of
将您的i
设置为迭代周期中当前元素的值
for…in
将您的i
设置为迭代周期中当前元素的值
将来测试这一点的更简单方法是console.log
您的变量。一个简单的测试通过稍微修改代码来说明上述行为:
var array = [2,-1,7,-7];
var largestSubArray = function (array) {
var current = 0;
var newest = 0;
for(var i of array){
console.log(i, array[i]);
newest = Math.max(0, newest + array[i]);
current = Math.max(newest, current);
}
return current;
};
console.log(largestSubArray(array));
综上所述,结果如下:
i array[i]
================
2 7
-1 undefined
7 undefined
-7 undefined
NaN
这是因为i
等于给定上述代码的值。但是,将其从
中的
更改为
中的
将产生以下结果:
i array[i]
================
0 2
1 -1
2 7
3 -7
8
注意您的行latest=Math.max(0,latest+array[i])代码>。在原始代码中,数组[i]
在使用for…of
循环时可以简单地替换为i
。您可以在for..of
中检查此链接,i
是值,而不是键。尝试在控制台中记录i
。阅读文档可能会有所帮助:;)您应该签出Array.reduce(),它是内置的,无需编写for循环即可执行您想要的操作。感谢Stephen和Andreas的建议。两人都阅读了文档,并在发布前使用reduce实现了这一点,但不理解这两个循环之间的区别。Rob的回答让它点击了。您可以在中查看此链接,查看..of
,i
是值,而不是键。尝试在控制台中记录i
。阅读文档可能会有所帮助:;)您应该签出Array.reduce(),它是内置的,无需编写for循环即可执行您想要的操作。感谢Stephen和Andreas的建议。两人都阅读了文档,并在发布前使用reduce实现了这一点,但不理解这两个循环之间的区别。罗布的回答让我很高兴。