一、vue组件data为什么必须是函数
1)组件创建后需要可复用
2)所以data数据需要互相隔离
3)而data如果是对象,对象又是一个引用类型
4)所以需要用函数,并且用return来返回一份新的data,类似给组件一个私有的数据空间,让各个组件维护各自的数据。
二、vue中相同逻辑如何抽离
使用mixin方法(混入对象)
(1)用一个js文件将vue中script部分抽离出来
(2)导入mixins组件mixins:['xxx']
三、请写出vue中组件交互的几种方法
(1)父-》子 props
(2)子-》父 $emit
(3)兄弟-》bugs
(4)vuex 状态管理
(5)parent
四、闭包实现一个防抖工具函数
(1)闭包:有权访问另外一个函数作用域中的变量的函数
(2)函数防抖:函数防抖是指在函数被高频触发时当停止触发后延时n秒再执行函数(即每次触发都清理延时函数再次开始计时
(3)函数节流:函数被高频触发时延时n秒后才会再次执行
五、实现一个深拷贝函数,并说明Object.assign,JSON.parse(JSON.strgingify)的区别
(1)浅拷贝:对象地址的复制,两个对象指向同一个地址,修改其中一个对象的属性,则另一个对象的属性也会改变
(2)深拷贝:开辟新的栈,两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性
如果对象是基本类型,Object.assign,JSON.parse(JSON.strgingify)没有区别
如果对象是复杂数据类型 那么Object.assign只能浅拷贝,而JSON.parse(JSON.strgingify)可以深拷贝
六、说明执行值分别是什么,并简要写明执行过程变化
//1.构造函数,里面有个全局变量指向了一个匿名函数(小心闭包)
function Foo(){
getName = function(){
console.log(1)
};
return this
}
//2.构造函数的一个属性getName,指向一个匿名函数
Foo.getName = function(){
console.log(2);
}
//3.构造函数的原型上有个getName方法
Foo.prototype.getName = function(){
console.log(3)
}
//4.定义一个变量指向匿名函数
var getName = function(){
console.log(4)
}
//5.声明一个叫getName的有名函数
function getName(){
console.log(5)
}
Foo.getName(); // 2
getName(); //,函数声明提前于变量声明,但是最终会被变量覆盖 //4
Foo().getName(); // 返回this并指向window//1
getName(); //第4被第1的函数覆盖了,1
new Foo.getName(); //2
new Foo().getName(); //3
new new Foo().getName(); //3
分析:
此题涉及到的知识点广泛滴很,要做对此题,你得有一定的分析问题的能力,还得具备 逻辑运算符、运算符的优先级、声明变量和声明函数的提升优先级、原型继承、闭包、覆盖等知识点