【社招面经】22年裁员潮下的前端面经分享

今天给大家带来一篇社招面经。

近期大厂裁员的风声不断,作者也是在这段时间进行了面试,目前已入职Tiktok。他记录了在这6个公司的面试经历,大家一块来看看吧。

一、背景

个人情况

  • 20届前端,正式工作经验到22年7月满两年,带上实习经验差不多三年(猝不及防感觉自己要老了)
  • 20届京东校招生,晋升过2两次,绩效中等偏上
  • 在职期间待过两个部门,京东科技&京东零售,在京东科技遇见了给我很多指导的mentor、让我在刚开始工作的时候有了一些工程化的思想,独立带外包负责过项目;而在京东零售,参与过很多项目、跟主站打通的商城项目,有幸主管给机会参与&推动一些团队基础建设

跳槽原因

Tips:跳槽前可以先想一下,首先是check下自己到底是否应该跳槽了,而不是单纯的干的不爽,换个工作能否解决现在的问题;还有就是一般面试hr面都会问这个,需要准备下

主要有三个:

  • 业务

目前部门所负责的业务不是很有发展前景,个人不太看好,且自身工作时间不长,处于一个快速学习成长的阶段,不太允许我花长时间去等一个好项目。

举一个我身上真实的例子:21年8月我从科技异动到零售的时候,虽然当时我选择异动有各方面原因吧,比如我的mentor离开了京东,但是绝大部分原因是我不看好当时所做的业务,当时主管还有挽留,我比较直,直接说了不太看好业务,主管当时还说我的目光短浅了,但是22年整个二级部门的业务都没了,之前那个组的前端同事要么是异动到其他部门,要么是离开了,就很被动吧...其实无关对错、无关谁看得准,首先得需要自己认可这份业务,才能干的开心

  • 技术

趁年轻还是觉得应该多钻研技术,倾向于技术团队一些;或者说这个团队会在业务中尝试新技术,比如vue3,比如monorepo...目前所在前端团队偏职能型,技术方面不是很重视

  • 收入

有点感觉自己的付出比收获要大,且一直低base担心可能会影响到后续没有竞争力。

二、面试准备

个人优劣势分析

Tips:可以提前分析个人优劣势,针对性制定面试准备计划

  • 优势:有多项专利,有不错的项目亮点,工程化(比如微前端、monorepo等)实践比较多,0-1做过组件库、团队lint规范
  • 劣势:框架不够深入(一直在vue、react两者中切换);算法没有刷过;工作经验相对不足(不到两年)

跳槽目标

Tips:这个也挺重要的,投递的时候看好业务、部门;公司一般都只能在一个流程里面,结束流程才能面其他的部门,且都是有面评的,最好是一次性选择好面完

  • 公司:大厂
  • 业务:感兴趣
  • 团队:前端团队,技术氛围不错
  • 个人:有机会独立负责一些“大”事情,毕竟社招了

准备简历

Tips:可以找身边厉害的大佬帮忙看看自己的简历,能发现不少问题

这个我就不写了,感觉我现在也写的不怎么好。

PS:这儿再给”前端面试题宝典“的增值服务:“简历指导”和“模拟面试“打波广告,有需求的小伙伴,可以联系小助手(微信号:interview-fe)了解详情哦~

复习规划

根据有劣势分析,所以我将重点放在框架上,主要准备了react的理论知识,以及刷常见的算法

三、面试记录

下面进入面经分享环节

欧科云链

一面

  1. hooks为什么不能放在if里
  2. useContext
  3. useMemo
  4. 自定义hook
  5. 数字精度问题
  6. 检测数据类型
  7. Promise链式调用,以下分别输出什么
Promise.reject(1)
        .then((num) => {
            console.log(num);
        }).catch((num) => {
            return num + 1;
        }).then((num) => {
            console.log(num);
        });
// 2
Promise.resolve(1)
        .then((num) => {
            console.log(num);
        }).catch((num) => {
            return num + 1;
        }).then((num) => {
            console.log(num);
        });
        
