Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript";对于“的…”;没有按预期工作。_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript";对于“的…”;没有按预期工作。

Javascript";对于“的…”;没有按预期工作。,javascript,ecmascript-6,Javascript,Ecmascript 6,我似乎误解了“for..of”循环的功能。在下面的示例中,我找到了数组中最大的子数组(在本例中为[2,-1,7])。当我使用“for..of”循环时,它返回“NaN”,但常规for循环(var I=0;I

我似乎误解了“for..of”循环的功能。在下面的示例中,我找到了数组中最大的子数组(在本例中为[2,-1,7])。当我使用“for..of”循环时,它返回“NaN”,但常规for循环(var I=0;I “for..of”的迭代方式如何与常规for循环不同

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实现了这一点,但不理解这两个循环之间的区别。罗布的回答让我很高兴。