面试题记录分享

199 阅读4分钟
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的作用和工作原理吗?说说你对它的理解。

    1key的作用主要是为了更高效的更新虚拟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.jspatchVnode()

11、vue组件通信

12、vue-router中如何保护指定路由的安全

13、vue中对nextTick的理解

14、谈一谈你对vue响应式原理的理解?

未完待续