前端面试题汇总2
1. CSS 中两个 .class1 .class2 从哪个开始解析
在 CSS 中,选择器 .class1 .class2 表示所有 class 为 class1 的元素中的 class 为 class2 的子元素。浏览器解析这个选择器时,从右向左解析。也就是说,浏览器首先找到所有 class 为 class2 的元素,然后检查这些元素的父级元素是否有 class1,从而应用样式。
.class1 .class2 {color: red;
}
2. Flex 布局相关的问题
Flexbox 是一种一维布局模型,可以在一个方向上高效地分配空间并对齐内容。以下是一些常见的 Flex 布局属性:
display: flex: 将容器变为 flex 容器。flex-direction: 定义主轴方向。取值有row(默认)、row-reverse、column、column-reverse。justify-content: 定义主轴上的对齐方式。取值有flex-start、flex-end、center、space-between、space-around、space-evenly。align-items: 定义交叉轴上的对齐方式。取值有stretch(默认)、flex-start、flex-end、center、baseline。flex-wrap: 定义是否换行。取值有nowrap(默认)、wrap、wrap-reverse。
3. JS 的事件循环
JavaScript 是单线程的,使用事件循环来处理异步操作。事件循环的基本步骤:
- 执行栈:同步代码逐行执行,函数调用形成执行栈。
- 任务队列:异步操作(如
setTimeout、Promise)完成后,将回调函数放入任务队列。 - 事件循环:不断检查执行栈是否为空,如果为空则从任务队列中取出第一个任务并执行。
console.log('start');
setTimeout(() => {console.log('timeout');
}, 0);
console.log('end');// 输出顺序: start -> end -> timeout
4. 写题:解析 URL,history 模式和 hash 模式的混在一起
function parseURL(url) {const parser = document.createElement('a');parser.href = url;return {protocol: parser.protocol,hostname: parser.hostname,port: parser.port,pathname: parser.pathname,search: parser.search,hash: parser.hash,host: parser.host};
}const url = 'https://www.example.com:8080/pathname/?search=test#hash';
console.log(parseURL(url));
5. 写题:解析时间
function formatDate(date) {const yyyy = date.getFullYear();const mm = String(date.getMonth() + 1).padStart(2, '0');const dd = String(date.getDate()).padStart(2, '0');const hh = String(date.getHours()).padStart(2, '0');const min = String(date.getMinutes()).padStart(2, '0');const ss = String(date.getSeconds()).padStart(2, '0');return `${yyyy}-${mm}-${dd} ${hh}:${min}:${ss}`;
}const date = new Date();
console.log(formatDate(date));
6. 缓存相关问题
强缓存和协商缓存是 HTTP 缓存机制中的两种缓存策略:
- 强缓存:不会向服务器发送请求,直接从缓存中读取资源。常见的头部字段有
Expires和Cache-Control。 - 协商缓存:会向服务器发送请求,服务器根据资源的状态决定是否使用缓存。常见的头部字段有
Last-Modified和ETag。
一般存储较静态且不频繁更新的数据,如静态资源(CSS、JS、图片等)。
7. async 和 defer 的区别
async:异步加载脚本,脚本下载完成后立即执行,不保证顺序。defer:异步加载脚本,脚本下载完成后按顺序执行,保证在文档解析完成后执行。
<script src="script1.js" async></script>
<script src="script2.js" async></script><script src="script1.js" defer></script>
<script src="script2.js" defer></script>
8. Vue 的渲染机制
Vue 的渲染机制分为以下几个步骤:
- 初始化:解析模板,生成渲染函数。
- 响应式数据:数据变更时触发视图更新。
- 虚拟 DOM:每次渲染都会生成虚拟 DOM。
- diff 算法:比较新旧虚拟 DOM,找出变化。
- 更新 DOM:应用 diff 结果,更新真实 DOM。
HTML 的 doctype 有什么用
<!DOCTYPE html> 声明位于 HTML 文档的开头,用于告诉浏览器当前文档使用的是 HTML5 标准。它的主要作用是让浏览器以标准模式(standard mode)来解析和渲染网页,避免进入怪异模式(quirks mode),确保网页在不同浏览器中有一致的表现。
script 和 link 标签的加载顺序
-
<script>标签:默认情况下,脚本会按顺序同步加载和执行。如果在<head>中包含<script>标签,页面会在脚本执行完成后才继续加载。可以通过async和defer属性来改变默认行为:async:脚本异步加载,加载完成后立即执行,不保证顺序。defer:脚本异步加载,加载完成后按顺序执行,保证在文档解析完成后执行。
-
<link>标签:用于加载外部资源(如 CSS)。默认情况下,CSS 是同步加载和解析的,会阻塞渲染。
iframe 有了解过吗
iframe 元素用于在当前网页中嵌入另一个 HTML 文档。常见用途包括嵌入第三方内容(如广告、视频)、隔离 CSS 和 JavaScript 的作用域。使用 iframe 时需要注意安全问题,如跨站脚本(XSS)攻击,可以通过设置 sandbox 属性来限制 iframe 的行为。
行内元素水平垂直居中
对于一个行内元素或行内块元素,可以使用以下方法来实现水平和垂直居中:
- 水平居中:使用
text-align: center; - 垂直居中:如果父元素是一个 flex 容器,可以使用
align-items: center和justify-content: center。
例如:
<div style="display: flex; justify-content: center; align-items: center; height: 200px;"><span>Centered</span>
</div>
innerHTML 和 innerText 区别
innerHTML:返回或设置元素的 HTML 内容,包括 HTML 标签。innerText:返回或设置元素的文本内容,不包含 HTML 标签,受 CSS 样式影响(如display: none的元素不会包含在内)。
修改 DOM 耗时?为什么
修改 DOM 可能是耗时的,因为每次对 DOM 的修改都会触发浏览器的重绘(repaint)或回流(reflow),尤其是回流会涉及布局计算、重新渲染等一系列操作。频繁操作 DOM 会导致性能下降,建议使用批量操作或虚拟 DOM 来优化性能。
重绘(Repaint)和回流(Reflow)
- 重绘:元素的外观发生改变(如颜色、背景)但没有影响布局时,浏览器会重新绘制元素。
- 回流:元素的布局或几何属性发生改变(如大小、位置),会触发浏览器重新计算布局和渲染树,代价比重绘高。
Promise 的意义(回调地狱)
Promise 用于处理异步操作,以更直观和可读的方式管理异步任务,避免回调地狱。回调地狱是指回调函数嵌套过深,代码难以维护和调试。Promise 通过链式调用 .then() 方法解决这一问题:
fetchData().then(response => process(response)).then(result => display(result)).catch(error => handleError(error));
回调和闭包
- 回调:将一个函数作为参数传递给另一个函数,并在特定事件发生时调用该函数。常用于处理异步操作。
- 闭包:函数和其外部环境的引用组合形成闭包。闭包允许函数访问外部函数作用域中的变量,即使在外部函数执行完毕之后。闭包常用于创建私有变量和函数。
function createCounter() {let count = 0;return function() {return ++count;};
}const counter = createCounter();
console.log(counter()); // 1
console.log(counter()); // 2
这个示例中,返回的匿名函数形成闭包,持有对 count 变量的引用,因此可以在每次调用时增加 count 的值。
6. Webpack为什么打包、进行压缩之后,性能就会提高呢
Webpack 打包和压缩提高性能的原因
-
文件合并:
- 减少 HTTP 请求:Webpack 将多个模块和依赖合并成一个或多个文件,减少了浏览器发起的 HTTP 请求次数。现代浏览器对并行请求的数量有限制,减少请求数可以降低延迟和开销。
-
代码压缩:
- 文件大小减少:Webpack 使用工具(如 UglifyJS、Terser)压缩代码,去掉空格、注释和冗余代码,极大地减少了文件大小。文件越小,传输时间越短。
-
代码分割:
- 按需加载:Webpack 可以根据应用的需要进行代码分割(Code Splitting),只加载当前页面所需的代码。这样可以避免一次性加载所有代码,提升页面初始加载性能。
-
树摇(Tree Shaking):
- 去除无用代码:Webpack 通过静态分析模块的依赖关系,去除没有实际使用的代码(Dead Code),从而减少打包后的文件体积。
-
模块热替换(HMR):
- 开发效率:Webpack 提供模块热替换功能,在开发过程中只更新变化的部分,而不是整个页面,提升开发效率和体验。
示例配置:
const TerserPlugin = require('terser-webpack-plugin');module.exports = {mode: 'production',optimization: {minimize: true,minimizer: [new TerserPlugin()],splitChunks: {chunks: 'all',},},
};
7. 为什么使用 Webpack
使用 Webpack 的理由
-
模块化支持:
- 多种模块格式:支持 ES6 模块、CommonJS、AMD 等模块格式,使开发者可以使用最新的 JavaScript 语法和标准。
-
强大的插件系统:
- 功能扩展:Webpack 提供丰富的插件(Plugins),如压缩、分包、代码分割等,方便扩展打包功能。
-
代码分割和懒加载:
- 优化性能:通过代码分割(Code Splitting)和懒加载(Lazy Loading),提升应用性能,减少初始加载时间。
-
开发工具集成:
- 热模块替换(HMR):实时更新代码,提高开发效率和体验。
- 开发服务器:内置开发服务器(Webpack Dev Server),支持快速开发和调试。
-
配置灵活:
- 高可定制性:可以根据项目需求灵活配置,适应各种复杂场景。
-
生态系统:
- 社区和插件:强大的社区支持和丰富的插件库,方便解决各种问题。
8. 手写:数组实现 reduce、map
手写 reduce 实现
reduce 方法接收一个回调函数和一个可选的初始值,通过回调函数累计处理数组的每个元素,最终返回累计结果。
Array.prototype.myReduce = function(callback, initialValue) {let accumulator = initialValue === undefined ? this[0] : initialValue;let startIndex = initialValue === undefined ? 1 : 0;for (let i = startIndex; i < this.length; i++) {accumulator = callback(accumulator, this[i], i, this);}return accumulator;
};// 使用示例
const arr = [1, 2, 3, 4];
const sum = arr.myReduce((acc, curr) => acc + curr, 0);
console.log(sum); // 10
手写 map 实现
map 方法接收一个回调函数,返回一个新数组,每个元素为回调函数处理后的结果。
Array.prototype.myMap = function(callback) {const result = [];for (let i = 0; i < this.length; i++) {result.push(callback(this[i], i, this));}return result;
};// 使用示例
const arr = [1, 2, 3, 4];
const doubled = arr.myMap(num => num * 2);
console.log(doubled); // [2, 4, 6, 8]
这些实现展示了如何用原生 JavaScript 来实现常用的数组方法,了解其内部工作原理。
相关文章:
前端面试题汇总2
1. CSS 中两个 .class1 .class2 从哪个开始解析 在 CSS 中,选择器 .class1 .class2 表示所有 class 为 class1 的元素中的 class 为 class2 的子元素。浏览器解析这个选择器时,从右向左解析。也就是说,浏览器首先找到所有 class 为 class2 的…...
分布式服务框架zookeeper+消息队列kafka
一、zookeeper概述 zookeeper是一个分布式服务框架,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:命名服务,状态同步,配置中心,集群管理等。 在分布式环境下,经常需要对应用/服…...
服务攻防-应用协议cve
Cve-2015-3306 背景: ProFTPD 1.3.5中的mod_copy模块允许远程攻击者通过站点cpfr和site cpto命令读取和写入任意文件。 任何未经身份验证的客户端都可以利用这些命令将文件从文件系统的任何部分复制到选定的目标。 复制命令使用ProFTPD服务的权限执行,…...
Springcloud之gateway的使用详解
官网地址:https://docs.spring.io/spring-cloud-gateway/docs/4.0.4/reference/html/ 1.网关入门 helloword 网关不依赖start-web 导入的pom: <!--gateway--> <dependency><groupIdorg.springframework.cloud</groupId><arti…...
中望CAD 建筑 v2024 解锁版下载、安装教程 (超强的CAD三维制图)
前言 中望CAD建筑版是一款国产CAD制图软件,专注于建筑设计领域。中望CAD建筑版拥有丰富多样的建筑图块和图案,完美兼容各类建筑图纸。同时,它提供了绘图标准规范,使绘图更加规范和专业。更值得一提的是,该软件还具备智…...
windows edge自带的pdf分割工具(功能)
WPS分割pdf得会员,要充值!网上一顿乱找,发现最简单,最好用,免费的还是回到Windows。 Windows上直接在edge浏览器打开PDF,点击 打印 按钮,页面下选择对应页数 打印机 选择 另存为PDF,然后保存就…...
HTML5实现好看的天气预报网站源码
文章目录 1.设计来源1.1 获取天气接口1.2 PC端页面设计1.3 手机端页面设计 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_4…...
比较(八)利用python绘制指示器
比较(八)利用python绘制指示器 指示器(Indicators)简介 指示器是一系列相关图的统称,主要用于突出展示某一变量的实际值与目标值的差异,例如常见的数据delta、仪表盘、子弹图、水滴图等。 快速绘制 基于p…...
【体外诊断】ARM/X86+FPGA嵌入式计算机在医疗CT机中的应用
体外诊断 信迈科技提供基于Intel平台、AMD平台、NXP平台的核心板、2.5寸主板、Mini-ITX主板、4寸主板、PICO-ITX主板,以及嵌入式准系统等计算机硬件。产品支持GAHDMI等独立双显,提供丰富串口、USB、GPIO、PCIe扩展接口等I/O接口,扩展性强&…...
力扣 28找到字符串中第一个匹配项的下标 KMP算法
思路: 朴素匹配有很多步骤是多余的 KMP算法能够避免重复匹配 KMP算法主要是根据子串生成的next数组作为回退的依据,它记录了模式串与主串(文本串)不匹配的时候,模式串应该从哪里开始重新匹配。 这里讲一下为什么用模式串的最大公共前后缀…...
JavaScript(10)——匿名函数
匿名函数 没有名字的函数,无法直接使用。 使用方式: 函数表达式立即执行函数 函数表达式 将匿名函数赋值给一个变量,并且通过变量名称进行调用 let fn function(){ 函数体 } 调用: fn() 立即执行函数 语法: (function () {…...
图片上传成功却无法显示:静态资源路径配置问题解析
1、故事的背景 最近,有个学弟做了一个简单的后台管理页面。于是他开始巴拉巴拉撘框架,写代码,一顿操作猛如虎,终于将一个简单的壳子搭建完毕。但是在实现功能:点击头像弹出上传图片进行头像替换的时候,卡壳…...
【转盘案例-弹框-修改Bug-完成 Objective-C语言】
一、我们来看示例程序啊 1.旋转完了以后,它会弹一个框,这个框,是啥, Alert 啊,AlertView 也行, AlertView,跟大家说过,是吧,演示过的啊,然后,我们就用iOS9来做了啊,完成了以后,我们要去弹一个框, // 弹框 UIAlertController *alertController = [UIAlertContr…...
Perl 基础语法
Perl 基础语法 Perl 是一种高级、解释型、动态编程语言,广泛用于CGI脚本、系统管理、网络编程、以及其他领域。Perl 以其强大的文本处理能力和简洁的语法而闻名。本文将详细介绍 Perl 的基础语法,帮助读者快速入门。 1. Perl 变量和数据类型 1.1 变量…...
【嵌入式开发之标准I/O】二进制文件的读写及实验
文本文件和二进制的区别 文本文件和二进制文件的区别主要在于它们的编码方式和数据组织方式。 编码方式:文本文件是基于字符编码的文件,常见的编码有ASCII编码、UNICODE编码等。这些编码将字符映射到特定的二进制值,使得字符可以…...
Arduino学习笔记1——IDE安装与起步
一、IDE安装 去浏览器直接搜索Arduino官网,点击Software栏进入下载界面,选择Windows操作系统: 新版IDE下载不需要提前勾选所下载的拓展包,下载好后直接点击安装即可。 安装好后打开Arduino IDE,会自动开始下载所需的…...
一个注解解决重复提交问题
一、前言 在应用系统中提交是一个极为常见的功能,倘若不加管控,极易由于用户的误操作或网络延迟致使同一请求被发送多次,从而生成重复的数据记录。针对用户的误操作,前端通常会实现按钮的 loading 状态,以阻…...
在qt的c++程序嵌入一个qml窗口
//拖拽一个QQuickWidget c端和qml通信的桥梁 找到qml的main.qml的路径 ui->quickWidget->setSource(QUrl::fromLocalFile("../../../code/main.qml"));// QML 与 Qt Widgets 通信//窗口就成了一个类实例对象pRoot (QObject*)ui->quickWidget->rootObje…...
Vue的依赖注入:组件树中的共享数据与功能
引言 在构建大型前端应用时,组件间的通信和状态共享是一个常见问题。Vue.js 提供了一种类似于 React 的 Context 机制的依赖注入系统,允许开发者在组件树中共享数据和功能。provide 和 inject 是 Vue 依赖注入的两个关键概念。本文将深入探讨 Vue 的依赖注入机制,讨论如何使…...
softmax 函数的多种实现方式 包括纯C语言、C++版本、Eigen版本等
softmax 函数的多种实现方式 包括纯C语言、C版本、Eigen版本等 flyfish 先看这里Softmax函数介绍 版本1 规矩的写法 #include <iostream> #include <vector> #include <algorithm> #include <numeric> #include <cmath>// 计算 softmax 的函…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
