[跳槽必备] 面试题

131 阅读2分钟

一、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)children/children/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

分析: 此题涉及到的知识点广泛滴很,要做对此题,你得有一定的分析问题的能力,还得具备 逻辑运算符、运算符的优先级、声明变量和声明函数的提升优先级、原型继承、闭包、覆盖等知识点