前端面试题目整理学习

77 阅读2分钟

第 1 题:写 React / Vue 项目时为什么要在列表组件中写 key,其作用是什么?

vue和react都是采用diff算法来对比新旧虚拟节点,从而更新节点。在vue的diff函数中(建议先了解一下diff算法过程)。
在交叉对比中,当新节点跟旧节点头尾交叉对比没有结果时,会根据新节点的key去对比旧节点数组中的key,从而找到相应旧节点(这里对应的是一个key => index 的map映射)。如果没找到就认为是一个新增节点。而如果没有key,那么就会采用遍历查找的方式去找到对应的旧节点。一种一个map映射,另一种是遍历查找。相比而言。map映射的速度更快。

主要是为了提升diff【同级比较】的效率。自己想一下自己要实现前后列表的diff,如果对列表的每一项增加一个key,即唯一索引,那就可以很清楚的知道两个列表谁少了谁没变。而如果不加key的话,就只能一个个对比了。

第 3 题:(挖财)什么是防抖和节流?有什么区别?如何实现?

防抖:短时间内多次触发只执行最后一次,或者开始第一次执行,后面不执行

节流:在规定时间内,1s执行一次或者根据定的时间去执行

防抖

function debounce(fn,delay){
    let timer = null;
    return function(){

        if(timer==null){
           timer = clearTimeout(fn);
        }
        timer = setTimeout((fn,delay);
    }
}

节流

function thorttle(fn,delay){
    let valid = true;
    return function(){
         if(!valid){            return false;
        }        valid = false;
       
        timer = setTimeout(()=>{fn();valid=true;},delay);
    }
   
}

第 10 题:(头条)异步笔试题

请写出下面代码的运行结果

async function async1() {
    console.log('async1 start');
    await async2();
    console.log('async1 end');
}
async function async2() {
    console.log('async2');
}
console.log('script start');
setTimeout(function() {
    console.log('setTimeout');
}, 0)
async1();
new Promise(function(resolve) {
    console.log('promise1');
    resolve();
}).then(function() {
    console.log('promise2');
});
console.log('script end');




打印如下:
script start
async1 start
async2
promise1
script end
async1 end
promise2
setTimeout