记一次大厂面试

面试地点在五角场写字楼,紧挨着地铁站,不可谓不舒服啊。

进入办公区后前台小姐姐马上给了套笔试题(居然是彩印的。。大厂果然有钱)。

笔试部分

做题时间45分钟,实际作答接近一个小时。

问题一 后端用 INT64 类型向前端传 id 会有什么问题?如何解决?

现场还原:一脸懵逼。。后来突然想到之前写过的一道算法题,要求写出一个函数,实现字符串的乘法,比如 '12' * '40' = '480',虽然算法题没写出来,但是知道了js的 Number 类型是有长度限制的。嗯,所以这道题的标准答案一定是将 id 转换成字符串了!

正确答案:js Number 类型最大为2^53 - 1,而 int64 作为 long 长整型传到前端后超出的部分会丢失。解决方案是,把id 变成字符串再传给前端。


问题二 简述一下浏览器缓存机制有哪些?说说他们的优缺点。

现场还原:属于基本面试题了,从强缓存协商缓存到 storage 和 cookie ,写就是了。

正确答案:略。现在想想是不是应该加上一个 serviceWorker?


问题三 想不出来了,也可能没有。


问题四 用css画出如下的进度条(网上找的图,忽略中间的数字)

现场还原:最后写的这道题,当时已经超时了,也没人来叫我。。。。最后匆匆忙忙写个一点交卷了,实际上没什么思路。

正确答案:clip实现圆环进度条


问题五 用js设计一个调度器,最多可以并发两个任务。

// 以下是场景,凭记忆写的,不一定正确
let promiseCreator = (task) =>{
    // do something
}
let scheduler = new Scheduler()
let runTask = (task, price) => {
    scheduler.add(promiseCreator(task))
    .then(()=> console.log(price))
}
runTask(task, 10)
复制代码

现场还原:之前貌似看过这个题,思路还是有的,用 class 创建构造函数,实现内部的任务队列,然后每次有新的任务进来都更新一下队列,任务执行完后通知执行下个任务。应该注意的是 scheduler.add() 后可以调用 then 方法,说明返回的是 promise 对象。

正确答案:等等再写。

面试部分

笔试题做完后来了两个技术面试官,一开始简单自我介绍后,就围绕之前的笔试题展开。面试有一个小时,挑一些比较有意思的写一下:

问:后端传int64有什么问题?那么如果传用 int64 传数字 5 会怎么样?是5后面全是 0 ,还是全部是 5?

答:js Number 类型有长度限制,超出后会保持最大值,所以后端传字符串就ok了。后面的问题不太清楚。

问:所以你不太懂 int64 是什么?但是知道这道题一定是错的?

答:对。(由于怕被问到刷算法题,没敢提之前刷题的经历,想想有点过于敏感了,面试官可能更愿意听你的解题思路

问:没关系,我们来看一下最后调度器这道题,可以说说你的思路吗?

答:创建两个任务队列,一个存任务,一个存调度时的任务,设一个pending变量,用于记录当前是否可执行下一个任务。

问:可以用一个队列来写吗?必须要定义 pending 这个状态吗?

答:(想了一下)队列可以优化,pending 不可以。

问:其实是可以不要 pending 状态的。因为一个任务完成后直接执行下一个任务就好了。

答:(内心很困惑,感觉面试官说的不对,但是没有整理好思路去反驳,面试结束后再想可能是面试官故意说错的。。)

问:有一个嵌套数组,里面只有数字和数组两种,如何打平?

答:递归。用 typeof 进行判断。

问:如果数据。。。。这个时候我抢答用 isArray。。真是智障,都没听清面试官问的是什么。千万不可以抢答

问:如何实现 useState 这样稳定的钩子(组件更新后状态不会改变)?

这个是开放题了,面试官说自己也没看过源码,跟我一起讨论,虽然我什么都不懂。。。大概是利用自定义 hooks 的闭包特性吧

总结一下

一定要保持自信,认真思考面试官给你的提示和解答,然后回答时也不需要太快(更不要抢答),理清思路是最重要的,因为面试官希望招的不仅是技术好的人,而且还是可以和他们一起解决问题的人。

遇到不会的题目也不要急着放弃,既然面试官给你时间想了就要说一下自己的思路,哪怕是错的。

转载于:https://juejin.im/post/5d05d856e51d45773d468605

猜你喜欢

转载自blog.csdn.net/weixin_33874713/article/details/93173340