⇧点蓝色字关注“橘子的分享”
支付宝口令红包
这次收入极低,所以我全部都发了,每个红包应该很少,等以后如果流量大一点,接单了,再发多一点。你们多几个人看,浏览量上去了,报价就高了,发的也多....
口令为:橘子的分享口令
西安邮储面试题
如何知道一个对象中是否含有这个键
可以使用hasOwn
来判断,比如
const obj = { name: "alex" };
console.log(Object.hasOwn(obj, "name")); // true
或者可以使用其他的方法,比如这样
const obj = { name: "alex" };
const keys = Object.keys(obj);
console.log(keys.includes("name")); // true
如何判断一个数据的数据类型
这个我以前总结过,有很多方式,其实最好的还是Object.prototype.toString.call(data).slice(8, -1)
或者instanceof
点击这里访问
vue2.0和3.0的区别
响应式原理不同,2使用的object.defineProperty而3使用的proxy,解决了2.0中无法对数组和对象进行新增删除的监听。 生命周期不同 数据定义的方式不同 3支持多节点
forEach和map区别
map默认有返回值,返回一个和原来数组一样长度的数据,并且不改变原数组,同时可以配合其他方法链式调用,比如filter。 forEach默认没有返回值,在循环的时候可以修改当前数组的原始数据。在运行速度上略慢于map。
sort排序改变原数组吗
sort排序是就地排序,改变原数组,如果不想要改变原数组,需要用到最新的函数toSorted()
for in 和 for of区别
for...in 循环只遍历可枚举属性
const obj = { name: "alex", age: 18 };
for (const key in obj) {
console.log("key", key); // name age
if (Object.hasOwn(obj, key)) {
const element = obj[key];
console.log("element", element); // alex 18
}
}
const data = [1, 2, 3, 4, 5];
for (const key in data) {
console.log(key); // 0,1,2,3,4 因为数据的可以就是下标索引
}
for of 语句执行一个循环,该循环处理来自可迭代对象的值序列
const data = [1, 2, 3, 4, 5];
for (const value of data) {
console.log(value); // 1,2,3,4,5
}
const data = "hello";
for (const value of data) {
console.log(value); // h,e,l,l,o
}
const data = new Set([1, 1, 2, 3, 4]);
for (const value of data) {
console.log(value); // 1,2,3,4
}
跨域
跨域是协议(http/https)、域名、端口号只要一个不符合就是跨域了。
请求跨域,后端使用cors解决跨域,前端使用代理也可以,但是打包后代理不生效,可以配置nginx做转发到指定ip iframe跨域,使用不同的协议或者域名端口,继承到项目中,也会跨域。比如建立一个html,嵌入百度的就会。(面试的时候尽量还是直说请求跨域吧,万一说了iframe跨域,面试官又继续问了这个很深入的问题,答不上来就尴尬了!)
<!DOCTYPE html>
<html lang="zh_cn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<iframe src="https://www.baidu.com" frameborder="0"></iframe>
</body>
</html>
Refused to frame 'https://www.baidu.com/' because an ancestor violates the following Content Security Policy directive: "frame-ancestors 'self' https://chat.baidu.com http://mirror-chat.baidu.com https://fj-chat.baidu.com https://hba-chat.baidu.com https://hbe-chat.baidu.com https://njjs-chat.baidu.com https://nj-chat.baidu.com https://hna-chat.baidu.com https://hnb-chat.baidu.com http://debug.baidu-int.com".
就会提醒你违反了安全策略,如果你顺利加载出来,还想要通信的话,可能也会告诉你跨域通信了
vuex 和pinia的区别
pinia更加轻量化,同时个vuex不同,pinia是多store,而不是vuex的单例模式,只有一个store。而且pinia更加支持typescript。
vuex在刷新页面数据会丢失怎么解决
可以在页面刷新的时候,重新调用存在vuex中的数据对应的接口,然后保存在session或者local中。
搭建框架的步骤
技术选型,确定好使用哪些技术。 了解整体需求,抽离复用模块 根据功能模块配置项目菜单 修改打包配置 新建readme文档 新建git仓库,以及git代码提交规范
内存溢出怎样处理
重新分配更加合适的内存 查找代码中是否存在死循环或者没有回收的内存代码
JS阻塞和非阻塞
其实可以理解为同步和异步,同步就是代码一行行执行,只有上一行执行完毕后才能执行下一行代码,也就是阻塞,前面的代码阻塞后面的代码。但是在实际开发中,我们很多情况会遇到不能阻塞后续代码加载的情况,比如网络请求,文件操作等等。所有就有异步执行,其他的代码正常执行,在遇到网络请求后,单独开一个微任务给请求,其他的正常按照同步执行,在请求结束后赋值,结束本次微任务。从而达到了非阻塞的效果。
ES6更新内容
讲自己项目的优化点,有提到过权限的设计;
前端权限一般涉及到的是菜单权限和按钮权限,菜单通过后端配置动态显示,按钮权限通过后端返回当前用户的权限列表来匹配,通过v-if来控制是否显示按钮。
优化点一般针对打包速度,页面打开速度,首屏加载速度,项目大小,用户体验等。
深复制(可以用已有的插件),获取日期年月日怎么写
深拷贝
function deepClone(obj, hash = new WeakMap()) {
if (obj === null) return obj; // 如果是null或者undefined我就不进行拷贝操作
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
// 可能是对象或者普通的值 如果是函数的话是不需要深拷贝
if (typeof obj !== "object") return obj;
// 是对象的话就要进行深拷贝
if (hash.get(obj)) return hash.get(obj);
let cloneObj = new obj.constructor();
// 找到的是所属类原型上的constructor,而原型上的 constructor指向的是当前类本身
hash.set(obj, cloneObj);
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
// 实现一个递归拷贝
cloneObj[key] = deepClone(obj[key], hash);
}
}
return cloneObj;
}
let obj = { name: 1, address: { x: 100 } };
obj.o = obj; // 对象存在循环引用的情况
let d = deepClone(obj);
obj.address.x = 200;
console.log(d);
获取年月日
const year = new Date().getFullYear()
const month = new Date().getMonth() + 1
const day = new Date().getDate()
const time = dayjs(new Date()).format('YYYY-MM-DD')
上传,下载文件有处理过吗?多个文件同时上传怎样处理?上传失败了怎么找出是哪个文件
在上传文件的时候,使用formdata,将多个文件append进去,直接调用一个接口上传即可。 多个文件单个上传,或者同时调用多个接口进行上传,将上传的文件作为一个队列,控制每次上传的个数,将上传失败的文件打上标签,比如文件上传超时等问题引起。
不要让时代的悲哀,
成为你我的悲哀!