前端JS常见面试题
数据双向绑定
Bug解决
集成工作涉及
版本node
依赖包报错
版本问题!!!ElementUI、Cesium、ant-design
配置、代码和其他
混入
在Vue中,混入(Mixins)是一种非常有用的功能,它允许你创建可复用的功能。混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混入”该组件本身的选项。
混入的基本使用
- 定义混入:首先,你需要定义一个混入对象。这个对象可以包含任何组件选项。
// 定义一个混入对象
const myMixin = { created() { this.hello(); }, methods: { hello() { console.log('hello from mixin!'); } }
}
- 使用混入:然后,你可以在组件中通过
mixins
选项来使用这个混入。
// 定义一个使用混入的组件
Vue.component('my-component', { mixins: [myMixin], created() { console.log('component created!'); }
})
在这个例子中,当my-component
组件被创建时,它首先会调用myMixin
中的created
钩子,然后调用它自己的created
钩子。同时,my-component
也继承了myMixin
中的hello
方法,可以在组件的其它部分调用这个方法。
注意事项
-
选项合并:当组件和混入对象含有同名选项时,这些选项将以一定方式被合并。对于生命周期钩子,混入对象的钩子将在组件自身的钩子之前调用。对于值为对象的选项,如
methods
、components
和directives
,混入对象的选项将被合并到组件的选项中,如果两个对象有相同的键名,则组件的选项会覆盖混入对象的选项。 -
全局混入:Vue.mixin() 允许你注册一个混入,影响之后创建的每一个Vue实例。请谨慎使用全局混入,因为它会影响每一个之后创建的组件实例(包括第三方组件库)。
-
合并策略:Vue为不同类型的选项定义了不同的合并策略。例如,
data
选项在合并时会进行递归合并,而methods
、components
和directives
等选项则是简单地合并到一个对象中。 -
使用场景:混入非常适合为Vue组件添加跨组件逻辑。然而,滥用混入可能会导致组件间的依赖关系变得难以追踪,特别是在大型项目中。因此,建议仅在确实需要跨组件共享逻辑时使用混入。
keep-alive与动态组件(缓存组件)
在Vue.js中,<keep-alive>
是一个内置的抽象组件,用于缓存不活动的组件实例,而不是销毁它们。这样做可以保留组件状态或避免重新渲染,从而提高性能,尤其是在处理动态组件或组件频繁切换的场景下。Vue 2 和 Vue 3 都支持 <keep-alive>
,但它们在细节和性能优化上有所不同。
Vue 2 中的 <keep-alive>
在Vue 2中,<keep-alive>
通常包裹在动态组件 <component>
或 <router-view>
周围,以便缓存这些组件。你可以通过 include
和 exclude
属性来指定哪些组件需要被缓存。
<keep-alive :include="['ComponentA', 'ComponentB']"> <component :is="currentView"></component>
</keep-alive> <!-- 或者用于路由视图 -->
<keep-alive> <router-view></router-view>
</keep-alive>
Vue 2 的 <keep-alive>
还支持一个 max
属性,用于指定缓存组件的最大数量,一旦这个数量被超过,最老的组件实例将被销毁。
包裹动态组件
<template> <keep-alive :include="['ComponentA', 'ComponentB']"> <component :is="currentComponent"></component> </keep-alive>
</template> <script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue'; export default { components: { ComponentA, ComponentB, // 如果currentComponent不是直接引入的组件,需要注册在components中 }, data() { return { currentComponent: 'ComponentA', }; },
};
</script>
包裹路由视图
<template> <keep-alive> <router-view></router-view> </keep-alive>
</template> <script>
// 无需特别脚本,Vue Router会处理路由的切换
</script>
使用include和exclude属性
<template> <keep-alive :include="['ComponentA', 'ComponentC']"> <component :is="currentComponent"></component> </keep-alive>
</template> <script>
// 假设你有ComponentA, ComponentB, ComponentC等组件
// 这里只缓存ComponentA和ComponentC
</script>
Vue 3 中的 <keep-alive>
Vue 3 保留了 <keep-alive>
的基本用法和功能,但做了一些改进和性能优化。与Vue 2相比,Vue 3的 <keep-alive>
在处理组件缓存时更加高效,尤其是在组件树重建时。
Vue 3 的 <keep-alive>
同样支持 include
、exclude
和 max
属性,用法与Vue 2相同。但是,Vue 3的响应式系统和组合式API(Composition API)为 <keep-alive>
提供了更多的灵活性和控制力。
例如,在Vue 3中,你可以结合使用 <keep-alive>
和 <teleport>
来将缓存的组件移动到DOM的不同位置,或者利用Composition API中的响应式状态来控制缓存的行为。
性能优化
Vue 3 在多个方面对 <keep-alive>
进行了性能优化,包括更快的组件实例化、更好的内存管理和更智能的缓存策略。这些优化使得在Vue 3中使用 <keep-alive>
时,能够更高效地处理大量组件的缓存和复用。
Vuex与Pinia
Vue的状态管理——Vuex3&4&Pinia-CSDN博客
防止恶意登录
SQL注入、XSS攻击
XSS攻击-CSDN博客
WebSocket
聊天室,应用
轮询
Set与Map
Set
Set
对象允许你存储任何类型的唯一值,无论是原始值或者是对象引用。它有以下特点:
- 唯一性:
Set
中的元素是唯一的,不会出现重复的值。 - 无序性:
Set
中的元素没有特定的顺序,你无法通过索引来访问Set
中的元素。
使用场景
-
去重:这是
Set
最直接和常用的功能。你可以通过将一个数组转换为Set
来快速去除其中的重复元素。
const array = [1, 2, 2, 3, 4, 4, 5];
const uniqueArray = [...new Set(array)];
console.log(uniqueArray); // [1, 2, 3, 4, 5]
-
对象集合:当需要存储不重复的对象时,
Set
可以作为一个有效的集合来使用。不过需要注意的是,即使对象的内容相同,但如果它们是不同的对象实例,也会被Set
视为不同的元素。 -
交集、并集、差集操作:利用
Set
提供的add
、delete
、has
等方法,可以方便地进行集合操作。
Map
Map
对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值)都可以作为一个键或一个值。
- 键值对:
Map
中的每个元素都是一个键值对。 - 有序性:
Map
记住了元素的插入顺序,因此你可以通过迭代来按顺序访问其中的元素。 - 键的唯一性:
Map
中的键是唯一的。
使用场景
-
需要记住元素插入顺序的场景:当你想根据元素的插入顺序来访问它们时,
Map
是一个很好的选择。 -
键是复杂数据类型的场景:与对象不同,
Map
的键可以是任何数据类型,包括函数、对象或任何原始值。这意味着,如果键是对象,则只要两个键对象引用的是同一个对象,Map
就会将它们视为相同的键。 -
性能敏感的场景:在一些情况下,当你需要频繁地访问数据并且性能是关键考虑因素时,
Map
可能比对象更高效,特别是在涉及到复杂键时。 -
数据映射:当你想实现数据之间的映射关系时,
Map
提供了一个直观且方便的方式来存储和访问这些数据。
JS多线程
Web Workers
是 JavaScript 的一种机制,它允许你在与主线程(通常是UI线程)分离的后台线程中运行脚本。这样做的好处是,你可以执行耗时的计算或操作而不会阻塞用户界面。这对于需要处理大量数据或复杂计算的Web应用尤其有用。
基本概念
- 主线程:负责执行脚本、处理事件、渲染UI等。
- Worker 线程:运行在后台的脚本,不会干扰主线程的UI渲染。
- 消息传递:主线程和 Worker 线程之间通过传递消息来通信,而不是直接共享内存。
如何使用 Web Workers
1. 创建一个 Worker
首先,你需要创建一个指向 Worker 脚本的 URL。这个脚本会在 Worker 线程中运行。
const myWorker = new Worker('worker.js');
2. 监听 Worker 的消息
你可以在主线程中监听来自 Worker 的消息。
myWorker.onmessage = function(e) {
console.log('Received message from worker:', e.data);
};
3. 向 Worker 发送消息
你可以使用 postMessage()
方法向 Worker 发送消息。
myWorker.postMessage('Hello Worker!');
4. Worker 脚本
在 worker.js
文件中,你可以使用 self
(等同于 Worker 线程的全局对象)来接收消息并发送响应。
self.onmessage = function(e) { console.log('Message received from main script', e.data); // 处理数据 const result = e.data.toUpperCase(); // 将结果发送回主线程 self.postMessage(result);
};
5. 错误处理
监听 Worker 线程中的错误。
myWorker.onerror = function(error) { console.error('Worker error:', error);
};
6. 终止 Worker
当不再需要 Worker 时,你可以调用 terminate()
方法来停止它。
myWorker.terminate();
进阶使用
- 多个 Worker:你可以创建多个 Worker 来并行处理任务。
- 数据共享:虽然 Worker 之间不能直接共享内存,但可以使用
postMessage()
传递数据,或使用SharedArrayBuffer
和Atomics
(在支持的环境下)来在 Worker 之间共享和同步数据。 - Worker 之间的通信:Worker 之间不能直接通信,但可以通过主线程作为中介来间接通信。
- 模块化 Worker:在 Worker 脚本中使用 ES6 模块,可以更好地组织代码和重用功能。
注意事项
- 同源策略:Worker 脚本必须与创建它的脚本同源(协议、端口和主机名必须相同)。
- 性能考虑:虽然 Worker 可以提高应用的响应性,但它们也会消耗额外的内存和CPU资源。
- 浏览器兼容性:虽然大多数现代浏览器都支持 Web Workers,但在使用之前最好检查目标浏览器的兼容性。
通过合理使用 Web Workers,你可以显著提升 Web 应用的性能和用户体验。
webworker需要后端支持
浏览器网络与安全
计算机网络面试常见题目(一)-CSDN博客
计算机网络速成(二)-CSDN博客
计算机网络速成(三)-CSDN博客
计算机网络系统速成-CSDN博客
相关文章:

