当前位置: 首页 > news >正文

前端面试题汇总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-reversecolumncolumn-reverse
  • justify-content: 定义主轴上的对齐方式。取值有 flex-startflex-endcenterspace-betweenspace-aroundspace-evenly
  • align-items: 定义交叉轴上的对齐方式。取值有 stretch(默认)、flex-startflex-endcenterbaseline
  • flex-wrap: 定义是否换行。取值有 nowrap(默认)、wrapwrap-reverse

3. JS 的事件循环

JavaScript 是单线程的,使用事件循环来处理异步操作。事件循环的基本步骤:

  1. 执行栈:同步代码逐行执行,函数调用形成执行栈。
  2. 任务队列:异步操作(如 setTimeoutPromise)完成后,将回调函数放入任务队列。
  3. 事件循环:不断检查执行栈是否为空,如果为空则从任务队列中取出第一个任务并执行。
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 缓存机制中的两种缓存策略:

  • 强缓存:不会向服务器发送请求,直接从缓存中读取资源。常见的头部字段有 ExpiresCache-Control
  • 协商缓存:会向服务器发送请求,服务器根据资源的状态决定是否使用缓存。常见的头部字段有 Last-ModifiedETag

一般存储较静态且不频繁更新的数据,如静态资源(CSS、JS、图片等)。

7. asyncdefer 的区别

  • 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 的渲染机制分为以下几个步骤:

  1. 初始化:解析模板,生成渲染函数。
  2. 响应式数据:数据变更时触发视图更新。
  3. 虚拟 DOM:每次渲染都会生成虚拟 DOM。
  4. diff 算法:比较新旧虚拟 DOM,找出变化。
  5. 更新 DOM:应用 diff 结果,更新真实 DOM。

HTML 的 doctype 有什么用

<!DOCTYPE html> 声明位于 HTML 文档的开头,用于告诉浏览器当前文档使用的是 HTML5 标准。它的主要作用是让浏览器以标准模式(standard mode)来解析和渲染网页,避免进入怪异模式(quirks mode),确保网页在不同浏览器中有一致的表现。

scriptlink 标签的加载顺序

  • <script> 标签:默认情况下,脚本会按顺序同步加载和执行。如果在 <head> 中包含 <script> 标签,页面会在脚本执行完成后才继续加载。可以通过 asyncdefer 属性来改变默认行为:

    • async:脚本异步加载,加载完成后立即执行,不保证顺序。
    • defer:脚本异步加载,加载完成后按顺序执行,保证在文档解析完成后执行。
  • <link> 标签:用于加载外部资源(如 CSS)。默认情况下,CSS 是同步加载和解析的,会阻塞渲染。

iframe 有了解过吗

iframe 元素用于在当前网页中嵌入另一个 HTML 文档。常见用途包括嵌入第三方内容(如广告、视频)、隔离 CSS 和 JavaScript 的作用域。使用 iframe 时需要注意安全问题,如跨站脚本(XSS)攻击,可以通过设置 sandbox 属性来限制 iframe 的行为。

行内元素水平垂直居中

对于一个行内元素或行内块元素,可以使用以下方法来实现水平和垂直居中:

  • 水平居中:使用 text-align: center
  • 垂直居中:如果父元素是一个 flex 容器,可以使用 align-items: centerjustify-content: center

例如:

<div style="display: flex; justify-content: center; align-items: center; height: 200px;"><span>Centered</span>
</div>

innerHTMLinnerText 区别

  • 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 打包和压缩提高性能的原因
  1. 文件合并

    • 减少 HTTP 请求:Webpack 将多个模块和依赖合并成一个或多个文件,减少了浏览器发起的 HTTP 请求次数。现代浏览器对并行请求的数量有限制,减少请求数可以降低延迟和开销。
  2. 代码压缩

    • 文件大小减少:Webpack 使用工具(如 UglifyJS、Terser)压缩代码,去掉空格、注释和冗余代码,极大地减少了文件大小。文件越小,传输时间越短。
  3. 代码分割

    • 按需加载:Webpack 可以根据应用的需要进行代码分割(Code Splitting),只加载当前页面所需的代码。这样可以避免一次性加载所有代码,提升页面初始加载性能。
  4. 树摇(Tree Shaking)

    • 去除无用代码:Webpack 通过静态分析模块的依赖关系,去除没有实际使用的代码(Dead Code),从而减少打包后的文件体积。
  5. 模块热替换(HMR)

    • 开发效率:Webpack 提供模块热替换功能,在开发过程中只更新变化的部分,而不是整个页面,提升开发效率和体验。

