Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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 为什么for循环和forEach的工作方式不同?_Javascript_Arrays_Loops - Fatal编程技术网

Javascript 为什么for循环和forEach的工作方式不同?

Javascript 为什么for循环和forEach的工作方式不同?,javascript,arrays,loops,Javascript,Arrays,Loops,下面是一个简单的LeetCode函数,用于在给定数组中查找重复项 function findDuplicates(nums) { let hash = {} for (let i = 0; i < nums.length; i++) { if (!hash[nums[i]]) { hash[nums[i]] = true } else { return true } }

下面是一个简单的LeetCode函数,用于在给定数组中查找重复项

function findDuplicates(nums) {
    let hash = {}
    for (let i = 0; i < nums.length; i++) {
        if (!hash[nums[i]]) {
            hash[nums[i]] = true
        } else {
            return true
        }
    }
    
    return false
}
此功能不适用于
[0,4,5,3,0,6]
的相同输入。
你能解释一下为什么这两种解决方案会产生不同的结果吗?或者只给我指出正确的方向。

Return语句相当于break,因为循环可以断开,foreach不能断开。

在第一个示例中,您在
findDuplicates
函数中执行
Return
操作,立即停止它。在第二个迭代中,您在
forEach
中执行
return
操作,这不会阻止其他迭代的运行(并且
返回
forEach
中的值是无用的,因为它在任何地方都不可用)使用
for(nums的常量){
相反。我还建议使用
集合
来代替
散列={}
…或者,使用
简单地返回nums.every((el,I)=>nums.indexOf(el)==I);
(对于
forEach
)@blex这个函数的bigO是什么?使用散列={}使它成为O(n)我不知道如何计算它,但是是的,使用它比将遇到的值存储在
散列
变量(对于
每个
元素,它将执行
indexOf
,这也将在内部循环)中效率更低。在大多数日常使用中都不重要(这使代码更容易阅读,时间差不会明显),但如果你有庞大的数据集,它确实会产生“foreach不可能”的影响。这不是真的。你可以阻止
foreach
循环(尽管它很难看):参考这个答案:没错。我的方法与提供的答案中的第二个示例类似
function findDuplicates(nums) {
    let hash = {}
    nums.forEach(el => {
        if (!hash[el]) {
            hash[el] = true
        } else {
            return true
        }
    });

    return false
}