1,定时器和Promise先执行哪个,为啥?
promise先执行,因为promise是微任务,定时器是宏任务,先执行微任务。
2,你对微任务和宏任务了解吗?
异步队列,微任务里面有promis,async await 宏任务 定时器 事件处理函数
先执行主线程宏任务 然后再执行异步队列的微任务,没有微任务就会执行下一轮宏任务
3,数据劫持怎么耗性能?
递归遍历所有的对象的属性,这样如果我们数据层级比较深的话,是一件很耗费性能的事情
只能应用在对象上,不能用于数组
只能够监听定义时的属性,不能监听新加的属性,这也就是为什么在vue中要使用Vue.set的原因,删除也是同理
4v-model的原理
是通过数据劫持,用Object.defineProperty,当我们读取或者设置被定义的属性时,就会执行get或者set方法,
get获取数据,set重新设置值
我们只需遍历所有data对象中的所有属性,并对每一个属性使用Object.defineProperty劫持即可,
当属性的值发生变化的时候,我们执行一系列的渲染视图的操作。下面我们看一个简单的vue数据劫持的实现。
5,vue两大特征
组件化 数据驱动视图
组件化就是可以将页面和页面中可复用的元素都看做成组件,写页面的过程,就是写组件,然后页面是由这些组件
”拼接“起来的组件树。数据驱动就是让我们只关注数据层,只要数据变化,页面(即视图层)会自动更新,至于如
何操作dom,完全交由Vue去完成,咱们只关注数据,数据变了,页面自动同步变化了,很方便。
6如果有一万条数据虚拟DOM和真实dom哪个更快?
虚拟dom
7,说一下节流 让一个事件在单位时间执行一次 原生方法我可以写,工作我一般可以用lodash的方法
8 const p声明一个对象,能不能修改对象的属性
可以,当时不能修改p的指针
9.数组扁平化
是将多维数组变为一维数组 原生可以使用循环加递归完成 果用过lodash的话,我们知道 flatten 和 flattenDeep 方法都可以实现.
10。事件委托
把原本要绑定给子元素的事件,通过冒泡机制绑定给父元素
11.原生和vue阻止事件冒泡和默认事件
event.stopPropagation(); event.preventDefault(); vue 在@click后.stop .prevent
12 怎么定义动态路由?怎么获取这个动态路由的参数
可以通过query ,param两种方式
13var 在什么情况下是全局变量
在function 内部, 加var的是局部变量, 不加var的则是 全局变量
14函数中的var外部可以访问吗?
可以
15路由中有三个基本的概念 route, routes, router。
单一路由 一组路由 路由对象
16 vue-router的三种钩子函数及用处
全局钩子函数:beforeEach 和 afterEach 是vue-router实例对象的属性
里面有三个属性 to:到达的路由 next 管道中 可以去其他路由 form 离开之前的路由
单一钩子函数 beforeEnter 也是这三个属性
组件内钩子函数 beforeRouteEnter - beforeRouteUpdate - beforeRouteLeave也是这三个属性
17vue的两种模式
hash模式的原理是onhashchange事件。
hash发生变化的url都会被浏览器记录下来,使得浏览器的前进后退都可以使用了,尽管浏览器没有请求服务器,
但是页面状态和url关联起来。后来人们称其为前端路由,成为单页应用标配.
window.location.hash属性及window的onhashchange事件,主要用来解决:
1.ajax异步请求完成页面的无缝刷新,导致浏览器的URL不会发生任何变化而完成了请求,从而破坏用户体验。
2.同时本次浏览的页面内容在用户下次使用URL访问时将无法重新呈现。
history模式利用了HTML5 History Interface中新增的pushState()和replaceState()方法。MDN
这俩个方法的作用:应用于浏览器的历史记录栈,提供了对历史记录进行修改的功能。当他们进行修改时,
虽然修改了url,但浏览器不会立即向后端发送请求。注意;history模式需要后台配置支持
缺点:虽然丢弃了丑陋的 #,但如果服务器中没有相应的相应或者资源,会刷出一个404来(刷新需要请求服务器)。
history模式不怕前进,不怕后退,就怕刷新。hash模式依靠onhashchange来对页面浏览器url进行记录,不会把 #后面的进行上传请求。改变#后即可进行跳转。
history模式,舍弃#,借助html5 history api,pushState和replaceState对历史记录栈进行操作,需要后台配置支持
18.methods compted watch的区别
计算属性有缓存,可以减少页面调用次数 必须依赖data(){}中的值,且不可以去改变data(){}中的值
相同点: watch 和 computed都对应的是函数
区别: computed 一定要return数据,并且数据会被缓存。
watch : 不用return 直接用this.data修改就行 ,键是你要监听的属性或者表达式,值是对应回调函数,主要用来监听数据变化。
methods更适合写业务逻辑。
19:子组件data为啥为啥是函数
1.vue中组件是用来复用的,为了防止data复用,将其定义为函数。
2.vue组件中的data数据都应该是相互隔离,互不影响的,组件每复用一次,
data数据就应该被复制一次,之后,当某一处复用的地方组件内data数据被改变时,其他复用地方组件的data数据不受影响,
就需要通过data函数返回一个对象作为组件的状态。
3.当我们将组件中的data写成一个函数,数据以函数返回值形式定义,这样每复用一次组件,就会返回一份新的data,
拥有自己的作用域,类似于给每个组件实例创建一个私有的数据空间,让各个组件实例维护各自的数据。
4.当我们组件的data单纯的写成对象形式,这些实例用的是同一个构造函数,由于JavaScript的特性所导致,
所有的组件实例共用了一个data,就会造成一个变了全都会变的结果。
20…then的返回值是什么
是一个promis对象
21.vue.router常见api
router.push(location, onComplete?, onAbort?)
router.replace(location, onComplete?, onAbort?)
router.go(n)
router.back()
router.forward()
router.addRoutes(routes)
动态添加更多的路由规则。参数必须是一个符合 routes 选项要求的数组。
.router.onError(callback)
注册一个回调,该回调会在路由导航过程中出错时被调用。注意被调用的错误必须是下列情形中的一种:
错误在一个路由守卫函数中被同步抛出;
错误在一个路由守卫函数中通过调用 next(err) 的方式异步捕获并处理;
渲染一个路由的过程中,需要尝试解析一个异步组件时发生错误。 N多
H5 C3新特性
语义化标签 (header, nav, footer,)
2. 音频、视频 (audio(MP3, Wav, Ogg), video(MP4, WebM, Ogg))
3Canvas 4本地存储
C3:圆角 阴影 多背景 rgba 媒体查询 2D 3D
22.forEach为啥不能用return
他就是遍历数组,把全部数组遍历成功,不能用return break
23 set受ES5的限制,Vue.js不能检测到对象属性的添加或删除。因为Vue.js在初始化实例时将属性转为getter/setter,所以属性必须在data对象上才能让Vue.js转换它,才能让它是响应的。要处理这种情况,我们可以使用set
受 ES5 的限制,Vue.js 不能检测到对象属性的添加或删除。因为 Vue.js 在初始化实例时将属性转为 getter/setter,
所以属性必须在 data 对象上才能让 Vue.js 转换它,才能让它是响应的。要处理这种情况,我们可以使用set受ES5的限制,Vue.js不能检测到对象属性的添加或删除。因为Vue.js在初始化实例时将属性转为getter/setter,所以属性必须在data对象上才能让Vue.js转换它,才能让它是响应的。要处理这种情况,我们可以使用set()方法,
既可以新增属性,又可以触发视图更新。
24 $nextTick
当数据更新了,在dom中渲染后,自动执行该函数
25token和cookie的五点区别
①:token和cookie一样都是首次登陆时,由服务器下发,都是当交互时进行验证的功能,作用都是为无状态的HTTP提供的持久机制。
②:token存在哪儿都行,localstorage或者cookie。
③:token和cookie举例,token就是说你告诉我你是谁就可以。
④:对于token而言,服务器不需要去查看你是谁,不需要保存你的会话。当用户logout的时候cookie和服务器的session都会注销;但是当logout时候token只是注销浏览器信息,不查库。
⑤:token优势在于,token由于服务器端不存储会话,所以可扩展性强,token还可用于APP中。
CORS 对比 JSONP
JSONP只能实现GET请求,而CORS支持所有类型的HTTP请求
使用CORS,开发者可以使用普通的XMLHttpRequest发起请求和获得数据,比起JSONP有更好的错误处理
JSONP主要被老的浏览器支持,它们往往不支持CORS,而绝大多数现代浏览器都已经支持了CORS
26 说一下你了解的promise
概述:异步编程解决方案,可以获得异步操作的信息,我们一般用asyn awiat简化promise操作
目的:解决回调地狱 使异步操作更简洁
27,数组的一些方法
forEach()可以遍历元素和下标 不需要return 自动返回
arr.concat(arr arr2) 把参数数组和源数组进行拼接,形成一个新的数组
arr.reverse() 翻转 数组‘
arr.sort(callback )
排序,我们可以传入一个回调函数来设置排序规则