示例配置:

const TerserPlugin = require('terser-webpack-plugin');module.exports = {mode: 'production',optimization: {minimize: true,minimizer: [new TerserPlugin()],splitChunks: {chunks: 'all',},},
};

7. 为什么使用 Webpack

使用 Webpack 的理由
  1. 模块化支持

    • 多种模块格式:支持 ES6 模块、CommonJS、AMD 等模块格式,使开发者可以使用最新的 JavaScript 语法和标准。
  2. 强大的插件系统

    • 功能扩展:Webpack 提供丰富的插件(Plugins),如压缩、分包、代码分割等,方便扩展打包功能。
  3. 代码分割和懒加载

    • 优化性能:通过代码分割(Code Splitting)和懒加载(Lazy Loading),提升应用性能,减少初始加载时间。
  4. 开发工具集成

    • 热模块替换(HMR):实时更新代码,提高开发效率和体验。
    • 开发服务器:内置开发服务器(Webpack Dev Server),支持快速开发和调试。
  5. 配置灵活

    • 高可定制性:可以根据项目需求灵活配置,适应各种复杂场景。
  6. 生态系统

    • 社区和插件:强大的社区支持和丰富的插件库,方便解决各种问题。

8. 手写:数组实现 reducemap

手写 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 中&#xff0c;选择器 .class1 .class2 表示所有 class 为 class1 的元素中的 class 为 class2 的子元素。浏览器解析这个选择器时&#xff0c;从右向左解析。也就是说&#xff0c;浏览器首先找到所有 class 为 class2 的…...

分布式服务框架zookeeper+消息队列kafka

一、zookeeper概述 zookeeper是一个分布式服务框架&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;命名服务&#xff0c;状态同步&#xff0c;配置中心&#xff0c;集群管理等。 在分布式环境下&#xff0c;经常需要对应用/服…...

服务攻防-应用协议cve

Cve-2015-3306 背景&#xff1a; ProFTPD 1.3.5中的mod_copy模块允许远程攻击者通过站点cpfr和site cpto命令读取和写入任意文件。 任何未经身份验证的客户端都可以利用这些命令将文件从文件系统的任何部分复制到选定的目标。 复制命令使用ProFTPD服务的权限执行&#xff0c;…...

Springcloud之gateway的使用详解

官网地址&#xff1a;https://docs.spring.io/spring-cloud-gateway/docs/4.0.4/reference/html/ 1.网关入门 helloword 网关不依赖start-web 导入的pom&#xff1a; <!--gateway--> <dependency><groupIdorg.springframework.cloud</groupId><arti…...

中望CAD 建筑 v2024 解锁版下载、安装教程 (超强的CAD三维制图)

前言 中望CAD建筑版是一款国产CAD制图软件&#xff0c;专注于建筑设计领域。中望CAD建筑版拥有丰富多样的建筑图块和图案&#xff0c;完美兼容各类建筑图纸。同时&#xff0c;它提供了绘图标准规范&#xff0c;使绘图更加规范和专业。更值得一提的是&#xff0c;该软件还具备智…...

windows edge自带的pdf分割工具(功能)

WPS分割pdf得会员&#xff0c;要充值&#xff01;网上一顿乱找&#xff0c;发现最简单&#xff0c;最好用&#xff0c;免费的还是回到Windows。 Windows上直接在edge浏览器打开PDF&#xff0c;点击 打印 按钮,页面下选择对应页数 打印机 选择 另存为PDF&#xff0c;然后保存就…...

HTML5实现好看的天气预报网站源码

文章目录 1.设计来源1.1 获取天气接口1.2 PC端页面设计1.3 手机端页面设计 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板&#xff0c;程序开发&#xff0c;在线开发&#xff0c;在线沟通 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_4…...

比较(八)利用python绘制指示器

比较&#xff08;八&#xff09;利用python绘制指示器 指示器&#xff08;Indicators&#xff09;简介 指示器是一系列相关图的统称&#xff0c;主要用于突出展示某一变量的实际值与目标值的差异&#xff0c;例如常见的数据delta、仪表盘、子弹图、水滴图等。 快速绘制 基于p…...

