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>标签。