**
JS**
1. JS判断数组还是对象类型?
- typeOf
- indexOf
- Object.prototype.toString
2.深拷贝和浅拷贝?
浅拷贝:
- 以赋值形式拷贝引用对象,指向同一个地址,修改时原对象也会受影响。
- 赋值表达式 = Object.assign 展开运算符 (…)
深拷贝
完全拷贝了一个新的对象,修改时原对象不会受影响。
1.JSON.parse(JSON.stringify(obj**)) //使用了JSON转字符串,递归进行逐一赋值。
2.递归实现深拷贝 - 声明一个函数 (参数obj);
- 定义一个结果对象为copy;
- 判断如果是obj基本数据类型(number, string,null,undefined,NaN), 直接将obj return出去;
- 如果对象是数组,则定义结果数组, = obj instanceof Array;
- 遍历对象的key, 判断如果key 是对象的自由属性,就递归调用深拷贝方法。
//声明一个函数 (参数obj);
function clone(obj){
let copy ={} //定义一个结果对象为copy;
//判断如果是obj基本数据类型(number, string,null,undefined,NaN), 直接将obj return出去;
if(typeof obj !== 'object' || obj ===null){ // typeof null 是个 'object'
return obj
}
//如果对象是数组,则定义结果数组,
if(obj.constructor===Array){ = obj instanceof Array;
copy = []
}
//遍历对象的key
for(let key in obj){
//判断如果key 是对象的自由属性
if(obj.hasOwnProperty(key)){
//就递归调用深拷贝方法。
copy[key] = clone(obj[key])
}
}
return copy
}
3.事件循环机制?
setTimeout(function(){
console.log(1) //事件表
},0)
console.log(2) //主线程
原理:
- 事件循环机制的同步和异步,setTimeout是异步,所以先执行同步 2 ,在执行异步 1。
- 当同步进入到主线程执行完了 2 ,去任务队列查看异步任务 1 ,有就推到主进程中。
- 任务队列- 弹出个任务,放栈中,一直循环 - 同步进主线程,异步进时间表。
宏任务与微任务?
宏任务(异步): - 当前调用栈中的代码
微任务(同步) - 当前任务执行结束后 立即执行的任务。
.async 和 await
- async - 声明一个异步函数,
- await - 代表什么时候使用它
JS数据类型
11111
Vue
4.Vue生命周期
写一个子组件,挂到父组件上引用,会先更新子组件还是父组件?
- 子组件,因为父组件已经渲染完成了。
- 在beforeMounte,还没有渲染数据到 上,组件是空的。
- 在mounted,才会在
上添加东西。
销毁时先销毁子组件还是父组件? - 子组件
在created中修改data,无法修改,因为还没有¥el
5.Vue的data为什么是一个函数,而不是一个对象?
- 组件复用时所有组件实例会 共享data,如果data是对象的话,就会造成一个组件 修改
data后会影响到其它所有组件,所以需要将data写成函数,每次用到就调用一次函数获得新的数据。 - 当使用new Vue()的方式时候,无论将data设置为对象还是函数都可以,因为new
Vue()的方式是生成了一个根组件,该组件不会被复用,就不存在共享data的情况了。
6.双向绑定和单项绑定 - v-model 用于表单数据双向绑定
- v-bind 绑定一个value属性