前端面试题汇总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 的函…...
R语言学习笔记11-读取csv-xlsx-txt-json-pdf-lua格式文件
R语言学习笔记11-读取csv-xlsx-txt-json-pdf-lua格式文件 读取csv使用base的 read.csv 函数使用 readr 包的 read_csv 函数 读取xlsx使用 xlsx 包的 read.xlsx 函数使用 readxl 包的 read_excel 函数 读取txt使用base的文件读取函数 readLines使用 readr 包的 read_lines 函数 …...
Vue的计算属性和方法有什么区别
Vue中的计算属性(computed)和方法(methods)都是用于处理数据和逻辑的重要特性,但它们之间存在一些关键的区别。以下是两者的主要区别: 1. 缓存性 计算属性:计算属性是基于它们的依赖进行缓存的…...
学生成绩管理系统(C语言)
系统分析 1. 主菜单的实现 2. 增加人员功能的实现 3. 删除数据功能的实现 4. 编辑人员功能的实现 5. 排序功能的实现 6. 输出功能 7. 查找信息功能 具体代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #define SIZE 100000typedef struc…...
C语言 通讯录管理 完整代码
这份代码,是我从网上找的。目前是能运行。我正在读。有些不懂的地方,等下再记录下来。 有些地方的命名,还需要重新写一下。 比如: PersonInfo* info &address_book->all_address[address_book->size]; 应该改为: Perso…...
2024北京国际智能工厂及自动化展览会亮点前瞻
随着“工业创新,智造未来”的浪潮席卷而来,2024年度北京国际智能工厂及自动化与工业装配展览会定于8月1日至3日在中国国际展览中心(顺义新馆)盛大开幕。本次展会汇聚了智能制造与自动化技术的最新成果,通过三展联动的创…...
《网络安全等级保护制度详解》
网络安全等级保护制度是我国网络安全领域的一项重要制度,旨在保障网络安全,维护国家安全、社会秩序和公共利益。 网络安全等级保护制度主要包含以下几个关键方面: 等级划分 根据信息系统在国家安全、经济建设、社会生活中的重要程度ÿ…...
使用Wanderboat AI 来规划到巴黎的旅行计划
Wanderboat AI 平台是一个由 GPT-4 驱动的智能旅行规划工具,旨在通过自然对话和多模式互动,为用户提供个性化的旅行行程。以下是该平台的架构和使用方法: 平台架构 GPT-4 驱动:平台利用 GPT-4 的强大自然语言处理能力&#x…...
基于YOLO8的目标检测系统:开启智能视觉识别之旅
文章目录 在线体验快速开始一、项目介绍篇1.1 YOLO81.2 ultralytics1.3 模块介绍1.3.1 scan_task1.3.2 scan_taskflow.py1.3.3 target_dec_app.py 二、核心代码介绍篇2.1 target_dec_app.py2.2 scan_taskflow.py 三、结语 在线体验 基于YOLO8的目标检测系统 基于opencv的摄像头…...
实验07 接口测试postman
目录 知识点 1 接口测试概念 1.1为什么要做接口测试 1.2接口测试的优点 1.3接口测试概念 1.4接口测试原理和目的 2 接口测试内容 2.1测什么 2.1.1单一接口 2.1.2组合接口 2.1.3结构检查 2.1.4调用方式 2.1.5参数格式校验 2.1.6返回结果 2.2四大块 2.2.1功能逻辑…...
C++常用但难记的语法
模板函数的声明和定义必须在同一个文件中。 C中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的对象的所占用的空间的大小的。只有模板被真正使用的时…...
广告平台源码/seo可以从哪些方面优化
PyInstaller的原理简介PyInstaller其实就是把python解析器和你自己的脚本打包成一个可执行的文件,和编译成真正的机器码完全是两回事,所以千万不要指望成打包成一个可执行文件会提高运行效率,相反可能会降低运行效率,好处就是在运…...
平顶山做网站的公司/市场推广计划方案模板
微信公众号搜索 DevOps和k8s全栈技术 ,或者扫描文章最后的二维码,即可关注公众号,每天会分享技术文章供大家阅读参考哈~正文etcd 是基于 raft算法的分布式键值数据库,生来就为集群化而设计的,由于Raft算法在做决策时需…...
wordpress改wp admin/软文营销名词解释
题目: 0,1,...n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字,求出这个圆圈里剩下的最后一个数字。 思路: 1、环形链表模拟圆圈 创建一个n个节点的环形链表,然后每次在这个链表中删除…...
什么事网站建设/廊坊seo排名
转载自:http://youchunyan5.blog.163.com/blog/static/5896062020123474456352/ 本机php环境搭建教程:windows环境下wampserver的配置教程——超级详细 2012-01-25 14:28对于初做PHP网站的朋友来说,第一步肯定是希望在自己电脑是搭建PHP环境&…...
学校网站建设方案论文/网站权重是什么意思
我们不常用但是比较实用的SHELL脚本:1、apt-get install sl 这时候忘记了sudo ,那么只要执行sudo !!,!!表示上一条命令2、vi hello.c 退出后,如果想打开刚才的hello.c文件,只需要!vi3、man ascii 来查看ascii码表4、ec…...
信阳高端网站建设/凡科建站
jQuery演示代码段可将QuickTime视频播放器动态插入您的网页。 这是带有最少控件的原始视频播放,如果要自定义,可以非常容易地在播放器对象中设置参数。 要使用该代码,请记住要更改视频的网址,并且您需要一个id为“ player”的div。…...