【体外诊断】ARM/X86+FPGA嵌入式计算机在医疗CT机中的应用

体外诊断 信迈科技提供基于Intel平台、AMD平台、NXP平台的核心板、2.5寸主板、Mini-ITX主板、4寸主板、PICO-ITX主板&#xff0c;以及嵌入式准系统等计算机硬件。产品支持GAHDMI等独立双显&#xff0c;提供丰富串口、USB、GPIO、PCIe扩展接口等I/O接口&#xff0c;扩展性强&…...

力扣 28找到字符串中第一个匹配项的下标 KMP算法

思路&#xff1a; 朴素匹配有很多步骤是多余的 KMP算法能够避免重复匹配 KMP算法主要是根据子串生成的next数组作为回退的依据&#xff0c;它记录了模式串与主串(文本串)不匹配的时候&#xff0c;模式串应该从哪里开始重新匹配。 这里讲一下为什么用模式串的最大公共前后缀…...

JavaScript(10)——匿名函数

匿名函数 没有名字的函数&#xff0c;无法直接使用。 使用方式: 函数表达式立即执行函数 函数表达式 将匿名函数赋值给一个变量&#xff0c;并且通过变量名称进行调用 let fn function(){ 函数体 } 调用&#xff1a; fn() 立即执行函数 语法&#xff1a; (function () {…...

图片上传成功却无法显示:静态资源路径配置问题解析

1、故事的背景 最近&#xff0c;有个学弟做了一个简单的后台管理页面。于是他开始巴拉巴拉撘框架&#xff0c;写代码&#xff0c;一顿操作猛如虎&#xff0c;终于将一个简单的壳子搭建完毕。但是在实现功能&#xff1a;点击头像弹出上传图片进行头像替换的时候&#xff0c;卡壳…...

【转盘案例-弹框-修改Bug-完成 Objective-C语言】

一、我们来看示例程序啊 1.旋转完了以后,它会弹一个框,这个框,是啥, Alert 啊,AlertView 也行, AlertView,跟大家说过,是吧,演示过的啊,然后,我们就用iOS9来做了啊,完成了以后,我们要去弹一个框, // 弹框 UIAlertController *alertController = [UIAlertContr…...

Perl 基础语法

Perl 基础语法 Perl 是一种高级、解释型、动态编程语言&#xff0c;广泛用于CGI脚本、系统管理、网络编程、以及其他领域。Perl 以其强大的文本处理能力和简洁的语法而闻名。本文将详细介绍 Perl 的基础语法&#xff0c;帮助读者快速入门。 1. Perl 变量和数据类型 1.1 变量…...

【嵌入式开发之标准I/O】二进制文件的读写及实验

文本文件和二进制的区别 文本文件和二进制文件的区别主要在于它们的编码方式和数据组织方式。‌ 编码方式&#xff1a;‌文本文件是基于字符编码的文件&#xff0c;‌常见的编码有ASCII编码、‌UNICODE编码等。‌这些编码将字符映射到特定的二进制值&#xff0c;‌使得字符可以…...

Arduino学习笔记1——IDE安装与起步

一、IDE安装 去浏览器直接搜索Arduino官网&#xff0c;点击Software栏进入下载界面&#xff0c;选择Windows操作系统&#xff1a; 新版IDE下载不需要提前勾选所下载的拓展包&#xff0c;下载好后直接点击安装即可。 安装好后打开Arduino IDE&#xff0c;会自动开始下载所需的…...

一个注解解决重复提交问题

一、前言 ​ 在应用系统中提交是一个极为常见的功能&#xff0c;倘若不加管控&#xff0c;极易由于用户的误操作或网络延迟致使同一请求被发送多次&#xff0c;从而生成重复的数据记录。针对用户的误操作&#xff0c;前端通常会实现按钮的 loading 状态&#xff0c;以阻…...

在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 的函…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

第一篇:Liunx环境下搭建PaddlePaddle 3.0基础环境(Liunx Centos8.5安装Python3.10+pip3.10)

第一篇&#xff1a;Liunx环境下搭建PaddlePaddle 3.0基础环境&#xff08;Liunx Centos8.5安装Python3.10pip3.10&#xff09; 一&#xff1a;前言二&#xff1a;安装编译依赖二&#xff1a;安装Python3.10三&#xff1a;安装PIP3.10四&#xff1a;安装Paddlepaddle基础框架4.1…...