面试复盘 | 字节前端-抖音电商1、2、3面试
字节前端面经
面的是抖音电商的前端开发(校招)
之前再牛客上看了些面经,帮助还是挺大的,自己也也三面过了,再等通知,许愿offer的同时也把这次的面经记录下,回馈牛客的朋友们
2021-07-29(周四 上午11点) 一面
一面是一个小哥哥,很帅,也很温和,面试体验非常好
面试时间 1小时10分钟左右
面试链接:牛客面试平台
JS相关
1 作用域相关的,让说输出
分析,默认定义的变量、变量提示、var、let区别
var a = 1; (() => { console.log(a); a = 2; })(); 输出 1,查找到全局 a var a = 1; (() => { console.log(a); var a = 2; })(); 输出 undefined,变量声明提升 var a = 1; (() => { console.log(a); let a = 2; })(); 输出 报错
2 原型相关
分析+讲述原型和原型链部分(显示原型,隐式原型),
window.name = 'ByteDance'; function A () { this.name = 123; } A.prototype.getA = function(){ console.log(this); return this.name + 1; } let a = new A(); // window let funcA = a.getA; funcA(); // ByteDance1
3 异步同步
主要是分析过程,给他讲分析+原理
setTimeout(() => { console.log(1); }, 0); setInterval(() => { console.log(2); }, 0); console.log(3); new Promise(() => { console.log(4); });
3 4 1 2(无限循环)
setTimeout(() => { console.log(1); }, 0); setInterval(() => { console.log(2); }, 0); console.log(3); new Promise(() => { console.log(4); }); while(5){ console.log(5); }
3 4 5(循环)
计算机网络
网络分层模型:OSI和TCP/IP 都讲了下
HTTP和TCP的关系
TCP和UDP区别
TCP 流量控制 和 拥塞控制
这里举例 输入一个url发生了什么?重点再HTTP和TCP这一块,杂着讲了DNS和DNS缓存这一块
HTTP的报文结构:请求报文、响应报文,以及各自首航的格式、还说了一些常见的headers
http协议版本:0.9、1.0, 1.1,2.0 说下区别,没说出来..
手撕代码
1 最长回文子串
/** * @param {string} s * @return {string} */ var longestPalindrome = function(s) { // 最短回文子串问题: const n = s.length; if(n < 2) return s; function getMax(l, r){ while(l >=0 && r < n && s[l] === s[r]){ l --; r ++; } return { l: l+1, r: r-1 } } let start = 0, end = 0; for(let i = 0; i < n; i ++){ let obj1 = getMax(i, i); let obj2 = getMax(i, i+1); let maxObj = obj1.r - obj1.l > obj2.r - obj2.l ? obj1 : obj2; if(maxObj.r - maxObj.l > end - start){ start = maxObj.l; end = maxObj.r; } } return s.slice(start, end+1); };
这题,一开始用的暴力做法,就是枚举每个子串,判断是否是回文,更新最长回文子串,写到一般发现时间复杂度太高,就问面试官能不能提示,根据提示,重新梳理了思路,说完思路,就下一题了
2 求最终路径
cd . cd .. cd /a/b/c/../../ -> /a cd /a/b/c/../././././../ -> /a
// 用栈 // 输入: 一个包含.. 和. 的相对路径 // 输出: 一个绝对路径 function f(s){ const stk = []; // 先分割为数组 const arr = s.split("/") // console.log(arr); // console.log(arr); //入栈 for(let i = 0; i < arr.length; i ++){ if(arr[i] === '..') stk.pop(); // 出栈一个路径 else if(arr[i] === '.' || arr[i] === '') continue; else stk.push(arr[i]); } // console.log(stk); if(stk.length === 0) return '/' // let res = '/'; res += stk.join('/'); return res; } // const s = 'a/b/c/.././' /a/b // const s = 'a/../../..' '/ const s = '/A/B/../C/D/../E' const res = f(s) console.log(res);
最开始用的dp写的,空间复杂度有点高,面试官引导我优化,一个变量而不是一个dp数组,优化空间,面试官说还有别的方式嘛,一种数据结构更加合适,想到栈,把思路梳理,和面试官说完,就结束了
Vue
问了一些vue相关的,主要有
Vue router 用过没?
路由模式、hash和history
axios? 你怎么用的,底层知道嘛,知不知道别的(我答了Ajax) 说了XMLHttpRequest的用法
最后提了一下fetch(让我展开,不知道就没问了)
网上看到了一些:
关于Ajax XMLHttpRequest、axios、fetch
ajax =》对原生XML的封装,还支持JSONP ()
fetch 号称是ajax的替代品 =》 api 基于Promise =》链式调用的方式 =》 fetch不是ajax的进一步封装,而是原生js,没有使用XMLHttpRequest对象。
axios的话 本质上也是对原生XHR的封装,只不过它是Promise的实现版本
其他
自我结束
为啥学前端
如何学习前端
学习前端多久了
学习前端的方式
反问 校招注重那些,需要补强的
向面试官致谢
2021-08-04 周三上午11点 二面
因为实验室有事情,二面约的第二周周三,还是上午11点
面试时常:55分钟左右
如果说一面是问答模式,二面的面试官的话有点小高冷,全程是你说,他偶尔问一问
HTML/CSS
一面没有问这个,结果我疏忽了,二面答的不是很好
块级元素和内联元素,能不能说全?
BFC、形成BFC的条件,BFC的应用
JS
数据类型 =》 基本、引用 =》typeof 和 instanceof
异步同步 =》 event-loop 机制 =》 dom渲染 =》 宏任务、微任务
栈、堆? =》 举例=》 执行栈
java和JavaScript区别?聊一聊自己的理解
webpack
你学的比较深入的点有?我说最近再看webpack就开始webpack了
webpack的基本概念?作用是啥?
聊了一些module和里面的一些常见loader(url,file,css,style) ,
插件知道嘛?简单说了一下, htmlwebpackplugin
分割?多入口 =》merge,
抽离CSS、=》MiniCssExtractPlugin.loader,
抽离公共代码=》 为啥抽离,第三方和公共模块 =》 splitChunks
WDS webpackDevServer 聊了一下, 热更新? 配置 hot = true
聊了下 babel,babel-ployfill,babel-runtime (为啥需要babel,babel-ployfill又干了啥?,babel-runtime知道嘛?)
网络
又讲了一个例子,客户端到服务器之间的通信,这里讲到了缓存
缓存=》关键的状态码403(提了一嘴状态码) =》 协商缓存=》强制缓存
讲完之后,整个强制缓存和协商缓存一起讲了下,里面说了 cache-control , last-modify ,etag,说了各个的含义,取值
这里面试官问了个问题:与etag对应的header是啥?当时有点懵,忘了,应该是if-none-match
其他
自我介绍
怎么学习前端,多久了
你觉得你学的最好的是啥,聊一聊你学习的方法
反问:面试有哪些不足,答:缺少亮点
向面试官致谢
手撕代码
求1-1000内的完数
一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数
//line=readline() //print(line) console.log('Hello World!'); function is(num){ const a = []; for(let i = 1; i < num; i ++){ if(num % i == 0){ a.push(i); } } let res = 0; a.forEach( val => { res += val; }) return res === num; } function f(){ const res = []; for(let i = 1; i <= 1000; i ++){ if(is(i)) res.push(i); } console.log(res) } f()
思路很清晰,分析完毕后,写完后和面试官说了思路,结果发现没有输出,尴尬,没有写log也没有调用f函数,补上后输出,面试官说ok
2021-08-06 周五上午11点 三面
如果是一面是问答,二面是你说,他提问,三面就是相互间聊,感觉还是挺不错的
三面也比较特殊,一开始就是项目,我以为我那个简单项目会一直没有人问呢
三面时间:一个小时左右
项目
聊聊你的项目
项目使用了那些技术、为啥使用这些技术
是用的vue-cli?vue的版本是?脚手架版本?
聊下脚手架创建的项目的结构 ,为啥是这个结构 =》很多组件,你怎么去管理,全部一个文件夹呢? =》你说分目录,大概的依据是啥
项目是spa嘛?多少路由?=》父子路由 =》异步组件加载
了解过优化嘛?
讲了很多,分渲染优化和打包优化说的(js,style放置的位置,使用缓存、CDN、webpack打包时候的tree-shaking),面试官说还可以,优化分类可以从线下、线上、...很多方面去讲,除了我讲的,还有网络优化和其他啥的
手撕代码
股票题
/** * @param {number[]} prices * @return {number} */ var maxProfit = function(prices) { let min = prices[0]; let res = 0; for(let i = 1; i < prices.length; i ++){ res = Math.max(res, prices[i] - min); if(prices[i] < min){ min = prices[i]; } } return res; };
买卖一次股票的最大收益,分析了下,讲了思路,代码写太快了,面试官问我是不是之前遇到过,我说是,他说那加个题
节流
出了一个工程题,节流,先说了防抖和节流的概念,以及区别,让我写节流,这里问我需不需要再了解下,结果举例举得不是很好,我更糊涂了,然后根据自己以前的的记忆写的。
// throttle 函数 function throttle(func, wait){ let begin = 0; return function(){ let context = this; let args = arguments; let cur = new Date().getTime(); if(cur - begin > wait) { func.apply(context, args); begin = cur; } } }
这个有缺陷,你能看出来嘛?不知道=》面试官解释了下
其他
学前端多久了?怎么每轮都问 。。。,我就一股脑读说了,学习时间、方法、方式
知道shell嘛?不知道。。cd命令? 原来是问Linux命令,讲了一堆
查看进程?杀死进程 ps 和 kill
开发工具, 用的vscode,命令行用的cmd,
git知道嘛?用过吗,说了下项目中使用的基本命令,commit status checkout log pull push branch
如何不影响远程代码,将本地代码回顾到之前的一个状态? git checkout 某个hash值
git stash 暂存区的概念
反问:业务有什么特殊的嘛,使用的技术栈
没说啥,就是他的组会累一些,react
聊天,最后聊了下,也没说啥
致谢,最后一轮技术面,致谢了面试官还有一轮二轮的面试官
小总结
1 字节大公司效率是真快,我其他投的流程还没开始。。。
2 面试官人都特别好,我说我学的基本是基础的知识,基本也是从上面问
3 校招感觉主要表现自己的潜力把,多和面试官聊,不会也寻求一下提示,多展示自己的思考,面试官能看到的
4 编码能力挺重要的,虽然不一定很难,但三轮基本都有手撕代码,无论是会不会,思路一定要清晰,要和面试官分析,不行就先暴力的做,再想优化
5 面试可以的话,聊聊天,表现出自己的积极,可能会印象好一些,不要太沉闷
最后的最后,许愿能够拿到offer!!!!,也感谢hr小哥哥那天给我突然打电话,问我要不要进入流程,本着试一试的心态,走到了三面结束,感觉经过了面试自己也更看清了自己把,加油!!!,也祝其他小伙伴们加油!!!
补充提问
感觉自己有几个问题答的不太好,也想问问如何去答这一块的问题,主要有下面几个
- 对项目工程的理解,比如vue-cli脚手架创建的各个文件模块的作用,存在的必要性的时候,当时答的比较乱,也不够系统
- http缓存相关的header,当时答了强制缓存和协商缓存,但是对应的header答还不够细节完整。
- 关于手写代码,如何以一种比较好的方式去做,让面试官根据满意。我面试的时候是 先分析=》讲解思路=》手写=》在分析
- 计网这一块,尤其是拥塞控制和流量控制答的感觉不到核心,想知道这两块面试官希望我们回答的核心是啥,需要掌握那些