面经|两年前端第一次跳槽的面试记录

2,302 阅读10分钟

一、背景

个人情况

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

跳槽原因

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

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

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

  • 技术:趁年轻还是觉得应该多专研技术,倾向于技术团队一些;或者说这个团队会在业务中尝试新技术,比如vue3,比如monorepo...目前所在前端团队偏职能型,技术方面不是很重视
  • 💰:有点感觉自己的付出比收获要大,且一直低base担心可能会影响到后续没有竞争力

二、面试准备

个人优劣势分析

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

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

跳槽目标

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

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

准备简历

Tips:可以找身边厉害的大佬帮忙看看自己的简历,能发现不少问题 这个我就不写了,感觉我现在也写的不怎么好

复习规划

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

三、面试记录

小红书社区

一面

  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. 举例说明useCallback跟useMemo的使用场景
  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),
      time: Date.now(),
    };
    reqMap.set(url, res);
  }
}
  1. map数据结构怎么用,为什么可以用非字符串作为key值
  2. 手动实现一个模版字符串
// replace不会改变原字符串
// 正则表达式:. 匹配除换行符 \n 之外的任何单字符;* 匹配前面的子表达式零次或多次; ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
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 constrictor里面写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: '',
        count: 0
    }
    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. 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. 输入框获取焦点边框高亮
  2. 列表表头吸顶
  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. 项目中有遇到什么难以解决的问题、怎么解决的;针对项目详细问了不少
  2. code 我写了半个小时才写出来

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

字节

一面

根据简历问项目

二面 tiktok架构组

  • 根据简历问项目,主要针对以下聊
  • 算法:实现一个调度器
  • 算法:JSON转JSX

三面 tiktok直播组

根据简历问

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

HR

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

总结

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