1、var a=Function.length,b=new Funtion().length; console.log(a===b)
答案:
length 是函数对象的一个属性值,指该函数有多少个必须要传入的参数,即形参的个数。
形参的数量不包括剩余参数个数,仅包括第一个具有默认值之前的参数个数。
Function 构造器本身也是个Function。他的 length 属性值为 1 。
该属性 Writable: false, Enumerable: false, Configurable: true.
Function 原型对象的 length 属性值为 0 。
2、微任务与宏任务
console.log(1)
setTimeout(() => console.log(2), 1000)
async function fn () {
console.log(3)
setTimeout(() => {console.log(4)}, 20)
return Promise.reject()
}
async function run () {
console.log(5)
await fn()
console.log(6)
}
run()
for(let i=0;i<90000000;i++){}
setTimeout(()=>{
console.log(7)
new Promise(resolve => {
console.log(8)
resolve()
}).then(()=>console.log(9))
})
console.log(10)
// 1 5 3 10 报错 4 7 8 9 2
3、class相关,以下会输出什么?
class Person {
static nihao = 'hi'
sayHi = () => {
throw 123
}
}
class Teacher extends Person {
constructor () {
super()
}
sayHi () {console.log('hi!,teacher')}
}
var teacher = new Teacher()
console.log(teacher.nihao)
console.log(teacher.sayHi())
解释:①在ES中类的继承是可以继承静态属性的,不晓得同学可以使用babel编译之后就可以很清晰的看到了
②在 class 里用 = 号声明的变量属于 Field declarations 的语法,下面是TC39规范,也就证明了实际
Person的sayHi被挂载到了实例属性上,读取优于原型链
https://github.com/tc39/proposal-class-fields#field-declarations
4、 v-if和v-for哪个优先级高?如果两个同时出现,应该怎样优化得到最好的性能?
1、分析render函数可以看出v-for优先于v-if被解析
2、如果同时出现,每次渲染都会先执行循环再判断条件,无论如何都不可避免,浪费了性能
3、要避免出现这种情况,则在外层嵌套template,在这一次进行v-if判断,然后在内部进行v-for循环
5、 Vue组件data选项为什么必须是个函数而Vue的根实例则没有此限制
Vue组件可能存在多个实例,如果使用对象形式定义data,会导致它们共用一个data对象,
那么状态变更将会影响所有组件实例,这是不合理的;采用函数形式定义,在initData时
会将其作为工厂函数返回全新data对象,有效规避多实例之间状态污染问题。而在Vue跟
实例创建过程中则不存在该险种,也是因为根实例只能有一个,不需要担心这种情况。
6、你知道vue中key的作用和工作原理吗?说说你对它的理解。
1、key的作用主要是为了更高效的更新虚拟DOM,其原理是vue在patch过程中通过key可以精准判断两
个节点是否是同一个,从而避免频繁更新不同元素,使得整个patch过程稿中更加高效,减少DOM操作量,提高性能。
2、另外,若不设置key还可能在列表更新时引发一些隐蔽的bug
3、vue中再使用相同标签元素名的过渡切换时,也会使用key属性,其目的也是为了让vue可以区分它
们,否则vue只会替换其内部属性而不会触发过渡效果
7、你怎么理解vue中的diff算法?
1、diff算法是虚拟DOM技术的必然产物:通过新旧虚拟DOM做比对(即diff),将变化的地方更新在真实
DOM上;另外,也需要diff高效的执行对比过程,从而降低时间复杂度O(n).
2、Vue2.x中为了降低Watcher粒度,每个组件只有一个Watcher与之对应,只有引入diff才能精确找到
发生变化的地方。
3、vue中diff执行的时刻是组件实例执行更新函数时,它对比上一次渲染结果oldVnode和新的渲染结果
newVnode,此过程称为patch.
4、diff过程整体遵循深度优先、同层比较的策略;两个节点之间比较会依据他们是都拥有子节点或者
文本节点做不同操作;比较两组子节点是算法的重点,首先假设头尾节点可能相同做4次对比尝试,
如果没有找到相同节点才按照通用方式遍历查找,查找结束再按情况处理剩下的节点;借助key通常
可以非常精确的找到相同节点,因此整个patch过程非常高效。
8、谈一谈对vue组件化的理解
9、MVC、MVP和MVVM
10、vue3.0新增特性
11、vue要求组件模版为什么只有一个根元素
1、new Vue({el: '#app'})
2、单文件组件中,template下的元素div,其实就是‘树’状数据结构的‘根’
3、diff算法要求的,源码中,patch.js里patchVnode()
11、vue组件通信
12、vue-router中如何保护指定路由的安全