<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[HX0942的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/HX0942</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; HX0942]]></copyright><item><title><![CDATA[MySQL 学习第一天：从数据库创建到 SQL 基础增删改查]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/169160640</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/169160640</guid><author>HX0942</author><pubDate>Mon, 26 Oct 2026 14:48:18 +0800</pubDate><description><![CDATA[今天正式开始学习 MySQL，主要接触了数据库与数据表的创建、SQL 基本语法、数据的增删改查、条件筛选、排序、聚合函数以及 SQL 文件的保存与执行。对于之前主要学习 JavaScript、React、Node.js 的我来说，MySQL 是后端开发中重要的一环。前端负责展示数据，Node.js 可以负责处理业务逻辑，而 MySQL 则可以用来持久化存储和管理数据。本文记录第一天学习的核心知识点。经过第一天的学习，我对 MySQL 的基本操作有了初步认识，也理解了数据库与前后端之间的关系。]]></description><category></category></item><item><title><![CDATA[前端网络请求详解：AJAX、XHR、Fetch、Axios、Beacon 的区别]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/168977418</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/168977418</guid><author>HX0942</author><pubDate>Sat, 24 Oct 2026 21:12:22 +0800</pubDate><description><![CDATA[在前端开发中，我们经常需要向服务器获取数据或提交数据，例如查询用户信息、提交登录表单、上传文件等。AJAX、XHR、Fetch、Axios、Beacon 都与网络请求有关，但它们并不是五种完全独立的请求方式。其中 AJAX 是一种技术思想，其他四个则是具体的 API 或工具。]]></description><category></category></item><item><title><![CDATA[ Web 渲染模式：SSR、CSR、SEO 与前后端分离]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/168977335</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/168977335</guid><author>HX0942</author><pubDate>Sat, 24 Oct 2026 21:02:17 +0800</pubDate><description><![CDATA[浏览器想显示一个网页，需要获取 HTML、CSS、JavaScript 等资源。其中 HTML 决定页面的结构，CSS 负责样式，JavaScript 负责交互和动态内容。<h1>姓名：张三，年龄：20</h1>浏览器拿到这段 HTML，就能够解析并显示内容。但真实项目中的用户信息往往存储在数据库中，需要通过程序获取。用户数据应该在服务器端转换成 HTML，还是交给浏览器通过 JavaScript 转换成 HTML？]]></description><category></category></item><item><title><![CDATA[Express 静态资源托管详解：从本地 HTML 到 express.static()]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/168249781</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/168249781</guid><author>HX0942</author><pubDate>Sat, 17 Oct 2026 22:04:18 +0800</pubDate><description><![CDATA[静态资源是指服务器可以直接提供给客户端的文件，例如：HTML：网页结构CSS：网页样式JavaScript：网页交互逻辑图片、字体等资源文件├── app.js其中public文件夹保存网站需要的静态资源。静态资源托管，就是让服务器根据客户端的 HTTP 请求，找到并返回对应的静态文件。访问。但如果我们希望 URL 中明确带上/public就需要设置路径前缀。'/public'：指定 URL 访问前缀。：指定实际存放静态文件的目录。浏览器请求：↓匹配 URL 前缀 /public↓。]]></description><category></category></item><item><title><![CDATA[从零理解缓存机制：LeetCode 146 LRU 缓存]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/168244371</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/168244371</guid><author>HX0942</author><pubDate>Sat, 17 Oct 2026 15:06:55 +0800</pubDate><description><![CDATA[本文以LeetCode146题为切入点，系统讲解LRU缓存机制。从缓存的基本概念出发，阐明其“用空间换时间”的核心思想，重点解析LRU（最近最少使用）淘汰策略的原理与应用场景。结合JavaScript Map的插入顺序特性，实现高效O(1)时间复杂度的缓存操作，完整展示get与put方法的逻辑，并揭示其在前端开发中优化性能、减少请求的实际价值。]]></description><category></category></item><item><title><![CDATA[为什么 JavaScript 能开发前端，Node.js 却能开发后端？]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167918828</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167918828</guid><author>HX0942</author><pubDate>Wed, 14 Oct 2026 17:54:06 +0800</pubDate><description><![CDATA[一门编程语言，定义了语法和核心能力。JavaScript 引擎，负责执行 JavaScript 代码。在 JavaScript 引擎之外，提供各种可供调用的 API。浏览器提供 DOM、BOM 等 Web API，让 JavaScript 可以操作网页；Node.js 提供文件系统、网络服务等能力，让 JavaScript 可以开发后端。一句话总结：JavaScript 能做什么，不仅取决于语言本身，还取决于它所处的运行环境。]]></description><category></category></item><item><title><![CDATA[两小时带你入门 TypeScript（下）：工程配置、类型报错与高级类型]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167812548</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167812548</guid><author>HX0942</author><pubDate>Tue, 13 Oct 2026 20:39:15 +0800</pubDate><description><![CDATA[至此，《两小时带你入门 TypeScript》系列就结束了。上篇介绍了 TypeScript 的基础类型与核心语法；中篇通过泛型和 React、Vue 实战，了解如何在前端项目中使用 TS；下篇则补充了工程配置、常见类型报错，以及一些高级类型操作。对于刚接触 TypeScript 的前端开发者，现阶段最重要的不是掌握复杂的类型体操，而是能够在真实项目中正确使用类型系统。建议优先完成一次小型 JS 项目向 TS 的迁移，重点练习接口数据、组件 Props、状态和事件的类型声明。]]></description><category></category></item><item><title><![CDATA[两小时带你入门 TypeScript（中）：泛型与 React / Vue 项目实战]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167812447</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167812447</guid><author>HX0942</author><pubDate>Tue, 13 Oct 2026 20:32:06 +0800</pubDate><description><![CDATA[我们可以使用interface这里的约束了组件应该接收哪些属性，以及每个属性的类型。<UserCard name="张三" age={20} /><UserCard name="张三" age="20" />会报错，因为age应该是数字。表示父组件需要传入一个无参数的回调函数。学完本篇，我们已经从单纯编写 TypeScript 类型声明，过渡到了在前端项目中实际使用类型。泛型允许我们暂时不确定具体类型，但仍然保持数据之间的类型关系。]]></description><category></category></item><item><title><![CDATA[两小时带你入门 TypeScript（上）：从 JavaScript 到类型系统]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167812355</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167812355</guid><author>HX0942</author><pubDate>Tue, 13 Oct 2026 20:18:20 +0800</pubDate><description><![CDATA[到这里，我们已经完成 TypeScript 的核心基础。回顾一下，TypeScript 并不是要改变 JavaScript 的运行方式，而是在 JavaScript 之上增加一套类型描述和静态检查机制。类型注解：使用: 类型声明变量、参数和返回值的类型。类型推断：让 TypeScript 自动推断明确的类型，避免重复声明。函数类型：约束函数接收什么参数、返回什么结果。联合类型：使用表达多种可能类型，并通过类型收窄安全使用。字面量类型：将变量限制在具体值范围内，适合表示业务状态。]]></description><category></category></item><item><title><![CDATA[前端面试:JavaScript 栈与堆的区别：内存管理与引用类型详解]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167391954</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167391954</guid><author>HX0942</author><pubDate>Fri, 09 Oct 2026 17:20:57 +0800</pubDate><description><![CDATA[特性栈（Stack）堆（Heap）主要存储内容函数调用和执行状态动态创建的对象等数据内存分配随函数调用建立栈帧根据对象需要动态分配管理开销通常较低分配和回收机制更复杂内存管理函数返回时移除栈帧主要依靠垃圾回收存储结构后进先出动态内存区域大小限制通常较小通常较大，但同样有限线程关系不同线程通常有独立调用栈是否共享取决于运行时栈和堆之所以采用不同的管理方式，根本原因是程序运行时不同数据的生命周期不同。函数调用具有明确的执行顺序，适合使用后进先出的调用栈管理；]]></description><category></category></item><item><title><![CDATA[JavaScript this 面试：五种绑定规则、优先级与常见面试陷阱]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167376867</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167376867</guid><author>HX0942</author><pubDate>Fri, 09 Oct 2026 11:42:16 +0800</pubDate><description><![CDATA[this是 JavaScript 提供的一个特殊关键字，用于在函数执行过程中访问当前的调用上下文。sayHi() {这里通过调用函数，因此this指向user，相当于访问user.name。但如果改变函数的调用方式，即使是同一个函数，this的指向也可能发生变化。JavaScript 中this的核心并不是判断函数在哪里定义，而是判断函数怎样调用。调用方式示例this 指向new 绑定新实例显式绑定指定对象隐式绑定obj.fn()调用对象默认绑定fn()取决于严格模式和运行环境箭头函数。]]></description><category></category></item><item><title><![CDATA[LeetCode 21：合并两个有序链表——双指针与哑节点详解]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167375240</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167375240</guid><author>HX0942</author><pubDate>Fri, 09 Oct 2026 11:29:37 +0800</pubDate><description><![CDATA[这里使用的是 JavaScript 的逻辑或运算符||。它会返回第一个真值操作数；如果第一个是假值，就返回第二个操作数。在这道题中，list1和list2是链表节点引用或null。可以理解成：如果 list1 还有节点，就使用 list1；否则使用 list2。已合并：list1 剩余：4 → nulllist2：null因为list1直接把剩余节点连接到结果链表末尾。为什么可以直接连接，不需要继续逐个比较？因为两个原始链表都是升序排列的。]]></description><category></category></item><item><title><![CDATA[ACM/ICPC 竞赛入门指南：从零基础到算法竞赛，如何规划学习路线？]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167374819</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167374819</guid><author>HX0942</author><pubDate>Fri, 09 Oct 2026 11:18:46 +0800</pubDate><description><![CDATA[ACM 是一个需要长期积累的领域，不存在适合所有人的固定学习路线。有人喜欢先系统学习算法，再参加比赛；也有人更适合通过比赛发现问题，然后反过来补充知识。无论采用哪种方式，都需要避免两个常见误区：只学习算法却不独立做题，以及只追求刷题数量却不总结思路。算法竞赛真正考察的是能否在有限时间内，把已有知识转化成解决未知问题的能力。对于刚入门的同学来说，没有必要一开始就追求复杂算法和高难度题目。更重要的是打好基础，形成持续训练和及时复盘的习惯。]]></description><category></category></item><item><title><![CDATA[每日一题:LeetCode 206：反转链表——三指针与原地反转详解]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167373306</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167373306</guid><author>HX0942</author><pubDate>Fri, 09 Oct 2026 11:11:44 +0800</pubDate><description><![CDATA[理解反转链表之前，需要先知道链表的基本结构。数组通过下标访问元素，而链表由多个节点连接而成。val：当前节点保存的数据。next：指向下一个节点的引用。val: 1,next: nullval: 2,next: nullnode1.val// 1node1.next// node2 对象// 2也就是说，next保存的不是下一个节点的数值，而是下一个节点对象的引用。就表示让node1不再指向node2。反转链表，正是通过不断修改这样的next引用完成的。head↓↑head。]]></description><category></category></item><item><title><![CDATA[前端八股：JavaScript 深拷贝详解：实现方式、递归原理与循环引用]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167283658</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167283658</guid><author>HX0942</author><pubDate>Thu, 08 Oct 2026 22:32:02 +0800</pubDate><description><![CDATA[JavaScript 中的对象属于引用类型。当一个变量赋值给另一个变量时，如果赋的是对象，复制的是对象的引用，而不是重新创建一个对象。info: {age: 18// 20这是因为obj1和obj2指向同一个对象，因此修改其中一个，另一个也会受到影响。浅拷贝（Shallow Copy）会创建一个新对象，但只复制第一层属性。如果属性值是嵌套对象，复制的仍然是原对象的引用。// false// true虽然obj1和obj2是两个不同对象，但里面的info仍然指向同一个对象。而。]]></description><category></category></item><item><title><![CDATA[每日一题：LeetCode 1：两数之和——从暴力枚举到 Map 哈希表优化]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167283506</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167283506</guid><author>HX0942</author><pubDate>Thu, 08 Oct 2026 22:19:26 +0800</pubDate><description><![CDATA[这道题最重要的优化思想，是把寻找两个数的问题转换成查找差值的问题。i++) {遍历当前数字↓计算 need = target - nums[i]↓检查 Map 是否存在 need↓存在 → 返回之前下标和当前下标↓不存在 → 保存当前数字及其下标↓继续遍历一句话记住：Map 保存已经遍历过的数字和下标，每遇到一个数字，就检查目标差值是否已经出现。这道题不仅要掌握代码，更要理解其中的空间换时间思想，它也是哈希表在算法题中最经典的应用之一。]]></description><category></category></item><item><title><![CDATA[每日一题:LeetCode 20：有效的括号——栈与哈希映射详解]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167279995</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167279995</guid><author>HX0942</author><pubDate>Thu, 08 Oct 2026 17:54:22 +0800</pubDate><description><![CDATA[这是为了防止字符串中还有没有闭合的左括号。s = "((("因为始终没有右括号，所以之前的匹配判断不会报错。// false说明还有左括号没有匹配成功。stack = []// true因此，判断有效括号需要同时满足两个条件：每次遇到右括号，都能匹配最近的左括号。所有字符遍历结束之后，栈必须为空。这道题的核心是使用栈来维护尚未匹配的左括号。')': '(',']': '[','}': '{'} else {遍历字符串↓遇到左括号↓push() 入栈↓遇到右括号↓。]]></description><category></category></item><item><title><![CDATA[每日一题:LeetCode 88：合并两个有序数组——双指针与从后往前填充]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167221463</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167221463</guid><author>HX0942</author><pubDate>Wed, 07 Oct 2026 15:30:04 +0800</pubDate><description><![CDATA[两个数组中的每个元素最多只会被处理一次。i最多移动m次。j最多移动n次。O(m + n)同时没有额外创建长度为m + nijkO(1)这也是这道题要求“原地合并”的意义。这道题最重要的不是记代码，而是理解：两个数组已经有序，而且nums1后面还有空位置，所以可以从最大元素开始比较，从后向前填充。i--} else {j--k--i 看 nums1 当前最大的数j 看 nums2 当前最大的数比较两者谁大↓放到 nums1 最后面然后对应指针向前移动。]]></description><category></category></item><item><title><![CDATA[每日一题：LeetCode 165：比较版本号]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167221393</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167221393</guid><author>HX0942</author><pubDate>Wed, 07 Oct 2026 15:10:27 +0800</pubDate><description><![CDATA[1-1说明所有对应版本号都相等。1 == 10 == 00 == 0return 0表示：两个版本号相同。i < len;i++) {return 0先 split 拆版本号，再从左到右逐段转成数字比较；缺失部分补 0，前导 0 用 Number 自动处理。]]></description><category></category></item><item><title><![CDATA[每日一题：LeetCode 3：无重复字符的最长子串——滑动窗口思路详解]]></title><link>https://blog.youkuaiyun.com/HX0942/article/details/167177326</link><guid>https://blog.youkuaiyun.com/HX0942/article/details/167177326</guid><author>HX0942</author><pubDate>Tue, 06 Oct 2026 21:09:02 +0800</pubDate><description><![CDATA[滑动窗口本质上就是：用两个指针维护一个连续区间。↑ ↑L Rabc没有重复字符，所以窗口合法。于是righta b c a↑ ↑L Rabca出现了两个a，不合法。a b c a↑ ↑L Rbca重新满足“没有重复字符”。右指针负责扩张，左指针负责缩小。这道题的核心不是Set滑动窗口 + 双指针。right++) {left++maxLength,right 不断往右扩↓如果出现重复↓left 不断往右缩↓直到窗口重新合法↓记录当前窗口长度↓继续向右。]]></description><category></category></item></channel></rss>