前端面试题
2026/1/15大约 3 分钟
前端面试题
HTML/CSS
1. 盒模型是什么?
- 标准盒模型:width = content
- IE盒模型:width = content + padding + border
- 通过
box-sizing: border-box切换
2. BFC 是什么?如何触发?
BFC(块级格式化上下文)是独立的渲染区域。
触发条件:float、position: absolute/fixed、display: inline-block/flex、overflow 不为 visible
应用:清除浮动、防止 margin 重叠
3. Flex 布局常用属性?
/* 容器 */
display: flex;
justify-content: center; /* 主轴对齐 */
align-items: center; /* 交叉轴对齐 */
flex-wrap: wrap; /* 换行 */
/* 项目 */
flex: 1; /* 占比 */
align-self: center; /* 单独对齐 */4. 垂直居中的方法?
/* 1. Flex */
display: flex; justify-content: center; align-items: center;
/* 2. Grid */
display: grid; place-items: center;
/* 3. 定位 + transform */
position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);
/* 4. 定位 + margin */
position: absolute; top: 0; right: 0; bottom: 0; left: 0; margin: auto;JavaScript
5. var/let/const 的区别?
| 特性 | var | let | const |
|---|---|---|---|
| 作用域 | 函数 | 块级 | 块级 |
| 变量提升 | 是 | 否 | 否 |
| 重复声明 | 可以 | 不可以 | 不可以 |
| 修改 | 可以 | 可以 | 不可以 |
6. 闭包是什么?有什么用?
闭包是函数能够访问其词法作用域外的变量。
应用:模块化、柯里化、防抖节流、私有变量
7. 原型链是什么?
每个对象都有 __proto__ 指向其原型,原型也是对象,形成链式结构。
obj.__proto__ === Constructor.prototype
Constructor.prototype.__proto__ === Object.prototype
Object.prototype.__proto__ === null8. this 指向规则?
- 默认绑定:全局对象(严格模式 undefined)
- 隐式绑定:调用对象
- 显式绑定:call/apply/bind
- new 绑定:新创建的对象
- 箭头函数:继承外层 this
9. Promise 的状态?
- pending:初始状态
- fulfilled:成功
- rejected:失败
状态一旦改变就不可逆。
10. async/await 原理?
async/await 是 Generator + Promise 的语法糖,使异步代码看起来像同步代码。
11. 事件循环机制?
宏任务 → 微任务队列清空 → 渲染 → 宏任务...
宏任务:setTimeout、setInterval、I/O
微任务:Promise.then、MutationObserver12. 深拷贝实现?
function deepClone(obj, map = new WeakMap()) {
if (obj === null || typeof obj !== 'object') return obj;
if (map.has(obj)) return map.get(obj);
const clone = Array.isArray(obj) ? [] : {};
map.set(obj, clone);
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
clone[key] = deepClone(obj[key], map);
}
}
return clone;
}Vue
13. Vue2 和 Vue3 响应式的区别?
| Vue2 | Vue3 |
|---|---|
| Object.defineProperty | Proxy |
| 需要递归遍历 | 惰性代理 |
| 无法监听新增属性 | 可以监听 |
| 数组需要特殊处理 | 原生支持 |
14. computed 和 watch 的区别?
- computed:有缓存,依赖变化才重新计算,用于派生数据
- watch:无缓存,数据变化时执行副作用
15. v-if 和 v-show 的区别?
- v-if:条件渲染,切换时销毁/创建 DOM
- v-show:display 切换,DOM 始终存在
16. Vue 组件通信方式?
- props / $emit
- $refs
- provide / inject
- EventBus
- Vuex / Pinia
17. Vue 的 Diff 算法?
- 同层比较,不跨层
- 双端比较(Vue2)
- 最长递增子序列(Vue3)
React
18. 类组件和函数组件的区别?
| 类组件 | 函数组件 |
|---|---|
| 有生命周期 | 使用 Hooks |
| 有 this | 无 this |
| 有 state | useState |
19. useEffect 的执行时机?
- 无依赖:每次渲染后
- 空数组:仅挂载时
- 有依赖:依赖变化时
- 返回函数:卸载时执行
20. useMemo 和 useCallback 的区别?
- useMemo:缓存计算结果
- useCallback:缓存函数引用
21. React 性能优化?
- React.memo
- useMemo / useCallback
- 代码分割(lazy + Suspense)
- 虚拟列表
工程化
22. Webpack 和 Vite 的区别?
| Webpack | Vite |
|---|---|
| 打包后启动 | 原生 ESM |
| 启动慢 | 启动快 |
| HMR 慢 | HMR 快 |
| 生态丰富 | 生态发展中 |
23. 前端性能优化?
加载优化:代码分割、懒加载、预加载、CDN、缓存
渲染优化:减少重排重绘、虚拟列表、防抖节流
代码优化:Tree Shaking、压缩、图片优化
24. 跨域解决方案?
- CORS(服务端设置)
- 代理(开发环境)
- JSONP(仅 GET)
- postMessage
25. XSS 和 CSRF 防御?
XSS:输入过滤、输出转义、CSP
CSRF:Token、SameSite Cookie、Referer 检查