一面
面试官是个超级亲切的小哥哥,问了不少前端的知识。
- visibility 和 display 的差别(还有opacity)
- opacity可以有过渡效果么
有 - opacity为0.5的元素,背景色
0.5alpha
是更浅么?
我回答是 - 如何用
css
实现这样的动画:某个元素可以移动到鼠标处
我不会。问面试官能不能用用js,肯定后问如何模拟动画效果。我说使用setTimeout
,和for
循环
接下来问我会用requestAnimationFrame
么?我只是知道,没用过。
然后,面试官非常亲切地和我讲了requestAnimationFrame
比起setTimeout
的优势,前者能保证在下一帧时执行,不会造成帧丢失。 -
ES5
新增对数组操作 map, filter 和 reduce 分别是什么 - forEach的参数是什么
一个回调函数,函数的参数是这个数组的元素,返回void
追问:第二个参数是什么
回答:index
补充:是forEach的第二个参数
回答:我不清楚orz
面试官告诉我是this - js中的this很特殊,举例改变this的方法
call 和 apply
追问:有什么不同
参数形式不同,但是我忘了哪个是传数组 -
setTimeout(fn, 0)
多久才执行
这个是js单线程的执行阻塞问题。我的回答是:由于setTimeout异步线程,会马上被挂起,然后执行一条同步指令之后再去查看挂起的线程,才执行,也就是时间是执行一条同步指令的时间。
面试官质疑是不是执行完同步指令之后马上去检查,我说应该是有类似于nextTick
,固定的周期去检查。
最后我记得面试官的意思应该是,处理器空闲时去检查异步线程。 -
nextTick, immidiately和setTimeout(0)
哪个先
什么???immidiately
是什么东西???我就说immidiately -> nextTick -> setTimeout(0)
面试官说答案是nextTick最先 - 谈谈你对webpack的理解
是一个对资源进行模块化和打包的工具,处理每个模块的 import 和 export
追问:资源是指什么?
回答:Js,css,png图片等
追问:如果有个二进制文件,它是资源么?webpack怎么使它模块化?
回答:是。需要有一个对应的loader来处理(我是想到了vue-loader等) - 中间件是什么
express其实是由一堆中间件堆起来的服务器开发框架
app.use(callback) - 如何对特定路径使用中间件
我回答的是在app.METHOD(),传入相应的中间件,我讲得不清楚,被误会成只传一个中间件,然后再调next去回到路由controller(最后的问题询问时才知道我表达得不清楚)
我还回答了说我使用的一些框架中可以直接对controller注解@use使用特定中间件 - 用js实现LRU策略的cache
我最先用数组实现的队列
面试官提示后改用链表,然后使用双向链表,永远实现踢出队头,从队尾进。每次访问某一节点时,将它提到队尾(就是基本的链表操作)(写代码) - 实现一个 fetchImage(n): Promise<Image>的函数,n为时限,超时请抛错
我先用了setTimeout
然后设置flag是标识是否加载完成,
又改成clearTimeout
最后面试官提示用 Promise.race(),豁然开朗。
二面
- 写单例模式
单例模式优点:我不会 - 工厂模式
写代码
优点:松耦合,将对象的创建这种变化从业务逻辑代码中分离 -
谈谈DI和AOP
我不会AOP,然后直接讲了DI的原理和实现,手撸了个简单的IoC@interface Service { Class target();
}
@Service(target = MySwim.class)
interface ISwim {
}class MySwim implements ISwim {}
class Ioc {
HashMap<String, Object> dependecies = new HashMap<>(); public T <T> resolve(Class aClass) { }
}
讲解说利用注解去注册实现,通过反射去获取构造注入中的参数,然后去依赖注册map中寻找 - 用js实现一个函数,简化路径类似 '../a/b/../b/c'
我傻到忘记了split而手动去划分,但是我说明了总体算法就是利用 栈 来实现
面试官强行安慰我:“你是原生js用得少了,没关系” - 从地址栏输入地址到用户看到东西,经过了什么
我第一次回答漏掉了缓存和#标识,这两者并不会都向服务器发送请求,然后结果忽略了可能返回404等错误
不允许转载
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。