知乎社招前端面试(一面)

基础题

  • 闭包;
  • 回流和重绘?如何规避带来的性能开销?;
  • cookie的samesite属性;
  • 浏览器缓存策略;
  • 强制缓存和协商缓存状态码区别;
  • 箭头函数和普通函数区别;
  • 状态码301和302区别
  • React v15和v16的区别 生命周期函数;
  • fiber理解;
  • 兄弟组件间通信方式;
  • context使用;
  • 受控组件和非受控组件区别;
  • webpack优化点;
  • hapyPack组件共享进程设置;
  • webpack增量更新设置;

笔试题

  1. 输出结果:
console.log(1);
setTimeout(() => {
    console.log(2);
});

new Promise((resolve) => {
    resolve();
    console.log(3)
}).then(() => {
    console.log(4);
}).then(() => {
    console.log(5);
});

console.log(6);
// 1,3,4,5,6
  1. a为何值时下述表达式成立:
var a = ?
if (a==1 && a==2 && a==3) {
console.log(1)
}
// a = {i:1, valueOf: () => a.i++}

3.手写Promise.all

// 思路解析
// 1.Promise.all()返回的肯定是一个promise对象,所以可以直接写一个return new Promise((resolve, reject) => {})(这应该是一个惯性思维)
// 2.遍历传入的参数,用Promise.resolve()将参数"包一层",使其变成一个promise对象
// 3.关键点是何时"决议",也就是何时resolve出来,在这里做了计数器(count),每个内部promise对象决议后就将计数器加一,并判断加一后的大小是否与传入对象的数量相等,如果相等则调用resolve(),如果任何一个promise对象失败,则调用reject()方法。
// 一些细节:
// 1.官方规定Promise.all()接受的参数是一个可遍历的参数,所以未必一定是一个数组,所以用Array.from()转化一下
// 2.使用for…of进行遍历,因为凡是可遍历的变量应该都是部署了iterator方法,所以用for…of遍历最安全

Promise.prototype.myAll = function(iterators) {
    // 可遍历参数转换为数组
    const promises = Array.from(iterators);
    const len = promises.length;
    // 执行成功标识
    let count = 0;
    let resultList = [];
    // 返回一个Promise对象
    return new Promise((resolve, reject)=>{
        promises.forEach((p,index) =>{
            Promise.resolve(p)
            .then((result)=>{
                count++;
                resultList[index] = result;
                if(count === len){
                    resolve(resultList);
                }
            })
            .catch(e=>{
                reject(e);
            })
        })
   })
}
#面经##知乎##社招##前端工程师#
全部评论
笔试题第一题错了 应该是1 3 6 4 5 2
4 回复 分享
发布于 2021-04-03 17:03
原来还有笔试题的
点赞 回复 分享
发布于 2021-03-26 11:33

相关推荐

牛客737698141号:他们可以看到在线简历的。。。估计不合适直接就拒了
点赞 评论 收藏
分享
5 44 评论
分享
牛客网
牛客企业服务