今天上午,再次进行了一轮面试,有些和之前的面试相同的问题,有些不一样。
记录一下遇到的面试问题,基本上是根据我的简历信息上的工作经验来的。
vue2和vue3的一些不同
1、响应式系统不同,vue2是Object.defineProperty,vue3是使用Proxy来实现,前者监听到属性的增加和删除,后者可以监听到数组的变化。
2、API风格不同,vue2采用选项式的api风格,data, watch, methods等,vue3是组合式风格api,把逻辑设计成可以复用的函数;
3、性能上vue3的响应速度更快,渲染虚拟DOM的开销更小;
4、vue3对于typescript的支持更多;
5、生命周期不同,
vue3:
setup 开始创建组件
onBeforeMount 组价挂载到页面之前执行
onMounted 组件挂载到页面之后执行
onBeforeUpdate 组件更新之前
onUpdated 组件更新之后
vue2:
beforeCreate 组件创建之前
created 组件创建之后
beforeMount 组价挂载到页面之前执行
mounted 组件挂载到页面之后执行
beforeUpdate 组件更新之前
updated 组件更新之后前端实现跨域通信
这个因为平时没这么注意过,在网上搜索之后,发现原来平时工程项目中看到的vite.config.js
中,devServer配置多个proxy,就是一种呢
还有jsonp,适合于get请求,获取跨域的静态资源,img,css等会比较合适;
websocket,支持跨域;
document.domain + iframe 主域相同,子域不同的场景;
使用postMessage可以实现跨域;
cors可以支持各种ajax请求的跨域;
总之看遇到什么情况设置什么吧;防抖节流的手写
尽管有许多第三方工具库实现了防抖节流的功能,不过要自己来手写一个,似乎真的快忘记了呢。
节流是固定时间发生一次事件,防抖是固定时间后发生的事件,如果事件再次发生,仅仅以最后一次为准;
我自己比喻就是,节流是每十五分钟去小河边打一次水,免得水资源的浪费;
防抖是十五分钟后到了河边,开始不断打水,之前的水都没打满一桶,以最后一次打水作为最终取水量;
实现代码可以使用计时器或者时间戳比较;
节流:
function throttle(fn, delay = 500) {
let timer = null; // 设置计时器
let startTime = Date.now(); // 获取开始时间
return funciton () {
let curTime= Date.now(); // 获取现在时间
const remaining = delay - (startTime - curTime); // 剩余等待时间
let args = arguments;
let context = this; // 获取参数和上下文
clearTimeout(timer); // 清除之前可能的定时器
if (remaining <=0) {
fn.apply(context, args); // 剩余时间到了,直接执行,并更新下一次开始时间
startTime = Date.now();
} else {
timer = setTimeout(fn, remaining); // 设置计时器,等待时间到了后执行
}
}
}
防抖:
function debounce(fn, wait, immediate) {
let timer; // 设置计时器
return function() {
let context = this;
let args = arguments; // 获取参数和上下文
if(timer) clearTimeout(timer); // 清除可能的定时器
if (immediate){ // 如果需要立即执行
let callNow = !timer; // 是否现在调用
timer = setTimeout(function() {
timer = null;
}, wait); // 设置计时器超过等待时间之后,重新计时
if (callNow) {
fn.apply(context,args); // 第一次直接现在调用
}
} else {
timer = setTimeout(function() { // 在等待时间之后再调用
fn.apply(context, args)
}, wait)
}
}
}