1. 为什么for循环比forEach性能高?

  1. 循环控制:for循环可以设置循环变量、循环条件来精确控制循环次数和逻辑,使得for 循环在大数据集迭代时更高效
  2. 在原型链上的调用次数:forEach迭代器函数是Array对象上的方法,在每次迭代时都会调用原型链上的方法,而for 循环是通过索引得到数组元素,可以避免在原型链上的多次调用,因此性能更高效。
  3. 迭代过程中的中断和跳出:for 循环可以使用 break 语句和 continue 语句在迭代过程中进行中断或跳出,提供了更大的灵活性。而 forEach 迭代器函数无法直接实现中断或跳出,只能通过抛出异常的方式来终止迭代。

2. setTimeout、Promise、Async/Await 的区别

SetTImeout

1
setTimeout是异步执行函数 , 当js主线程运行到此函数时,不会等待settimeout中的回调函数 ,会直接进行settimeout下面的语句(尽管setTimeout的延迟时间为0时) 当执行完当前事件循环的时候,settimeout中的回调会在下次(或者某一个)事件循环中被执行
1
2
3
4
5
6
7
8
9
10
11
console.log('setTimeout start');

setTimeout(function(){
console.log('setTimeout execute');
})

console.log('setTimeout end ');



// 输出 'setTimeout start' --> 'setTimeout end ' --> setTimeout execute

Promise

1
2
Promise 本身是同步的立即执行函数,当在执行体中执行resolve()或者reject的时候,此时是异步操作
会先执行then/catch(异步执行)等,等主栈完成后,才会去执行resolve()/reject中的方法,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    console.log('script start');
var promise1 = new Promise(function (resolve) {
console.log('promise1');
resolve();
console.log('promise1 end');
}).then(function () {
console.log('promise2');
})

setTimeout(function () {
console.log('setimeout');
})

console.log('script end');



// 输出 script start => promise1 => promise1 end =>script end =>promise2 => settimeout


主栈开始时从上到下执行,会先打印出 script start
遇到了promise函数,由于promise函数是同步立即执行函数,
因此会立即执行方法体内的程序,打印出promise1,
遇到了resolve()函数,跳过(会在then/catch之后执行) 打印 promise1 end.此时Promise()函数的执行 ,已经执行完毕, 主栈继续下面语句,遇到settimeout时异步执行, 然后会执行 script end,结束
,此时会执行下一个事件循环, 然后会打印出promise2,然后在打印出settimeout

async/await

1
2
3
async函数返回一个promise对象,当函数执行的时候,一旦遇到await就会先返回,等到触发的异步操作完成(await的函数),在执行函数体后面的语句,可以理解为,async让出了线程,跳出了async函数体,因此await函数后的语句相当于在then回调中执行.

await的含义为等待,也就是 async 函数需要等待await后的函数执行完成并且有了返回结果(Promise对象)之后,才能继续执行下面的代码。await通过返回一个Promise对象来实现同步的效果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
async function async1(){
console.log('async1 start');//2
await async2();
//等待 async2()返回之后 再执行下面的语句 ,
// 相当于将 console.log('async1 end')异步化了 相当于 console.log('async1 end')在then之后执行了

console.log('async1 end')//5
}
async function async2(){
console.log('async2')//3
}

//
console.log('script start');//1
async1();
console.log('script end')//4

// 输出:script start --> async1 start --> async2 --> 'script end --> async1 end