前端JS常见面试题
数据双向绑定 Bug解决 集成工作涉及 版本node 依赖包报错 版本问题!!!ElementUI、Cesium、ant-design 配置、代码和其他 混入 在Vue中,混入(Mixins)是一种非常有用的功能,它允许你创建可复…...

利用深度学习实现验证码识别-4-ResNet18+imagecaptcha
在当今的数字化世界中,验证码(CAPTCHA)是保护网站免受自动化攻击的重要工具。然而,对于用户来说,验证码有时可能会成为一种烦恼。为了解决这个问题,我们可以利用深度学习技术来自动识别验证码,从…...

IDC基础学习笔记
一、数据中心介绍 1、数据中心级别划分: 2、数据中心结构: 3、IT系统组成 二、数据中心硬件知识 1、服务器组件 服务器的正面接口: 服务器的反面接口: (1)CPU CPU定义:中央处理器(…...

Mysql基础练习题 1527.患某种疾病的患者 (力扣)
查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1 。 题目链接: https://leetcode.cn/proble…...

Mysql链接异常 | [08001] Public Key Retrieval is not allowed
Datagrid报错 [08001] Public Key Retrieval is not allowed 这个错误通常是由于 MySQL 8.0 中的新特性导致的。默认情况下,MySQL 8.0 使用 caching_sha2_password 作为认证插件,而你需要在连接 URL 中明确允许公钥检索或者使用老版本的认证方式 mysql…...

vue3项目中如何动态循环设置ref并获取使用
前言:vue2可通过ref来获取当前的dom,但是vue3有个问题,就是必须定义ref的变量名,才能使用;倘若有多个ref,一个个去定义未免过于繁琐,还有一种情况就是dom是使用v-for循环出来的,那么…...

stm32之SPI通信协议
文章目录 前言一、SPI通信协议1.1 SPI简介1.2 SPI通信特点1.3 SPI与I2C对比 二、SPI硬件电路三、SPI通信原理四、SPI时序单元4.1 起始和终止条件4.2 交换一个字节(模式1)4.3 交换一个字节(模式0)4.4 交换一个字节(模式2和3) 五、SPI时序5.1 发送指令5.2 指定地址写5.3 指定地址…...

Unity 摄像机(Camera)详解
文章目录 0.前言1.相机属性介绍2.Unity 中多个相机画面堆叠显示2.1 3D 摄像机2.2 UI 摄像机2.3 摄像机的Culling Mask设置 0.前言 本文介绍的是使用Unity默认的内置渲染管线下的Camera组件,使用URP或HDRP则不同。 1.相机属性介绍 Clear Flags: 清除标记…...

数学基础 -- 线性代数之LU分解
LU分解 LU分解(LU Decomposition)是线性代数中非常重要的一种矩阵分解方法。它将一个方阵分解为一个下三角矩阵(L矩阵)和一个上三角矩阵(U矩阵)的乘积。在数值线性代数中,LU分解广泛用于求解线…...

高职人工智能训练师边缘计算实训室解决方案
一、引言 随着物联网(IoT)、大数据、人工智能(AI)等技术的飞速发展,计算需求日益复杂和多样化。传统的云计算模式虽在一定程度上满足了这些需求,但在处理海量数据、保障实时性与安全性、提升计算效率等方面…...

【Java】SpringCloud中使用set方法报错空指针
前言:今天在交流群中看见了一个空指针报错,想着哪里为空点过去看看为什么赋不上值就行,没想到啪啪打脸了,今天总结一下。 以下是他的RedisTempate注入和方法 可以看到,89行报错空指针。先分析一下, ①赋值…...

芯片杂谈 -- 常聊的内核包含哪些模块
目录 1. R52内核速览 2. 处理器模块详解 3.内核的功能安全测什么? 4.小结 最开始接触到汽车MCU大都来自NXP、Infineon、Renesas,例如MPC5748、TC275、RH850 P1X等等; 而各大OEM、供应商等等发布的JD通常都会要求熟悉AURIX、PowerPC、G3K…...

运维问题0002:SAP多模块问题-SAP系统程序在执行时,跳出“加急快件”窗口,提示:快件文档“更新已终止”从作者***收到
1、问题描述 近期收到2起业务报障,均反馈在SAP执行程序时,弹出“加急快件”窗口,导致操作的业务实际没有更新完成。 1)业务场景一:设备管理部门在操作事务代码:AS02进行资产信息变更时,保存正常…...

