原文链接: https://interview.poetries.top/days/%E6%AF%8F%E6%97%A5%E4%B8%80%E9%A2%98.html
每日一题-每日一题
简版速记
这是一份 180 题的前端面试「每日一题」合集,覆盖 webpack、HTTP/网络、JS 原理、Promise/异步、React/Vue、设计模式、算法手写。下面按高频考点压缩成速记卡片,方便面试前快速过一遍;细节与完整代码见正文对应题号。
工程化 / webpack
- 构建提速:
babel-loader缓存、IgnorePlugin(不引入)、noParse(引入不打包)、多进程(thread-loader/旧happypack)、DllPlugin(已被持久缓存替代)、热更新(HMR 不丢状态,自动刷新会丢)。 - 产出优化:
mode:production自动开 Tree Shaking + 压缩、splitChunks分包、contenthash长缓存、CDN、用import()做按需加载。 - Tree Shaking 依赖 ES Module 静态结构(
import/export),CommonJS 不支持;需配sideEffects。
网络 / HTTP
- HTTP/1.1 长连接+管线化(队头阻塞);HTTP/2 多路复用+头部压缩+服务端推送;HTTP/3 改用 QUIC(基于 UDP)解决 TCP 队头阻塞。
- HTTPS = HTTP + TLS:非对称协商出对称密钥,再用对称加密传输;中间人攻击靠 CA 证书链校验防范。
- 跨域:CORS(简单请求 vs 预检
OPTIONS)、JSONP(仅 GET)、代理;token放 header 防 CSRF,cookie自动带、session存服务端。 - 三次握手建连、四次挥手断连;状态码 301 永久/302 临时/304 协商缓存命中/307/308 保持方法重定向。
- 强缓存
Cache-Control/Expires,协商缓存ETag/Last-Modified。
JS 核心
- 事件循环:同步栈 → 微任务(Promise.then/queueMicrotask/MutationObserver)清空 → 一个宏任务(setTimeout/IO),每个宏任务后再清微任务;Node 与浏览器在 timers/microtask 时机上有差异。
- 闭包、原型链(
__proto__→prototype→Object.prototype→null)、this五种绑定(默认/隐式/显式 call-apply-bind/new/箭头继承外层)。 ??仅在null/undefined时取默认,||对所有 falsy 生效。parseInt(str, radix)第二参是进制;["1","2","3"].map(parseInt)→[1, NaN, NaN]。0.1+0.2!==0.3:IEEE754 浮点误差,比较用Math.abs(a-b)<Number.EPSILON。
框架
- Vue2 响应式靠
Object.defineProperty(无法监听新增属性/数组下标,需Vue.set/重写数组方法);Vue3 改用Proxy。 - React
setState在合成事件/生命周期中批量异步合并,在原生事件/setTimeout中同步(React18 起默认全自动批处理)。 - diff:React 同层比较 + key;Vue 双端比较 + key。
- useEffect 闭包陷阱:依赖数组缺项导致拿到旧值,用函数式更新或补全依赖。
手写高频:深拷贝(递归+循环引用 WeakMap)、深比较、Promise/A+、防抖节流、柯里化、call/apply/bind、new、instanceof、Promise.all、发布订阅 EventBus、LRU(Map)、数组扁平化、防 XSS/CSRF。
算法高频:两数之和(哈希)、二分查找、快排、反转链表、二叉树第 k 小(中序)、括号匹配(栈)、最长不重复子串(滑动窗口)、回文、数组转树。
目录
- 第180题 webpack性能优化-构建速度
- 第179题 webpack性能优化-产出代码(线上运行)
- 第178题 获取当前页面URL参数
- 第177题 手写深度比较lodash.isEqual
- 第176题 常见的web前端攻击方式有哪些
- 第175题 前端性能优化
- 第174题 HTTP面试题总结
- 第173题 DOM和事件操作总结
- 第172题 Event Loop执行机制过程
- 第171题 async/await异步总结
- 第170题 Promise异步总结
- 第169题 手写Promise加载一张图片
- 第168题 创建10个a标签,点击弹出对应的序号
- 第167题 闭包读代码题输出
- 第166题 实现简易版jQuery
- 第165题 原型与原型链
- 第164题 两个数组求交集和并集
- 第163题 JS反转字符串
- 第162题 从零搭建开发环境需要考虑什么
- 第161题 手写Vue3基本响应式原理
- 第160题 实现机器人走方格
- 第159题 this读代码题
- 第158题 使用XML描述自定义DSL流程图
- 第157题 JS设计并实现撤销重做功能
- 第156题 根据jsx写出vnode和render函数
- 第155题 手写合并两个递增数组
- 第154题 React useEffect闭包陷阱问题
- 第153题 Vue React diff 算法有什么区别
- 第152题 如何做code-review
- 第151题 手写JS深拷贝-考虑各种数据类型和循环引用
- 第150题 用JS实现一个LRU缓存
- 第149题 手写EventBus自定义事件
- 第148题 手写curry函数,实现函数柯里化
- 第147题 手写一个LazyMan,实现sleep机制
- 第146题 深度优先和广度优先遍历一个DOM树
- 第145题 手写一个getType函数,获取详细的数据类型
- 第144题 手写一个JS函数,实现数组扁平化Array Flatten
- 第143题 设计实现一个H5图片懒加载
- 第142题 如果你是项目前端技术负责人,将如何做技术选型
- 第141题 开发一个H5抽奖页,需要后端提供哪些接口
- 第140题 简单描述hybrid模板的更新流程
- 第139题 设计一个“用户-角色-权限”的模型和功能
- 第138题 设计一个H5编辑器的数据模型和核心功能
- 第137题 SPA和MPA应该如何选择
- 第136题 如何设计一个前端统计SDK
- 第135题 React setState经典面试题
- 第134题 一道让人失眠的promise then执行顺序问题
- 第133题 把一个数组转换为树
- 第132题 ["1", "2", "3"].map(parseInt) 答案是多少
- 第131题 工作中遇到过哪些项目难点,是如何解决的
- 第130题 如果一个H5很慢,如何排查性能问题
- 第129题 如何统一监听React组件报错
- 第128题 如何统一监听Vue组件报错
- 第127题 在实际工作中,你对React做过哪些优化
- 第126题 在实际工作中,你对Vue做过哪些优化
- 第125题 前端常用的设计模式和使用场景
- 第124题 后端一次性返回十万条数据,你该如何渲染
- 第123题 H5页面如何进行首屏优化
- 第122题 如何实现网页多标签tab通讯
- 第121题 从输入URL 到网页显示的完整过程
- 第120题 WebSocket和HTTP协议有什么区别
- 第119题 前端攻击手段有哪些,该如何预防
- 第118题 script标签的defer和async有什么区别
- 第117题 什么是HTTPS中间人攻击,如何预防(HTTPS加密过程、原理)
- 第116题 HTTP协议1.0和1.1和2.0有什么区别
- 第115题 HTTP请求中token、cookie、session有什么区别
- 第114题 移动端H5点击有300ms延迟,该如何解决
- 第113题 requestIdleCallback和requestAnimationFrame有什么区别
- 第112题 请描述js-bridge的实现原理
- 第111题 nodejs如何开启多进程,进程如何通讯
- 第110题 遍历一个数组用for和forEach哪个更快
- 第109题 虚拟DOM(vdom)真的很快吗
- 第108题 浏览器和nodejs事件循环(Event Loop)有什么区别
- 第107题 JS内存泄露如何检测?场景有哪些?
- 第106题 HTTP跨域请求时为什么要发送options请求
- 第105题 HTMLCollection和NodeList的区别
- 第104题 for in和for of有什么区别
- 第103题 请描述TCP三次握手和四次挥手
- 第102题 什么时候不能使用箭头函数
- 第101题 切换字母大小写
- 第100题 实现数字千分位格式化
- 第99题 高效的字符串前缀匹配如何做
- 第98题 获取1-10000之前所有的对称数(回文数)
- 第97题 实现快速排序并说明时间复杂度
- 第96题 获取字符串中连续最多的字符以及次数
- 第95题 将数组中的0移动到末尾
- 第94题 求斐波那契数列的第n值
- 第93题 求一个二叉搜索树的第k小值
- 第92题 时间复杂度与空间复杂度基本概念
- 第91题 给一个数组,找出其中和为n的两个元素(两数之和)
- 第90题 实现二分查找并分析时间复杂度
- 第89题 反转一个单项链表
- 第88题 实现队列功能
- 第87题 手写判断一个字符串"{a(b[c]d)e}f"是否括号匹配
- 第86题 下面这道题输出什么
- 第85题 下面这道题输出什么
- 第84题 下面这道题输出什么
- 第83题 动态生成4x4表格,每个表格中有坐标(0,0)-(3,3)点击格增加次数,次数互不干扰,次数通过弹窗显示
- 第82题 实现add(1)(2)(3)等于6
- 第81题 下面这道题输出什么
- 第80题 require 具体实现原理是什么
- 第79题 Es6 的 let 实现原理
- 第78题 原型链判断
- 第77题 手写 Vue.extend 实现
- 第76题 怎么在制定数据源里面生成一个长度为 n 的不重复随机数组 能有几种方法 时间复杂度多少(字节)
- 第75题 如何找到数组中第一个没出现的最小正整数 怎么优化(字节)
- 第74题 字符串最长的不重复子串
- 第73题 查找数组公共前缀(美团)
- 第72题 判断括号字符串是否有效(小米)
- 第71题 实现一个对象的 flatten 方法(阿里)
- 第70题 将虚拟DOM转化为真实DOM
- 第69题 手写setTimeout 模拟实现 setInterval(阿里)
- 第68题 Vue nextTick 原理
- 第67题 实现一个比setTimeout快 80 倍的定时器
- 第66题 数组转为tree
- 第65题 原型调用面试题 说出结果并说出 why
- 第64题 函数执行 说出结果并说出why
- 第63题 如何拦截全局Promise reject
- 第62题 JS执行机制 说出结果并说出why
- 第61题 实现继承
- 第60题 实现深拷贝
- 第59题 不使用循环API 来删除数组中指定位置的元素(如:删除第三位) 写越多越好
- 第58题 一个正则题
- 第57题 实现Promisify
- 第56题 完整实现Promises/A+规范
- 第55题 JS中
??与||的区别 - 第54题 HTTP 中的 301、302、303、307、308 响应状态码
- 第53题 简单请求和复杂请求的区别
- 第52题 实现一个对象被for of遍历
- 第51题 判断JS对象是否存在循环引用
- 第50题 对象的深度比较
- 第49题 实现一个find函数,并且find函数能够满足下列条件
- 第48题 实现数组扁平化的 6 种方式
- 第47题 JS易错题
- 第46题 关于0.1+0.2!=0.3浮点数计算分析与解决方法
- 第45题 介绍一下Tree Shaking及其工作原理
- 第44题 执行new Vue干了什么
- 第43题 说一下vue2.x中如何监测数组变化
- 第42题 介绍 HTTPS 握手过程
- 第41题 解释以下代码输出什么
- 第40题 实现 (5).add(3).minus(2) 功能
- 第39题 React setState 笔试题,下面的代码输出什么?
- 第38题 (头条)异步笔试题
- 第37题 实现ES6的class
- 第36题 实现一个柯里化函数
- 第35题 实现一个简易的MVVM
- 第34题 实现一下hash路由
- 第33题 实现一个发布订阅者模式
- 第32题 关于async/await代码执行顺序
- 第31题 实现一个padStart()或padEnd()的polyfill
- 第30题 设计一个方法提取对象中所有value大于2的键值对并返回最新的对象
- 第29题 用一个正则提取字符串中所有
""里内容 - 第28题 去除字符串首位空格
- 第27题 用正则写一个根据name获取cookie中的值的方法
- 第26题 实现 arr[-1] = arr[arr.length - 1]
- 第25题 JSONP的原理并用代码实现
- 第24题 实现一个拖拽
- 第23题 项目中你做过哪些优化
- 第22题 手写Promise最简20行版本,实现异步链式调用
- 第21题 实现一个迷你版的vue
- 第20题 基于Promise.all实现Ajax的串行和并行
- 第19题 JQ Ajax、Axios、Fetch的核心区别
- 第18题 基于HTTP网络层的前端性能优化
- 第17题 实现vue reactive原理
- 第16题 异步串行 | 异步并行
- 第15题 以下代码输出什么
- 第14题 如何让if(a == 1 && a == 2)条件成立
- 第13题 异步执行顺序问题
- 第12题 微任务执行问题 async await
- 第11题 this指向问题
- 第10题 promise执行问题
- 第9题 promise解决并发请求
- 第8题 跨域问题
- 第7题 下面输出什么
- 第6题 验证回文串
- 第5题 写一个函数来判断它是否是 3 的幂次方
- 第4题 旋转数组
- 第3题 修改嵌套层级很深对象的 key
- 第2题 只出现一次的数字
- 第1题 两数之和
