前端常见面试题系列 一

114 阅读2分钟

1.事件循环

问:javascript的事件循环机制;

答:javascript是单线程语言,通过事件循环处理异步任务。

事件循环分为以下步骤:

1.执行同步代码(调用栈);

2.遇到异步任务(settimeout、promise)时,将其推入任务队列(宏任务队列)或者微任务队列;

3.当调用栈为空时,先清空微任务队列(如 promise.then),再执行一个宏任务(如 settimeout)。

原理:微任务优先级高于宏任务,保证了promise的及时性。

2.虚拟dom (vitual dom)

问: 虚拟dom是什么?为什么react/vue使用它?

答:虚拟dom是真实dom的轻量级javascript对象表示;

原理: 直接操作dom成本高,频繁更新会导致性能问题; 虚拟dom通过diff算法比较新旧虚拟dom的差异,批量更新真实dom,减少重绘和回流;

3.css 盒模型

问:标准盒模型和ie盒模型的区别

答: 标准盒模型: width = 内容宽度; box-sizing: content-box; ie盒模型: width = 内容宽度 + padding + border; box-sizing: border-box;

4.跨域问题

问题: 什么是跨域? 如何解决跨域问题

答: 跨域是因为浏览器同源策略(协议、渔妹、端口不同)限制请求;

解决方案: cors(后端设置access-control-allow-origin); jsonp(利用

5.Http 缓存

题目: 强缓存和协商缓存的区别?

答: 强缓存: 直接使用本地缓存,通过cache-control (优先级高)或 expires响应头控制; 协商缓存: 向服务器验证资源是否过期,通过last-modified/if-modified-since 或者 etag/if-none-match实现;

6.箭头函数

题目: 箭头函数和普通函数的区别

答: 箭头函数没有自己的this, 继承外层作用域的this; 不能用作构造函数(无prototype属性) 没有arguments对象,可用...args替代;

7.webpack 打包原理

题目: webpack是如何打包代码

答: 1.从入口文件开始,递归分析依赖关系,生成依赖图; 2.将代码转为ast(抽象语法树),通过loader处理不同文件; 3.使用插件(plugin)优化代码,(如代码分割,压缩); 4.输出打包后的文件(bundle)

8.csrf攻击

题目: 什么是csrf攻击?如何防御?

答: csrf(跨站请求伪造)是诱导用户执行非预期的请求。

预防: 使用csrf token (后端生成并校验) 设置cookie的samesite属性 验证请求头中的referer

9. CSS 预处理器

题目:Sass/Less 的作用是什么?
答案
提供变量、嵌套、混入(Mixin)、函数等功能,提升 CSS 的可维护性。

// Sass 示例
$color: red;
.container {
  &:hover { color: $color; }
}

10. SPA 的 SEO 优化

题目:单页应用(SPA)如何优化 SEO?
答案

  • 服务端渲染(SSR,如 Next.js);

  • 预渲染(Prerendering);

  • 使用 react-helmet 动态修改 <meta> 标签。