前言本文整理了2026年最新的前端面试题,涵盖HTML5、CSS3、JavaScript、Vue、React、Webpack等技术栈,包括基础知识、面试题、算法题、性能优化等内容,帮助开发者备考前端面试。
div上下居中对齐的几种方式?
div
/ 1. Flex布局 /.parent { display: flex; justify-content: center; align-items: center; height: 100vh;}/ 2. Grid布局 /.parent { display: grid; place-items: center; height: 100vh;}/ 3. 定位 + Transform /.parent { position: relative; height: 100vh;}.child { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);}/ 4. line-height (单行文本) /.parent { line-height: 100vh; text-align: center;}
伪类与伪元素的区别?
:hover
:visited
:focus
::before
::after
CSS选择器的优先级排序?从高到低:!important > 行内样式 > ID选择器 > 类/属性/伪类选择器 > 元素/伪元素选择器 > 通配符/继承。
!important
深拷贝与浅拷贝的区别?
Object.assign()
...
JSON.parse(JSON.stringify(obj))
undefined
_.cloneDeep
HTTPS的工作流程及证书验证?
如何处理图片/资源防盗链?
valid_referers
Referer
解释闭包?为什么要用?缺点?
解释作用域链?每个函数都有自己的作用域。当访问一个变量时,JS引擎会从当前作用域开始查找,如果没有,则逐级向上(父作用域、全局作用域)查找,直到找到或到达全局作用域。这条查找路径就是作用域链。
call、apply、bind的区别?
call
apply
bind
func.call(thisArg, arg1, arg2, ...)
func.apply(thisArg, [argsArray])
func.bind(thisArg, arg1, arg2, ...)
let、const、var的区别?
let
const
var
Promise的理解?为什么支持链式调用?
Promise
pending
fulfilled
rejected
then
catch
finally
JS事件循环机制(Event Loop)?JS是单线程的。所有同步任务在主线程执行栈执行。异步任务(如setTimeout、Promise)会被放入任务队列。
setTimeout
script
setInterval
I/O
UI渲染
Promise.then/catch/finally
MutationObserver
queueMicrotask
如何判断变量类型?
typeof
null
"object"
function
Array
Object
instanceof
prototype
Object.prototype.toString.call(value)
[object Type]
防抖(Debounce)与节流(Throttle)?应用场景?
n
resize
() => {}
this
`string ${expression}`
const { a, b } = obj;
import
export
async/await
Set
Map
find()
findIndex()
includes()
flat()
数组转对象:
const arr = [['key1', 'value1'], ['key2', 'value2']];const obj = Object.fromEntries(arr); // ES2019// 或const obj = arr.reduce((acc, [key, val]) => ({ ...acc, [key]: val }), {});
对象转数组:
const obj = { a: 1, b: 2 };const arr = Object.entries(obj); // [['a', 1], ['b', 2]]const arrKeys = Object.keys(obj); // ['a', 'b']const arrValues = Object.values(obj); // [1, 2]
对MVVM的理解?
data
Model
View
Vue2与Vue3生命周期?
beforeCreate
created
beforeMount
mounted
beforeUpdate
updated
beforeDestroy
destroyed
setup()
onBeforeMount
onMounted
onBeforeUpdate
onUpdated
onBeforeUnmount
onUnmounted
Vue2与Vue3响应式原理?
Object.defineProperty()
getter
setter
length
Vue.set
Proxy
Vue组件间通信方式?
props
$emit
$refs
$parent
Event Bus
$on
Vuex
provide
inject
$route.params
$route.query
v-if和v-for哪个优先级更高?如何优化?
v-if
v-for
<template>
$nextTick的作用与原理?
$nextTick
key的作用与原理?
key
diff
hash模式 vs history模式?
hash
history
http://site.com/#/path
http://site.com/path
window.onhashchange
History API
pushState
replaceState
index.html
路由守卫(钩子函数)?
router.beforeEach
router.afterEach
beforeEnter
beforeRouteEnter
beforeRouteUpdate
beforeRouteLeave
Vuex是什么?核心概念?Vuex是Vue的状态管理库,采用集中式存储管理应用的所有组件的状态。
state
commit
mutation
dispatch
store
如何优化网站性能?
transform
opacity
keep-alive的作用与使用?
keep-alive
<router-view>
activated
deactivated
React特点?
虚拟DOM是什么?虚拟DOM是真实DOM在内存中的JavaScript对象表示。React通过diff算法比较新旧虚拟DOM的差异,然后将最小化的变更应用到真实DOM上,减少直接操作DOM带来的性能损耗。
类组件 vs 函数组件?
this.state
setState()
useState
useEffect
state和props的区别?
setState
React Hooks 常用Hook?
useContext
useReducer
useCallback
useMemo
useRef
React中key的重要性?key帮助React识别列表中哪些元素被改变、添加或删除。稳定的key(如ID)有助于diff算法高效更新,避免不必要的重新渲染。
什么是受控组件和非受控组件?
value
onChange
ref
如何优化React性能?
React.memo
React.lazy
Suspense
render
核心概念?
与Grunt/Gulp的区别?Grunt/Gulp是任务执行器,基于文件流,处理文件(编译、压缩、合并)。Webpack是模块打包器,以模块和依赖关系为入口,构建依赖图,打包成静态资源。
如何提高构建速度?
thread-loader
happy-pack
cache-loader
HardSourceWebpackPlugin
resolve.modules
resolve.extensions
什么是模块热更新(HMR)?Hot Module Replacement,在应用程序运行过程中,替换、添加或删除模块,而无需重新加载整个页面。保留了应用状态,提升开发体验。
Vite为什么比Webpack快?
Vite的缺点?
CommonJS
Cookie、sessionStorage、localStorage的区别?
JSONP原理?利用<script>标签没有跨域限制的特性,动态创建script标签,src指向目标API并附带一个回调函数名(如callback=handleData)。服务器返回一段调用该回调函数的JavaScript代码,前端定义该函数来处理数据。仅支持GET请求。
<script>
src
callback=handleData
跨域解决方案?
Access-Control-Allow-Origin
proxy
浏览器与服务器交互原理?
找出字符串中出现次数最多的字符?
function findMostChar(str) { const map = {}; let maxCount = 0; let maxChar = ''; for (let char of str) { map[char] = (map[char] || 0) + 1; if (map[char] > maxCount) { maxCount = map[char]; maxChar = char; } } return { char: maxChar, count: maxCount };}console.log(findMostChar('afjghdfraaaa')); // {char: 'a', count: 5}
数组去重与扁平化?
// 去重const uniqueArr = [...new Set([1, 2, 2, 3, 3, 3])]; // [1, 2, 3]// 扁平化const flatArr = [1, [2, [3]]].flat(Infinity); // [1, 2, 3]
git init # 初始化仓库git clone <url> # 克隆远程仓库git add . # 添加所有文件到暂存区git commit -m "message" # 提交git push origin master # 推送到远程master分支git pull origin master # 拉取远程更新git branch # 查看分支git checkout -b dev # 创建并切换到dev分支git merge dev # 合并dev分支到当前分支git reset --hard <commit_id> # 版本回退
onLoad
onShow
onReady
onHide
onUnload
properties
triggerEvent
getApp().globalData
wx.login
code
openid
session_key
wx.setStorage
react-window
vue-virtual-scroller
Intersection Observer API