for,forEach,map性能分析

性能方面

没有10W数据随意用哪个,有问题再优化。

中断循环

forEach和map

使用break报错Uncaught SyntaxError: Illegal break statement

使用return不能打断循环

let arr = [1, 2, 3];

function fn() {
    arr.map(item => {
        console.log(item);
        if (item != 1) {
            return;
        }
    })
    arr.forEach(item => {
        console.log(item);
        if (item != 1) {
            return;
        }
    })
}
fn();

结果

> 1
> 2
> 3
> 1
> 2
> 3

使用for循环则可以

let arr = [1, 2, 3];

function fn() {
    for (let i = 0; i < arr.length; i++) {
        console.log(arr[i]);
        if (arr[i] != 1) {
            break; // 跳出循环
        }
        console.log(arr[i]);
    }
    console.log('just break');
    for (let i = 0; i < arr.length; i++) {
        console.log(arr[i]);
        if (arr[i] != 1) {
            return; // 跳出整个函数
        }
        console.log(arr[i]);
    }
    console.log('just return');
}
fn();

结果

> 1
> 1
> 2
> just break
> 1
> 1
> 2

异步循环EventLoop导致结果有误)

function fun(e) {
    return new Promise(function (resolve) {
        console.log('promise', e);
        return resolve(e);
    })
}

let arr = [1, 2, 3], res_map = [], res_forEach = [], res_for = [];

arr.forEach(async item => {
    let temp = await fun(item); // 第一执行
    console.log(temp); // 第四执行
    res_forEach.push(temp); // 第二执行
})
console.log('res_forEach', res_forEach); // 第三执行

arr.map(async item => { // 原因同forEach
    let temp = await fun(item);
    console.log(temp);
    res_map.push(temp);
})
console.log('res_map', res_map);

async function fun1() {
    for (let i = 0; i < arr.length; i++) {
        let temp = await fun(arr[i]); // 第一执行
        console.log(temp); // 第二执行
        res_for.push(temp); // 第三执行
    }
    console.log('res_for', res_for); // 第四执行
}
fun1();

结果

// 单独执行forEach
> promise,1
> promise,2
> promise,3
> res_forEach,[]
> 1
> 2
> 3
// 单独执行map
> promise,1
> promise,2
> promise,3
> res_map,[]
> 1
> 2
> 3
// 单独执行for
> promise,1
> 1
> promise,2
> 2
> promise,3
> 3
> res_for,[1,2,3]

forEach和map都有回调函数,回调函数中有异步函数。
JS主线程执行栈遇到回调函数中的异步任务(异步调用函数)时,等异步任务有结果就在事件触发线程任务队列中添加一个事件,然后继续执行执行栈中的同步任务。
等执行栈中的同步任务全部执行完后,读取任务队列中的异步任务到执行栈中进行执行。

forEach和map的应用场景(两个函数都不改变原数组)

map:会创造一个新的数组,占用内存。
forEach:对数组内的所有元素执行一次回调函数,获取每个元素执行回调函数的结果。
个人感觉:map = forEach + new.push

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值