阅前提示:这是一次失败的面试经历 :-1:,可作为参考
2021 - 01 - 26 电话面试
1 月 22 号接到 HR
的电话通知简历过筛,约定于 26 号电话面试。
1 月 26 号下午 5 点(极其准时)第一次电话面试,内容如下(有记忆的):
- 自我介绍
- 为什么要学前端,平时是怎么学前端的
- 会什么前端技术
- 有什么前端框架的使用
- 算法的掌握情况
- ...
15min左右,聊得很开心。
2021 - 02 - 18 视频一面
2 月 17 号 HR
告我准备视频面(还发了一堆前端资料给俺,简直良心),然而第二天(18 号)就要面试根本来不及看...
2 月 18 号下午 3 点 视频一面,使用的方式是牛客
,面试官是个前端小姐姐,内容如下(有记忆的):
-
自我介绍
-
怎么理解MVC
-
ECMAScript6语法新特性
//A:模板字符串、扩展运算符、箭头函数、promise对象(我tm就不该说这个)
-
你说了promise对象,说一下这段代码输出并解释一下
console.log('start'); setTimeout(() => { console.log('setTimeout'); }, 0); const promise = new Promise((resolve, reject) => { console.log('promise1'); resolve(); console.log('promise2'); reject(); }); promise.then(() => { console.log('promise3'); }).catch(() => { console.log('promise4'); }) console.log('end'); //我TM直接裂开,直接坦白不会,,
-
手撕代码
:数组去重const arr = [11,12,13,11,13]; //自己写的笨办法 const remove = (arr)=>{ let length = arr.length; let stack = []; for(let i = 0;i < length;i++){ if(stack.indexOf(arr[i]) === -1){ stack.push(arr[i]) } } return stack; } console.log(remove(arr)); //Q:有没有其他的解决方案 //A:记得有个api可以直接调用返回 filter //Q:用法还记得嘛 //A:(再次裂开)忘了。。。 //Q:还有Set用没用过 //A:(无敌裂开)是ES6新特性,但没用过
-
CSS 的定位方式,分别是怎么偏移的
//回答偏移的时候
absoulte
和relative
说反了,我tm还自信满满 -
解释一下 Flex 布局
//A:flex容器和flex元素,容器的排列方向和元素的grow,shrink,basis的含义
-
从浏览器输入url到渲染是怎么个过程
//A:url->dns->服务器解析请求->页面传递
-
解释一下 TCP 的三次握手,浏览器是怎么渲染
//A:解释seq,ack报文的传递以及浏览器渲染得三棵树(DOM,CSS,渲染树)
-
常见的请求有哪些,常见的报文头有哪些
//A:get put post delete...报文头有content-type(我接触最多的就只有这个),其他的不会
-
常见的状态码
//A: 200 400 500 404 300
-
有哪些方式会导致网页重定向
//A:(再次裂开,接触太少了)应该有HTTP缓存,,
-
解释一下 HTTP 缓存机制
//A:解释强缓存,协商缓存,304 ,报文头 Cache-Control
-
let
,const
,var
的区别,定义提升,块级作用域 -
手撕代码
:弹幕定位//一个对象数组,对象类型为 let obj = { time:number, value:String, }; //如何快速定位弹幕位置 //A:直接二分查会不会很快 //Q:(笑)那你说说二分的条件 //我直接就懵了,后来在提示下想起必须是有序的,然后面试官改题目为按时间排序 const objArr = [{time:1,value:10},{time:2,value:11},{time:3,value:12}]; conset find = (obj,key){ let low = 0; let high = obj.length - 1; while(low <= high ){ let mid = parseInt((high + low)/2); if(obj[mid].time === key){ return mid; }else if(obj[mid].time > key){ low = mid + 1; }else if(obj[mid].time < key){ high = mid -1; }else { return -1; } } return -1; } console.log(objArr[find(objArr)].value); //大概写了5分钟左右,面试官问你这是找了一个但如果我有多个相同时间的弹幕,全找出来怎么做 //(孩子一下就懵了,其实就是分治找边界,就是想不到,二分也是分治,gan) //讨论了一下时间空间复杂度
耗时接近 50
min,和面试官讨论完弹幕问题后,小姐姐直接告我一面过了,让我等一会开始二面。
2021 - 02 - 18 视频二面
大概 10 min 后二面就开始了,二面的面试官就是电话面我的,从头发就看出来是个无敌的大佬,和大佬交流就感觉自己无比的菜,所以内容记得不多:
-
前端了解的知识
-
手撕代码
:找到一棵树上的最大路径的和let obj = { value:number, node:node, } //当时思路是DFS + DP (bad idea) //在深度优先搜索的基础上通过DP状态转移方程减少值运算,但卡在找不到状态转移方程,只能在上面写了一个DFS算法 //15min的时候面试官不断的摸着脑袋,然后我就放弃了,和面试官说了说自己的想法,然后面试官把题目改成找到这棵树的所有值之和。
面完在 leetcode 上找到了这道题 https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/ -
手撕代码
:找到树上所有节点值之和//这道题就很easy //在上一道 DFS 的基础上把所有节点值加起来就行,这个办法可以跑通,但比较复杂 let problem = []; const dfs = (tree)=>{ let nodes = []; if (tree.node != null) { let stack = []; stack.push(node); while (stack.length != 0) { let item = stack.pop(); nodes.push(item.value); let children = item.node; for (let i = children.length - 1; i >= 0; i--) stack.push(children[i]); } } return nodes; } const result = ()=>{ let result = dfs(problem); let sum = 0; for(let i=0;i
leetcode 有很多类似的题目 938题,112题,129题,... -
页面拖拽事件
//我见都没见过这个,真胡言乱语瞎答,说什么修改width....真小丑没跑了
面后查到 是 **drop** 属性 arget.addEventListener('drop',func ) -
假设某一属性有n个计量单位,最少保存计量单位转换所需的空间
//A:是不是用有向图保存 这样是 2n 个 //面试官居然说你大脑换算单位用图啊 //讨论了半天,最后回归到了一个环(gan,这还不是图)也就是 n
-
怎么看待前端工程化
-
有关webpack的问题(没问loader很出人意料)
-
数据库第一范式,设计和范式的关系
-
有什么想问的,以及给了我一堆建议,比如说赶紧学VUE....
二面历时将近 60
min,然后什么信息都没给我,,,就,,结束了......
总结
19 号上午收到了字节发来的面试评价,问了一字节老哥,说收到评价没通知大概率是凉了
尽管没通过,但还是先吹一波字节,面试官是真不错,态度都十分不错,尤其是一面的小姐姐,同时字节的效率也是真滴高。
最后有关 前端 面试建议如下:
- 公司与公司之间的差距太大,千万不要小看字节,,,
- 面试过程千万不要给自己挖坑,,,面试一定要说自己会的,,,
- 好好学基础,目前来说前端最基础的就是
ES6
语法,当然也可以学习typeScript
语法,css
感觉也挺重要的 - 多看书,多实现效果(说好的要看完
《ES6标准入门》
看了两章就吃灰了) - 必须掌握一种框架,可以是
MVVM
框架 也可以是VUE
,那位老哥说大概率凉在框架上了。 UI
库也得掌握一种bootstrap
是最基础的,多尝试santd
或者elementUI
这些第三方组件库leetcode
一定要刷hard
级别,我基本上hard
难度都忽略了。。- 数据结构,计算机网络,操作系统,这三门课的知识千万不能忘!
Comments | NOTHING