深度解析RAG:你必须要了解的RAG优化方法
RAG(Retrieval-Augmented Generation)是一种结合检索和生成能力的技术框架,旨在通过从外部知识库中检索相关信息来增强生成模型的输出。其基本思想是利用大型语言模型(LLM)的生成能力,同时通过检索机制获取…...

深度学习驱动下的字符识别:挑战与创新
一、引言 1.1 研究背景 深度学习在字符识别领域具有至关重要的地位。随着信息技术的飞速发展,对字符识别的准确性和效率要求越来越高。字符识别作为计算机视觉领域的一个重要研究方向,其主要目的是将各种形式的字符转换成计算机可识别的文本信息。近年…...

使用 JAXB 将内嵌的JAVA对象转换为 xml文件
使用 JAXB 将内嵌的JAVA对象转换为 xml文件 1. 需求2. 实现(1)FileDesc类(2)MetaFileXml类(3)生成对应的xml文件 1. 需求 获取一个目录下所有文件的元数据信息(文件名、大小、后缀等࿰…...

若依项目后台启动报错: [网关异常处理]、503
拉取代码启动项目,网关控制台报错: 21:31:59.981 [boundedElastic-7] WARN o.s.c.l.c.RoundRobinLoadBalancer - [getInstanceResponse,98] - No servers available for service: ruoyi-system 21:31:59.981 [boundedElastic-7] ERROR c.r.g.h.Gateway…...

【C++ Qt day10】
2、 完善对话框,点击登录对话框,如果账号和密码匹配,则弹出信息对话框,给出提示”登录成功“,提供一个Ok按钮,用户点击Ok后,关闭登录界面,跳转到其他界面 如果账号和密码不匹配&am…...

GO HTTP库使用
Go的 net/http 包是一个强大且易于使用的库,用于构建HTTP服务器和客户端。通过它,你可以轻松实现HTTP请求的处理、路由、静态文件服务等功能。下面重点以及一个简单的Demo示例。 文章目录 1. **基础HTTP服务器**2. **处理请求与响应**3. **路由与处理器*…...

数据结构 - 顺序表
0.线性表 1.定义 线性表就是零个或多个相同数据元素的有限序列。 2.线性表的存储结构 ①.顺序结构 ②.链式结构 3.线性表的表示方法 例如: 一.线性表的基本运算 二.线性表的复杂运算 1.线性表的合并运算 2.线性表的去重运算 三.顺序表 1.定义 顺序表,就…...

企业如何组建安全稳定的跨国通信网络?
组建一个安全稳定的跨国通信网络对于现代企业来说至关重要,尤其是当企业在全球范围内运营时。以下是一些关键步骤和考虑因素: 需求分析: 确定企业的具体通信需求,包括带宽要求、延迟敏感度、数据类型(如语音、视频、文…...

OCR在线识别网站现已上线!
注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 由作者亲自开发的ocr识别网站哈哈,暂时汇聚了三十多种验证码模型以及算法,欢迎各路朋友去尝试,网站地址如下 http://gbj5w3.natappfree.cc/ocr 验证码类型包括但…...

排名再升2位 中国平安位列BrandZ最具价值中国品牌第9位
9月10日,凯度华通明略发布“2024年BrandZ最具价值中国品牌”榜单,中国平安位列榜单第9位,较2023年榜单排名上升2位,品牌价值韧性增长至205.14亿美元,十度蝉联中国保险行业品牌价值第一位。榜单特别提到,中国…...

k8s集群部署:环境准备
本教程基于centos9 arm架构展开。 1. 设置主机名 为每个节点设置主机别名,以便于集群中的角色识别: # 设置主节点的主机名为 kmaster sudo hostnamectl set-hostname kmaster --static# 设置工作节点1的主机名为 kworker1 sudo hostnamectl set-hostn…...

<C++> set、map模拟实现
目录 一、适配器红黑树 二、红黑树再设计 1. 重新设计 RBTree 的模板参数 2. 仿函数模板参数 3. 正向迭代器 构造 operator*() operator->() operator!() operator() operator--() 正向迭代器代码 4. 反向迭代器 构造 operator* operator-> operator operator-- operat…...

软考学习 数据结构 查找
1. 顺序查找(Sequential Search) 基本原理: 顺序查找是一种最简单、最直观的查找算法。它从数据集合的第一个元素开始,依次与目标元素进行比较,直到找到目标元素或遍历完所有元素为止。 适用条件: 适用…...

h264 视频流中添加目标检测的位置、类型信息到SEI帧
在 H.264 视频编码中,SEI(Supplemental Enhancement Information)消息用于传输额外的、非编码的数据,例如目标检测的信息。SEI 数据可以嵌入到 H.264 流中,以在解码过程中传递这些附加信息。 一、步骤 确定 SEI 类型&…...

大模型api谁家更便宜
1 openai 可点此链接查询价格:https://openai.com/api/pricing/ 2 百度 可点此链接查询价格:https://console.bce.baidu.com/qianfan/chargemanage/list 需要注意,百度千帆平台上还提供其他家的模型调用服务, 如llama, yi-34b等…...

代码随想录算法训练营第二十三天| 455. 分发饼干、376. 摆动序列、53. 最大子序和
今日内容 贪心理论基础Leetcode. 455 分发饼干Leetcode. 376 摆动序列Leetcode. 53 最大子序和 贪心理论基础 贪心算法的本质就是选择每一阶段的最优,达到全局上的最优。 贪心算法和之前学到的所有方法相比,它没有固定的使用套路,也没有固…...

react js 路由 Router
完整的项目,我已经上传了 资料链接 起因, 目的: 路由, 这部分很难。 原因是, 多个组件,进行交互,复杂度比较高。 我看的视频教程 1. 初步使用 安装: npm install react-router-dom 修改 index.js/ 或是 main.js 把 App, 用 BrowserRouter 包裹起来 2. Navigate 点击…...