1.回流和重绘
什么是回流
当render tree锤(渲染树)中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(reflow)。每个页面至少需要一次回流,就是在页面第一次加载的时候,这时候是一定会发生回流的,因为要构建render tree。在回流的时候,浏览器会使渲染树中受到影响的部分失效,并重新构造这部分渲染树,完成回流后,浏览器会重新绘制受影响的部分到屏幕中,该过程成为重绘。
什么是重绘
当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color。则就叫称为重绘。
2.vue组件传参
传子传参通过props接收数据接受的数据和data中的数据一样可以直接挂载到实例中
子传父通过自定义事件,在子组件中通过$emit接受
兄弟之间通过一个空的vue实例作为事件中心通过,用它来触发事件和监听事件,来实现组建之间的通信 ,用$on监听事件$emit来触发事件
$children 获取子组件实例
$parent 获取父组件实例
3.普通函数和箭头函数的区别
普通函数的写法 function(){}
普通函数this指向函数运行时所属的对象
This不指向函数本身 也不值向函数所在的作用域 而是指向调用函数的对象
在全局下指向window
This在赋值给某个事件时只向事件所属的对象
This在对象方法中使用时指向方法所属的对象
This在闭包中指向window
箭头函数可以用 ()=>{}方式定义
当只有一个参数时()可以省略
只有一行代码时{}可以省略
如果这一行代码是返回值时return 可以省略
箭头函数的this指向
箭头函数指向定义它的地方而不指向调用它的地方此时this是静态的
箭头函数this永远指向父级作用域所属的对象
4.var let const 的区别
Var 定义全局和局部变量
Let const 会形成块级作用域只在自己的代码块中起作用
Let const 会形成暂时性死区
Var 存在变量提升 let const 不存在变量提升
Var 可以修改值可以重复声明和重新赋值
Let 可以修改值 const 不可以修改值
Let 和 const 都不可以重复声明
5.说说你对闭包的理解
函数嵌套函数被称为闭包函数
想要获取函数内部的变量就要使用闭包函数
另一个就是让这些变量始终保存在内存中
缺点是
不能滥用闭包应为这些变量始终保持在内存中可能造成网页性能问题
在ie中可能造成内存泄漏
解决方法是在退出函数之前把不用的局部变量全部删除
6.vue生命周期
vue生命周期是指vue是对象从创建到销毁的过程。
在vue生命周期的不同阶段通过对应的钩子函数来实现组件数据管理和DOM渲染两大重要功能。
创建阶段:beforecreate:
实例已经初始化,但不能获取DOM节点。(没有data,没有el)created:
实例已经创建,仍然不能获取DOM节点。(有data,没有el)
载入阶段:beforemount:
模板编译完成,但还没挂载到界面上。(有data,有el)mounted:
编译好的模板已挂载到页面中(数据和DOM都已经渲染出来)。
更新阶段:beforeupdate:
数据发生变化立即调用,此时data中数据是最新的,但页面上数据仍然是旧的(检测到数据更新时,但DOM更新前执行)。updated:
更新结束后执行,此时data中的值和页面上的值都是最新的。
销毁阶段:beforedestroy:
当要销毁vue实例时,在销毁之前执行。destroy:
在销毁vue实例时执行。
7.什么是原型链
由于—proto—是任何对象都有的属性,是一个指针指向构造函数的原型对象prototype,而该构造函数也有—proto—指向该构造函数所继承对象的原型对象,以此类推会形成一条—proto—连起来的链条该链条就是原型链,递归访问到头的值是null。
8.Vue是如何实现双向绑定的?
vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调。
当把一个普通 Javascript 对象传给 Vue实例来作为它的 data选项时,Vue将遍历它的属性,用Object.defineProperty()将它们转为getter/setter。用户看不到getter/setter,但是在内部它们让Vue追踪依赖,在属性被访问和修改时通知变化。
vue的数据双向绑定 将MVVM作为数据绑定的入口,整合Observer,Compile和Watcher三者,通过Observer来监听自己的model的数据变化,通过Compile来解析编译模板指令(vue中是用来解析 {{}}),最终利用watcher搭起observer和Compile之间的通信桥梁,达到数据变化 —>视图更新;视图交互变化(input)—>数据model变更双向绑定效果。
9.Vue中hash模式和history模式的区别
在最明显的显示上:hash模式的URL中会夹杂着#号,而history没有。
Vue底层对它们的实现方式不同:
hash模式是依靠onhashchange事件(监听location.hash的改变)
history模式是主要是依靠的HTML5 history中新增的两个方法,pushState()可以改变url地址且不会发送请求,replaceState()可以读取历史记录栈,还可以对浏览器记录进行修改。
10.组件中的data为什么是一个函数?
如果data是对象的话,由于对象是引用类型,组件被复用的话,就会创建多个实例。本质上,这些实例用的都是同一个构造函数。这样就会影响到所有的实例,所以为了保证组件不同的实例之间data不冲突,data必须是一个函数。