for, for in, for of, map, forEach 循环的区别,map 和forEach 退出循环

707 阅读1分钟

const arr =[1,2]

Object.prototype.something= function (){
    console.log('something')
}
for(let i=0;i<arr.length;i++){
    //(1) for 不会访问原型连上的
    // (2) break continue return 可以退出循环
    if(i===1){
        // break;
        // continue;
        // return;
    }
    console.log(i+'---'+arr[i])
}
for(let i in arr){
     //(1) in 会访问原型连上的
    // (2)  返回索引值
    // (3) break continue 不可以退出循环
    //  (3) return 可以退出循环 会报错
    if(i===1){
        // break;
        // continue;
        // return;
    }
    console.log(i)
}

for(let i of arr){
    //(1) of 不会访问原型连上的
    // (2) 返回value 值
    //  (3) break continue return 可以退出循环
    if(i===2){
        // break;
        // continue;
        // return;
    }
    console.log(i)
}

arr.map((item,index,arr)=>{
    //(1) map 不会访问原型连上数据
     // (2) 返回value,index,arr值
    //  (3) return 不能退出循环
    //(4)continue break 报错
     if(index==1){
    //   return
        // continue
        // break
     }
    console.log(item,index,arr)
})


arr.forEach((item,index,arr)=>{
    //(1) map 不会访问原型连上数据
     // (2) 返回value,index,arr值
    //  (3) return 不能退出循环
    //(4)continue break 报错
     if(index==1){
    //   return
        // continue
        // break
     }
    console.log(item,index,arr)
})



// 跳出foreach循环 
let arrnew = [0, 1, "stop", 3, 4];
try {
    arrnew.forEach(element => {
        if (element === "stop") {
            throw new Error("forEachBreak");
        }
        console.log(element); // 输出 0 1 后面不输出
    });
} catch (e) {
    console.log(e.message); // forEachBreak
};

// 重写foreach 
Array.prototype.forEach = function (fn) {
    for (let i = 0; i < this.length; i++) {
        let ret = fn(this[i], i, this);
        if (typeof ret !== "undefined" && (ret == null || ret == false)) break;
    }
}



// map 通过try catch 捕获异常 来终止循环
const arrn = [1,2,3,4];
try {
    arrn.map((v) => {
        console.log(v)
        if (v === 2) {
            throw 'out';
        }
    })
} catch (e) {
    console.log(e)
}

总结: map 和forEach 退出循环 可以通过try catch 方式退出循环