长时间没更,一是单次面试被问倒的题不多,二是问倒的题不太好写。
这段时间有很多面试,总结来说有几点被问到不好答的:
-
性能优化
性能优化
- 项目亮点
很难总结,特别都是偏业务轻技术的项目,只能挑一点解决时间比较长的点说。 -
设计模式应用
一般只会问了解哪些设计模式,实际应用只有乌鸫三面问到了,没什么想法。
来源菜鸟教程
- 单例模式,vue store(Vue插件应该都算是)、webSocket、连接池、线程池。
- 工厂模式,工厂类负责各类的生产,vue应用主要是简单工厂,比如switch封装。
- 状态模式,由状态更改行为,流程/进度组件。
- 策略模式,用以避免写过多的if else语句,定义一系列算法,使其可替换使用。vue用可以是component标签,用is属性配置不同策略的组件。后端就是普通的接口实现,且实体(策略)类都要对外暴露。
- 外观模式,隐藏内部细节,vue中使用仅仅是组件设计的一种思路,比如嵌套组件steps/step等。
- 模板方法模式
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤的具体实现
比如vue的slot,react的render props。
- 享元模式,类似单例,在某些程度(根据属性)上共享对象。比如$message等全局提示信息框,分success、warning等状态,每个状态就是一个共享的对象。
- 观察者模式,响应式数据
- 订阅发布模式,类似观察者,但是多一个订阅中心的角色,如dom事件监听。
- 适配器模式,兼容封装。
- 装饰器模式,es7装饰器,java注解。
- 代理模式,添加中间层,设置一些控制,代理的细节内部执行。感觉跟工厂类似,不过不是new的时候判断处理,而是访问类的时候。
结构型模式感觉都是一种组件的设计(解耦)思路,而不是真正实现某些功能需求。
- diff算法描述、时间复杂度
第六项总结,时间复杂度由O(n³)优化成了O(n)。 - flutter框架(可忽略)
- 描述总结
很多原理可能知道,但是描述不够精简,需要总结一下。
- 防抖节流
防抖和节流,都是控制事件触发频率的方法。
防抖是当持续触发事件的时候,函数完全不执行,等最后一次触发结束的一段时间之后,再去执行。
节流是有节制地执行,就是在一段时间内,只执行一次。 - 响应式数据
响应式数据是指当数据改变时,视图上该数据的引用位置也会变化。
原理是采用数据劫持和观察者模式,数据劫持是利用Object.defineProperty监听属性的get/set方法,在get中收集依赖,在set中触发更新。更新重新渲染视图。
关于更新:更新是异步的,更新动作会存在队列中,会用nextTick方法一次性清空队列。 - diff算法
diff算法是更新vnode的过程中,对比新老vnode的算法。算法只针对同级进行对比,用isSameVnode对比,判断tag和key是否一样;如果不一样直接替换,如果一样,就判断是否有子节点,如果只有一边有子节点或者都没有,是比较好处理的;
如果都有子节点,则需要用双指针来进行对比,用isSameVnode来判断新老子节点的头头 尾尾 头尾 尾头 是否是同一节点 如果满足就进行相应的指针及dom移动;如果全都不相等,进行暴力对比,用老节点的key和index构建一个map,如果找到了,则移动老的子节点到前面去,如果找不到就直接插入;
对新老的子节点进行递归patch处理,最后老的子节点有多的就删掉,新的子节点有多的就添加到相应的位置。总体思路就是对老节点,能复用的复用,多的删掉,新的能用老的就用老的,没有再添加。
网友评论