头条前端面经
三面结束在头条池子里面呆了一个月了:),今天来复盘一下面经,问的一些基本的JS知识就不说了,说一些遇到的不常见的问题。
一面:
1. 实现一个LazyMan。需要控制事件队列,csdn上面很多例子,木易杨前端也有这一题,直接百度搜索就有答案,考的是JS的事件队列机制。
二面:
1. 实现一个EventBus,这个好像是头条必面的题!春招的时候也面到过,当时写不出来,这次信手拈来了。
1. 实现一个搜索栏键入时自动匹配显示搜过的内容。我当时想法就是用localStorage存用户搜索过的数据,搜索栏监听keyup的时候要做一个防抖,在键入结束之后去匹配查找搜索过的数据,关于匹配的机制,我当时想过用遍历,用正则,面试官都不满意,确实数据多的时候时间复杂度也高,后来面试官说可以用一个Map去维护,在每次搜索完一个数据的时候,记录到Map中,我想面试官的意思可能就是直接用key去记录那个字符串。
2. 实现两个框框在超过最小距离的时候自动粘附在一起,每个框框有自己的一个锚点,也就是本身在画布内的position。因为有用cocos做小游戏开发,当时和面试官讨论了一通:),后来二面给过了。
三面:遇到了个大佬,压力面,应该是这面凉了,压力面的时候无论你怎么回答,他都给你的一种感觉就是:我不满意你的答案,你没戏了,会让自己很没信心去回答,会质疑自己的答案。压力面还是得多经历,才能扛得住。
1. 第一题问的很基础,但是挖的深,就是for循环十次用var声明变量里面嵌套setTimeout,setTimeout里面有console.log(i),最终输出什么。10个i,这没问题,那怎么去解决这个问题?把var换成let,那为什么换成let就可以?因为let有块级作用域,每次let都是一个新的变量,且只在自身块级作用域内有效,for循环每一次都是一个块级作用域,let没有变量声明提升,而var存在变量声明提升。那既然每一次都是新的,怎么知道let i 该赋值多少?我....一脸黑人问号????后来恶补了一下阮一峰的es6,原话是这样说的:“上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量。你可能会问,如果每一轮循环的变量i都是重新声明的,那它怎么知道上一轮循环的值,从而计算出本轮循环的值?这是因为 JavaScript 引擎内部会记住上一轮循环的值,初始化本轮的变量i时,就在上一轮循环的基础上进行计算。” emmmm大佬你赢了
2. 问的加密问题,说看我项目里面做的游戏,那前后端数据交互时那些敏感数据怎么办。对称加密和非对称加密,Alice和Bob你值得拥有。当时我心态已经有点不稳定了,这个没答好。
3. 后来要实现一个算法,让我直接敲代码。判断一个画布里面有多少个黑点,不管这个黑点是大是小。后来转换成这样一个数据结构,在一个二维数组中,只有0和1,找出所有1相连的区块。
当时就直接去遍历,每次找到一个1,黑点数量就加一,然后开始递归,找到该位置的上下左右位置,如果还是1继续递归并用另外一个二维数组去记录遍历过的位置,也就是已经走过的位置,递归结束后,这个黑点才算结束,然后继续遍历,直至结束。
现在想起来逻辑是挺清晰的,但是当时感觉自己的脑子就跟浆糊一样:)
#面经##字节跳动##前端工程师##校招#