前言
昨天参加了字节跳动前端面试,整个过程感受颇丰(2024届校招)
我们在学习任何知识时,一定要知其然,知其所以然
昨天的面试基本上是0八股,0项目,问的都是一些比较深入的一些概念(我认为的),就比如说
个人技术栈声明:主要技术栈Vue,最近一个多月在学习React,没有看React相关的面试题
问题回顾
部分问题一
- 问:你最近在学习React,你觉得React相较于Vue给你带来哪些不同的体验?
- 答:编码格式上...,学习体验上...,架构模型上...,diff算法上...,巴拉巴拉....
- 问:你觉得为什么React要引入Hooks?
- 答:因为React内部开启了严格模式,this的指向是undefined,因此函数式组件不能使用refs和state这两个属性,以及组件的生命周期,因此在React16.8版本之前,函数式组件一般用的比较少,大部分都在用类式组件,而React16.8版本之后,引入Hooks的概念,就可以通过一些Hooks去在函数式组件中使用到refs和state以及生命周期,副作用等,而且Hooks的扩展性比较好
- 问:你觉得Hooks的引入就是为了解决this的指向问题吗?那我专门用一个变量去保存this,弄过来也可以用啊,为什么非要用Hooks呢?
- 答:我觉得函数式组件Hooks的写法相较于类式组件感觉更加轻便,更加的一体化,其他的确实不太知道为什么了(个人主观感觉也许,学的时间也比较短,都是根据自己的理解答的)
- 面试官:更加轻便这是编码上的主观感觉,其实React引入Hooks就是想要实现一种组件间状态的复用,Hooks可以让你从组件中抽离出状态逻辑,然后单独封装,不仅可以实现组件之间的状态复用,也可以单独对这些逻辑进行测试以保证稳定性。
- 我:嗷嗷嗷,明白啦,谢谢解答
部分问题二
- 问:你刚刚说了Vue是双向数据流,React是单向数据流,那为什么Vue还需要虚拟DOM,页面数据改变之后,内部数据就自动变化了啊,为什么还要用虚拟DOM再去渲染?
- 答:因为虚拟DOM可以避免直接操作真实DOM,对于没有变化的数据,就不做DOM的更新,避免频繁的去操作DOM的节点,减少页面频繁的回流与重绘,会提高一些性能(当然直接操作真实DOM节点肯定是最快的,我的意思是针对频繁操作来讲),而且假如Vue和React没使用虚拟DOM的话,我觉得这两个框架相当于是回到了Jquery的那个时代,之所以现在Vue和React前端框架这么流行,就是因为其不用程序员去大量手动的操作DOM节点,可以节省很多开发的代码(当然不只是因为虚拟DOM,还有组件化的思想)
- 问:那既然虚拟DOM这么好,为什么浏览器的底层不引入虚拟DOM,不去做这个优化呢?你有没有想过?
- 答:我觉得首先可能是因为,现在市面上有数以亿计的电脑,每个电脑上又安装了不同厂家,不同版本的浏览器(比如IE),如果引入了虚拟DOM,可能会造成一些兼容性的问题。再者,我觉得浏览器它本身是包含很多模块的,就比如说网络模块,导航模块,渲染模块等等,而且本身的真实DOM也做了很多优化,如果就单纯为了解决前端框架中频繁的视图更新带来的性能问题,对于像后端渲染,游戏开发等,其实不是那么有效。Emm....然后我觉得或许就是实现起来比较麻烦和复杂,因为还要考虑到多种平台,还有一些可移植性问题什么的,这是我觉得的一些可能的原因(因为之前确实没思考过这个问题)
部分问题三
- 问:你刚刚说HTTP是基于TCP协议的?是HTTP哪个版本开始基于TCP的?
- 答:是的,具体哪个版本开始的我也不太清楚(捂脸),好像是1.1版本吧
- 问:那HTTP可以基于UDP协议吗?
- 答:应该可以吧,我觉得
- 问:为什么?
- 答:我也不太清楚,不会这个(害)
上面就是三个问题的举例,面试官一般会由浅入深,一直问到你所懂得的极限,害
个人感悟
总结下来就是自己还是需要好好去弄懂一些知识点,在想问题的时候,要懂得发散思维,为什么要这么做?为什么不这么做?多问问为什么,这样,在好奇心的驱使下,你也会学习的更加深入,理解的更加透彻
因此自己想开一个专题,去记录一下前端中的那些“为什么”?比如说
- 为什么vue3要使用组合式API?
- 为什么vue3也引入了JSX语法?和React的又有什么区别呢?
- 为什么weakmap的键只能是对象(简答:引用类型便于垃圾回收)?那数组也是引用类型的,为什么不能用数组来作为weakmap的键呢?
大家也可以在评论区分享一些“为什么”的问题,互相解答,共同进步,加油!
哈哈,本帖是分享一下自己在前端路上的一些感悟,各位共勉,大佬勿喷
不论是前端,后端,网安,大数据,还是任何的一门学科,我们都应该抱着一个学习者的心态,多问问为什么,追本溯源,这样方能有更大的进步~