13

一面

面试官是个超级亲切的小哥哥,问了不少前端的知识。

  1. visibility 和 display 的差别(还有opacity)
  2. opacity可以有过渡效果么
  3. opacity为0.5的元素,背景色0.5alpha是更浅么?
    我回答是
  4. 如何用css实现这样的动画:某个元素可以移动到鼠标处
    我不会。问面试官能不能用用js,肯定后问如何模拟动画效果。我说使用setTimeout,和for循环
    接下来问我会用requestAnimationFrame么?我只是知道,没用过。
    然后,面试官非常亲切地和我讲了requestAnimationFrame比起setTimeout的优势,前者能保证在下一帧时执行,不会造成帧丢失。
  5. ES5新增对数组操作 map, filter 和 reduce 分别是什么
  6. forEach的参数是什么
    一个回调函数,函数的参数是这个数组的元素,返回void
    追问:第二个参数是什么
    回答:index
    补充:是forEach的第二个参数
    回答:我不清楚orz
    面试官告诉我是this
  7. js中的this很特殊,举例改变this的方法
    call 和 apply
    追问:有什么不同
    参数形式不同,但是我忘了哪个是传数组
  8. setTimeout(fn, 0)多久才执行
    这个是js单线程的执行阻塞问题。我的回答是:由于setTimeout异步线程,会马上被挂起,然后执行一条同步指令之后再去查看挂起的线程,才执行,也就是时间是执行一条同步指令的时间。
    面试官质疑是不是执行完同步指令之后马上去检查,我说应该是有类似于nextTick,固定的周期去检查。
    最后我记得面试官的意思应该是,处理器空闲时去检查异步线程。
  9. nextTick, immidiately和setTimeout(0)哪个先
    什么???immidiately是什么东西???我就说immidiately -> nextTick -> setTimeout(0)
    面试官说答案是nextTick最先
  10. 谈谈你对webpack的理解
    是一个对资源进行模块化和打包的工具,处理每个模块的 import 和 export
    追问:资源是指什么?
    回答:Js,css,png图片等
    追问:如果有个二进制文件,它是资源么?webpack怎么使它模块化?
    回答:是。需要有一个对应的loader来处理(我是想到了vue-loader等)
  11. 中间件是什么
    express其实是由一堆中间件堆起来的服务器开发框架
    app.use(callback)
  12. 如何对特定路径使用中间件
    我回答的是在app.METHOD(),传入相应的中间件,我讲得不清楚,被误会成只传一个中间件,然后再调next去回到路由controller(最后的问题询问时才知道我表达得不清楚)
    我还回答了说我使用的一些框架中可以直接对controller注解@use使用特定中间件
  13. 用js实现LRU策略的cache
    我最先用数组实现的队列
    面试官提示后改用链表,然后使用双向链表,永远实现踢出队头,从队尾进。每次访问某一节点时,将它提到队尾(就是基本的链表操作)(写代码)
  14. 实现一个 fetchImage(n): Promise<Image>的函数,n为时限,超时请抛错
    我先用了setTimeout
    然后设置flag是标识是否加载完成,
    又改成clearTimeout
    最后面试官提示用 Promise.race(),豁然开朗。

二面

  1. 写单例模式
    单例模式优点:我不会
  2. 工厂模式
    写代码
    优点:松耦合,将对象的创建这种变化从业务逻辑代码中分离
  3. 谈谈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中寻找

  4. 用js实现一个函数,简化路径类似 '../a/b/../b/c'
    我傻到忘记了split而手动去划分,但是我说明了总体算法就是利用 栈 来实现
    面试官强行安慰我:“你是原生js用得少了,没关系”
  5. 从地址栏输入地址到用户看到东西,经过了什么
    我第一次回答漏掉了缓存和#标识,这两者并不会都向服务器发送请求,然后结果忽略了可能返回404等错误
不允许转载

wenxiangdong
49 声望2 粉丝