return如何终止each迭代

问题:我自定义了一个each迭代函数,想比较两个数组是否一致。如果遍历过程中发现不一样,则退出循环。如何退出循环现在有些疑问。
代码:

/* 
   自己实现迭代器
*/
const each = function(arr,callback){
    for(var i=0;i<arr.length;i++){
        callback.call(arr[i],i,arr[i]);
    }
}


/* 
    比较两数组是否一样  -----方式一
*/
const compare = function(arr1,arr2){
    if(arr1.length !== arr2.length){
        console.log("两数组长度不一致");
        return;
    }
    each(arr1,function(index,item){
        if(item !== arr2[index]){
            console.log("两数组不一致");
            return;
        }
    })
}


/* 
    比较两数组是否一样-----方式二
*/
const compare = function(arr1,arr2){
    if(arr1.length !== arr2.length){
        console.log("两数组长度不一致");
        return;
    }
    var breaked = false;
    each(arr1,function(index,item){
        if(breaked){
            return;
        }
        if(item !== arr2[index]){
            console.log("两数组不一致");
            breaked = true;
        }
    })
}

疑问:使用方式一,如果不相等,循环还会继续执行,不会终止。但是使用方式二可以终止循环。请问两方式的区别在哪里。

阅读 3.2k
6 个回答

第二个compare 函数加一行:

   if(breaked){
        console.log(index);//加这一行
        return;
     }

你就会发现其实第二个函数也并没有退出循环。

要退出循环,还是必须在each函数中去操作,比如你可以这样改:

const each = function(arr,callback){
        for(var i=0;i<arr.length;i++){
             if(callback.call(arr[i],i,arr[i])==2){break;}
        }
    }
    
    /*
    比较两数组是否一样 -----方式一
    */
const compare = function(arr1,arr2){
        if(arr1.length !== arr2.length){
            console.log("两数组长度不一致");
            return 2;
        }
        each(arr1,function(index,item){
            if(item !== arr2[index]){
                console.log("两数组不一致",index);
                return 2;
            }
        })
    }

return false;

方式一 each里面是回调函数。你在回调函数里return只是把回调函数return了。而不是你自己定义的那个函数

任何终止都只是终止当前函数,无法终止外部函数。

可以用 return new Error() ^_^||

问题的根源在你实现的each中,callback执行的结果在each中看没有任何意义,一直在for循环中。另外,你的两种方式实际上效果是一样的,不信你在

if(breaked){
    return;
}

加上console.log试试

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题