🔥🔥🔥热乎的前端面试题(昨天)
前言
系列首发于公众号『前端进阶圈』 ,若不想错过更多精彩内容,请“星标”一下,敬请关注公众号最新消息。
热乎的前端面试题(昨天)
1.Vue 响应式原理?
vue2
:在
Vue2
中注意使用Object.defineProperty()
方法来实现响应式,它为对象中的每一个属性都定义了一个getter
和setter
,当数据发生变化时,会触发相应的更新操作,从而让视图也随之更新。在
Vue2
中,数据对象通过new Vue
中的data
对象进行实例化,在实例化的过程中,Vue
会遍历这个数据对象使用Object.defineProperty()
把他们转化为getter/setter
,当getter/setter
接收到访问或修改时,会通过对应的Watcher
及所依赖的Watcher
进行更新。vue3
:在 vue3 中主要使用了
Reactive API
和Proxy
来实现响应式reactive()
函数会讲一个普通对象转换成响应式对象,这个函数内部使用了ES6
的proxy
对象,讲的对象的getter/setter
, 并使用依赖收集,派发更新等机制。同时增加了
ref
和computed
这两个响应式API
,让我们可更灵活的管理组件内的数据状态。
2.Vue 是如何监听数组的变化的?
Vue 通过把数组的原生方法重写了
获取原生数组的原型方法,因为拦截后才能对数组添加拦截操作
对数组的原型方法使用
Object.defineProperty()
做一些拦截操作把需要被拦截的数组类型的数据原型指向改造后的原型方法
3.vue 为什么不能检测数组变动?
通常情况下,vue 通过对每一个键设置
getter/setter
来实现响应式,没有对数组的每个键设置响应式,而是直接对值递归设置响应式。主要考虑到性能问题。
4.canvas 生成图片模糊问题?
没有使用整数坐标:可使用
Math.floor
将坐标强制转换为整数。线条宽度设置的太小,可将
lineWidth
设置为整数值
5.vue 的数据劫持?
Vue2:
使用 Object.defineProperty() 的 getter/setter
Vue3:
使用 proxy 来实现数据劫持
proxy 可直接监听数组的修改
proxy 可直接监听属性的新增和删除
在实现深层次监听的时候,不是一次性递归所有的属性为其添加监听,而是只有在数据对象属性被访问的时候才会添加
6.给定一个对象数组,如何根据另一个对象数组对另一个去重?
可使用 filter 方法结合 map 和 includes 方法来实现根据另一个对象数组去重操作
特殊字符描述:
问题标注
Q:(question)
答案标注
R:(result)
注意事项标准:
A:(attention matters)
详情描述标注:
D:(detail info)
总结标注:
S:(summary)
分析标注:
Ana:(analysis)
提示标注:
T:(tips)
往期推荐:
最后:
版权声明: 本文为 InfoQ 作者【控心つcrazy】的原创文章。
原文链接:【http://xie.infoq.cn/article/743f632f60945b67c1a9a99e3】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论