性能方面
没有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