vue面试题解答

本文深入探讨Vue的响应式原理,包括数据属性的getter/setter实现,数组变化的监听机制,以及内部依赖追踪和渲染函数的工作流程。同时,对比了Vue与React在数据可变性、语法、组件写法和框架类别上的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.阐述响应式原理

当一个vue实例创建的时候,vue会遍历data选项的属性,用Object.defineProperty将它们转为getter/setter并在内部追踪相关的依赖,在属性被访问和修改时通知变化。

2.如果data选项的属性值是一个数组,Vue时怎么拦截的?

复制一个原生数组,然后用Object.defineProperty拦截该复制数组的每个方法,最后返回这个当前data属性数组的__proto__等于该复制数组,达到监听数组变化的能力。

3.这个内部追踪指的是什么?

内部追踪依赖于Proxy(作用域代理)和渲染函数(做依赖的收集)

4.渲染函数的核心

词法分析、句法分析

5.为什么js禁止用with,vue2.0版本渲染函数还用with?

with的使用主要是因为它消除了对嵌入模板中的JavaScript表达式进行解析和范围分析的需要,从而大大减少了代码原本身的大小和复杂性。由于模板编译器包含在浏览器中运行的独立构建中,负载大小仍然是一个重要的关注点。

完整答案 : https://github.com/vuejs/vue/issues/4115#issuecomment-258525758

 

——————————————  相关问题——————————————

1.Object.defineProperty和proxy的区别

Object.defineProperty(obj, key, descriptor) 

只能监听对象的属性,无法监听数组的变化,属性值也是对象需要深度遍历

descriptor配置项包含  get, set, configurable, enumerable, value

Proxy 

返回一个新的对象,可通过操作返回的新的对象达到目的

有13种拦截方法:

get, set, has, contruct, deleteProperty, defineproperty, enumerate, getOwnPropertyDescriptor,

getPrototypeof, isExtensible, ownKeys, preventExtensions, setPrototypeOf

 

defineProperty再修改原来的obj对象可以触发拦截;

proxy就必须修改代理对象,即Proxy的实例才可以触发拦截;

2. vue和react的区别

(1)数据是否可变

                react推崇函数式思想,数据不可变,单向数据流;vue推崇响应式思想,数据可变, 支持双向绑定。

(2)语法

               react是JSX语法,all in javascript,通过js生成html,css等;vue把html,css,js组合到一起,提供模板引擎来处理html。

(3)组件写法

               react是类式写法,api少,可以通过高阶组件来扩展;vue是声明式写法,api和参数都很多,需要通过mixins来扩展。

(4)框架类别

              react是一个UI组件库,很多事情交给社区去做,例如redux, mobx,vue是渐进式框架,很多东西都是内置的;

              redux的combineReducer就对应vuex的modules,vuex的mutation是直接改变的原始数据,而redux的reducer是返回一个全新的state,所以redux结合immutable来优化性能,vue不需要。

            

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值