// 1
// undefined
  1. 使用CSS实现:输入框获取焦点时边框高亮(使用:focus
  2. 列表表头吸顶(使用position: sticky;
  3. 一个父级div,有两个子div,一个固定高度,另一个高度填充满
  4. 手写算法

[{ price: 1, size: 2 }, { price: 2, size: 2 }, { price: 1, size: 1 }]] 依次按照price、size降序排序

function sort(arr{
    for (let i = 0; i < arr.length; i++) {
        for (let j = i + 1; j < arr.length; j++) {
            if (arr[i].price === arr[j].price && arr[i].size < arr[j].size) {
                [arr[i], arr[j]] = [arr[j], arr[i]];
            } else if (arr[i].price < arr[j].price) {
                [arr[i], arr[j]] = [arr[j], arr[i]];
            }
        }
    }
    return arr;
}

二面

  1. 问简历中做多端组件库做了哪些组件,有没有遇到什么问题
  2. 重绘&重排,些操作可以导致
  3. 浏览器渲染过程
  4. component、PureComponent 区别
  5. 以下输出
var name = "global";
var obj = {
    name: "ngnce",
    log:()=> {
        console.log(this.name);
    }
}
obj.log()

var obj = {
    name: "ngnce",
    log:()=> {
        console.log(this.name);
    }
}
obj.log()
  1. 哪些样式可以继承
  2. e.target 和 e.currentTarget 有什么区别
  3. 图片懒加载路由懒加载实现原理是什么
  4. hooks 你们实践的经验是什么
  5. 手写深拷贝,循环引用问题如何解决

小红书社区

一面

  1. 挨个问简历项目:微前端怎么做的,性能优化怎么做的,UI&交互统一怎么做的;感觉像聊天大概半小时
  2. 以下输出是什么,把async、await用promise怎么改,async、await的本质是什么
console.log(1);

let b = new Promise((resolve, reject) =>{
  console.log(2);
}).then((x) => {
  console.log(3);
})

setTimeout(() => {
  console.log(4)
}, 100);

let c = async() => {
  setTimeout(() => {
    new Promise((resolve, reject) => {
      console.log(6);
    })
  }, 0);
  let x =  await new Promise((resolve, reject) =>{
    console.log(5);
    resolve(7)
  })
  console.log(x);
  console.log(8);
}

console.log(9);
c()
console.log(10)

// 1
// 2
// 9
// 5
// 10
// 7
// 8
// 6
// 4


let c = () => {
  setTimeout(() => {
    new Promise((resolve, reject) => {
      console.log(6);
    });
  }, 0);
  new Promise((resolve, reject) => {
    console.log(5);
    resolve(7);
  }).then((res) => {
    console.log(res);
    console.log(8);
  });
};
  1. 网络请求封装怎么做
  2. 会二叉树嘛,直接说不会,面试官说那考考一个简单的算法,青蛙跳
  3. 实现 Promise.all
  4. Vue发请求在哪个生命周期
  5. React 17版本有什么特性
  6. Class写法与hook写法的优劣比较
  7. hooks有什么问题吗

二面

  1. 做过哪些工程化相关的东西
  2. 为什么要用 monorepo ,有没有遇到依赖相关的问题,比如隐式依赖
  3. webpack构建打包自己做过哪些事情
  4. react常用的hooks自定义了哪些hooks
  5. 举例说明 useCallbackuseMemo 的使用场景
  6. 写一个括号的题
  7. 职业未来规划

三面

  1. 简历微前端相关
    • 为什么要用微前端
    • 你们用的微前端是什么
    • 除了qiankun你还知道其他解决方案嘛
    • 京东的micro-app跟qiankun有什么不同
    • 为什么没用京东的
  2. 能说一个你觉得比较有意思的专利嘛
  3. 算法题

HR

  1. 为什么要跳槽
  2. 目前薪资待遇
  3. 绩效怎么样
  4. 平常加班嘛,对小红书大小周怎么看
  5. 有没有其他面试流程,面的什么部门,什么进度
  6. 跳槽(选择offer)主要考虑哪些方面
  7. 有没有很多朋友、同学在北京

猿辅导智能硬件

一面

  1. 做过哪些性能优化
  2. webpack渐进式聊
  • webpack常见配置参数是什么?
  • 常用的loader有哪些?
  • 有没有自己写过一个plugin,暴露的生命周期有哪些清楚嘛
  • webpack的原理,从执行到结束的过程
  1. Babel的原理是什么
  2. 手写可以缓存的接口封装
// 考察Map用法
function httpRequest(url, options{
  return Promise((resolve, reject) => {});
}

const reqMap = new Map();
const waitTime = 1000;

function request(url, options{
  if (reqMap.has(url)) {
    const req = reqMap.get(url);
    if (Date.now() - req.time < waitTime) {
      return reqMap.get(url).response;
    }
  } else {
    const res = {
      response: httpRequest(url, options),
      timeDate.now(),
    };
    reqMap.set(url, res);
  }
}
  1. Map数据结构怎么用,为什么可以用非字符串作为key值
  2. 手动实现一个模版字符串
// replace不会改变原字符串
// 正则表达式:. 匹配除换行符 \
 之外的任何单字符;* 匹配前面的子表达式零次或多次;? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
function template(str, context{
  return str.replace(/\\$\\{(.*?)\\}/g, (match, key) => {
    return context[key]
  });
}
  1. 从设计理念上说一下Vue VS React
  2. 小程序了解的多吗
  3. 前端职业规划
  4. 你对前端的看法

二面

自我介绍刚开始,临时有事,直接跟面试官说抱歉结束面试了,我不礼貌了,希望那位面试官看到了能原谅我😭

网易有道——智能硬件

一面

  1. 以下是否有语法错误,输出结果是什么
const arr = [1,2,3,4,5// 无语法错误
const arr1 = arr.push(6// 6
  1. 在react constructor 里面写 setTimeout,this指向什么
  2. 如何自己设计一个image,实现懒加载的组件
  3. 如何实现页面缓存,keep-live 实现原理,对应的react如何实现
  4. 做过哪些首屏优化
  5. 以下能看到页面变化嘛
document.body.style = 'background: red' 
document.body.style = 'background: black'

二面

  1. 工作中遇到过什么技术难题解决不了
  2. 微前端是怎么实现的,跟qiankun有什么不同
  3. 说一下react跟vue的区别
  4. 做过什么性能优化
  5. 找出数组中出现次数最多的字符串
const getMostStr = (arr) => {
    let obj = {}
    let mostObj = {
        str'',
        count0
    }
    for (let i = 0; i < arr.length; i++) {
        if (obj[arr[i]]) {
            obj[arr[i]]++
        } else {
            obj[arr[i]] = 1
        }
        if (mostObj.count < obj[arr[i]]) {
            mostObj.count = obj[arr[i]]
            mostObj.str = arr[i]
        }
    }
    return mostObj.str
}
  1. 实现'get-element-by-id' -> 'getElementById‘
const transStr = (str) => {
    const arr = str.split("-")
    let res = arr[0]
    for(let i = 1; i < arr.length; i++){
        res += arr[i].slice(0,1).toUpperCase() + arr[i].slice(1)
    }
    return res
}

微软北京

一面

  1. 项目中有遇到什么难以解决的问题、怎么解决的;针对项目详细问了不少
  2. code 我写了半个小时才写出来

之前约的是电话面试,由于没提前看邮箱,我以为会打电话过来,最后面试官打电话提醒我的,有点尴尬,就是说面试千万不要迟到!加上code半小时,果不其然挂了

字节

一面

根据简历问项目

二面 tiktok架构组

  • 根据简历问项目,主要针对以下聊
    • 团队怎么落地的
    • 如何衡量lint对代码规范的效果,比如说规范了百分之多少的代码(可以用 CI、CD这种,我没有想到)
    • 目前这个规范还有什么可以改进的嘛
    • 多版本怎么管理
    • 私有化怎么更新
    • 多工程公共模块处理方式
    • lint规范怎么做的
  • 算法:实现一个调度器
  • 算法:JSON转JSX

三面 tiktok直播组

主要根据简历问

  1. 组件库
    • dropItemMenu,想实现一个用户点击非浮层区域也能关闭,怎么实现
    • 介绍一个你觉得最难的组件,如何设计并实现的(由于这块没有总结过,回答的明显有点磕巴,面试官根据组件延伸了不少问题)
    • 你在组件库承担的什么角色(有点紧张,没有把自己做的事情讲出来)
  2. 移动端熟悉吗
  3. webpack性能优化
  4. tree shaking原理
  5. external与dll区别
  6. 没有问算法了

HR

  1. 没有让自我介绍,问对面试流程体验怎么样
  2. 跳槽你会考虑哪些
  3. 那现在你面试字节的这个岗位,符合你的预期吗
  4. 你是怎么判断出符合的
  5. 看你不是计算机专业为什么做前端(其实我是学的计算机,只是在一个文科学校学的计算机,每个hr都要这么问我>_<)
  6. 不是有技术鄙视链嘛,为什么做前端而不是后端啥的
  7. 绩效怎么样

总结

  • 简历非常重要,大部分都是根据简历来问,写上去的东西一定要想好怎么说,有些即便你做过很多,但是没说出来也很可惜
  • 八股文就适当的准备就ok,其实这次的跳槽感觉也是对自己知识体系的一个梳理,慢慢发现,从业越久对各个知识点贯通的越好,相比八股文更重要的是实际工作中的解决的问题,有无亮点
  • 算法,还是得准备,算法没写出来,感觉基本就挂了
  • 面试需要自信,不自信面试效果不好,这个是我做的不够的,可能一部分是对自己技术心虚、菜,还有一部分原因是今年的大环境,会让我有点畏手畏脚,害怕没机会
  • 面了几家后其实会感觉面试有些累,就是重复讲一些东西的感觉,面不动的感觉,所以面了几家之后我就放弃了一些基本我不会考虑的公司的面试,比如搜狐、猿辅导、欧科,其实给到我的好的面试机会不多,大厂除了字节跟微软,其他投递了都没有面试邀请,应该是今年环境不好加上我资历浅,直接简历pass了?建议面试安排的松散一点,选择性面试即可

面试官点评

其实从分享的面经中,可以看到不同的公司,几乎都对项目经验比较关注,项目相关的问题较多。我们在面试准备的过程中,一定要好好准备简历,突出自己熟悉的领域,引导面试官往相关方向提问。

还有一点是算法题,这几家公司的面试中都有涉及到,大家记得多刷LeetCode。

原文作者:jjjona0215

原文链接:https://juejin.cn/post/7100982054996672543