<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Emnational的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Emnational</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Emnational]]></copyright><item><title><![CDATA[【加密算法】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/148291242</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/148291242</guid><author>Emnational</author><pubDate>Wed, 28 May 2025 20:28:26 +0800</pubDate><description><![CDATA[非对称加密（Asymmetric Encryption）使用**公钥（Public Key）**加密，**私钥（Private Key）**解密，或反之。安全性高，但计算速度慢。是保障数据安全的核心技术，用于防止数据在传输过程中被窃听、篡改或伪造。本文将详细介绍常见的加密算法分类、工作原理及其在网络中的应用。，将任意长度数据映射为固定长度哈希值，用于数据完整性校验和数字签名。理解这些加密算法的原理和应用场景，有助于设计更安全的网络系统！进行加密和解密，计算速度快，适合大数据量加密。]]></description><category></category></item><item><title><![CDATA[【线程与进程区别】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/148291214</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/148291214</guid><author>Emnational</author><pubDate>Wed, 28 May 2025 20:26:37 +0800</pubDate><description><![CDATA[进程和线程是计算机网络中的两种并发执行方式。进程是资源分配的基本单位，拥有独立内存空间，适合CPU密集型任务，但开销较大；线程是进程内的执行单元，共享内存资源，适合I/O密集型任务，开销更小但需处理同步问题。在网络编程中，多线程和协程更常用，而多进程适用于需要强隔离性的场景。选择方案取决于任务类型：CPU密集型用多进程，I/O密集型用多线程或协程，超高并发推荐协程。]]></description><category></category></item><item><title><![CDATA[【React Fiber 架构详解】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/148025421</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/148025421</guid><author>Emnational</author><pubDate>Sat, 17 May 2025 11:09:14 +0800</pubDate><description><![CDATA[React Fiber 是 React 16 引入的核心协调算法重构，旨在解决传统同步渲染的性能瓶颈，提升用户体验。其核心在于将渲染任务拆解为可中断、优先级可控的增量单元，并通过链表数据结构优化调度流程。Fiber 的革新目标包括异步可中断、增量渲染和优先级调度，确保关键操作快速响应。其核心机制包括 Fiber 节点数据结构、双缓存机制和优先级调度与时间分片。Fiber 的工作流程分为协调阶段、提交阶段和工作循环，通过任务分片和优先级控制减少卡顿，支持并发渲染和错误边界。尽管 Fiber 提升了性能，但也存]]></description><category></category></item><item><title><![CDATA[【React中虚拟DOM与Diff算法详解】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/148025059</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/148025059</guid><author>Emnational</author><pubDate>Sat, 17 May 2025 10:49:43 +0800</pubDate><description><![CDATA[React中的虚拟DOM（Virtual DOM）是一种轻量级的JavaScript对象树，用于描述真实DOM结构，其主要目标是优化性能和实现跨平台支持。虚拟DOM通过构建、对比和更新三个阶段工作，其中Diff算法用于高效比较新旧虚拟DOM树的差异，并仅更新真实DOM中变化的部分。Diff算法的核心策略包括树对比（Tree Diff）、组件对比（Component Diff）和元素对比（Element Diff），并通过key标识优化列表更新。尽管虚拟DOM在多数场景下提升了性能，但仍存在内存消耗和首次渲染]]></description><category></category></item><item><title><![CDATA[【JS中defer与async区别】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/148024986</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/148024986</guid><author>Emnational</author><pubDate>Sat, 17 May 2025 10:46:36 +0800</pubDate><description><![CDATA[在JavaScript中，&lt;script&gt;标签的defer和async属性用于优化脚本加载和执行，避免阻塞页面渲染。defer脚本在HTML解析完成后按顺序执行，适合依赖DOM或有顺序要求的脚本；async脚本加载完成后立即执行，顺序不确定，适合独立脚本。defer保证DOM操作安全，async可能因执行过早导致DOM未就绪。合理选择两者可优化页面性能，defer适用于复杂逻辑，async适用于轻量独立脚本。]]></description><category></category></item><item><title><![CDATA[【hot100-动态规划-300.最长递增子序列】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147994677</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147994677</guid><author>Emnational</author><pubDate>Thu, 15 May 2025 23:49:23 +0800</pubDate><description><![CDATA[力扣300题要求在一个整数数组中找到最长严格递增子序列的长度。通过动态规划方法，可以解决该问题。首先，定义一个数组 dp，其中 dp[i] 表示以 nums[i] 结尾的最长递增子序列的长度，初始值为1。然后，对于每个位置 i，遍历它之前的所有元素 nums[j]，如果 nums[i] &gt; nums[j]，则更新 dp[i] 为 dp[j] + 1 和当前 dp[i] 中的较大值。最终，dp 数组中的最大值即为所求的最长递增子序列的长度。该方法的时间复杂度为 $O(n^2)$，空间复杂度为 $O(n)]]></description><category></category></item><item><title><![CDATA[【hot100-动态规划-139.单词拆分】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147994523</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147994523</guid><author>Emnational</author><pubDate>Thu, 15 May 2025 23:36:35 +0800</pubDate><description><![CDATA[力扣139题“单词拆分”要求判断字符串 s 是否可以被拆分为字典 wordDict 中的单词，且单词可重复使用。该问题可通过动态规划解决。定义布尔数组 dp，其中 dp[i] 表示字符串前 i 个字符能否被拆分。初始化 dp[0] = true，表示空字符串可被拆分。状态转移方程为：对于每个位置 i，检查所有可能的子串 s[j:i]，若 dp[j] 为 true 且子串在字典中，则 dp[i] = true。最终 dp[s.length] 表示整个字符串是否可被拆分。时间复杂度为 $O(n^2 * m)$，]]></description><category></category></item><item><title><![CDATA[【JS中数组的各种方法】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147966190</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147966190</guid><author>Emnational</author><pubDate>Thu, 15 May 2025 00:48:58 +0800</pubDate><description><![CDATA[JavaScript 提供了多种数组操作方法，主要分为修改原数组和不修改原数组两类。修改原数组的方法包括 push()、unshift()、pop()、shift()、splice()、reverse() 和 sort()，用于添加、删除、替换、反转和排序数组元素。不修改原数组的方法包括 concat()、slice()、indexOf()、lastIndexOf()、includes()、forEach()、map()、filter()、reduce()、reduceRight()、fill()、find]]></description><category></category></item><item><title><![CDATA[【hot100-动态规划-322.零钱兑换】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147937330</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147937330</guid><author>Emnational</author><pubDate>Wed, 14 May 2025 01:33:40 +0800</pubDate><description><![CDATA[力扣第322题“零钱兑换”要求计算凑成给定总金额所需的最少硬币数。使用动态规划方法，定义 dp[i] 为凑成金额 i 所需的最少硬币数。通过遍历所有硬币面额，更新 dp[i] 的值，状态转移方程为 dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1)。最终，若 dp[amount] 不为 Infinity，返回其值，否则返回 -1。时间复杂度为 $O(amount \times n)$，空间复杂度为 $O(amount)$。示例调用展示了代码的正确性。]]></description><category></category></item><item><title><![CDATA[【hot100-动态规划-279.完全平方数】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147937227</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147937227</guid><author>Emnational</author><pubDate>Wed, 14 May 2025 01:17:11 +0800</pubDate><description><![CDATA[力扣第 279 题“完全平方数”要求找到最少数量的完全平方数，使其和为给定的正整数 n。该问题可以通过动态规划解决。定义一个数组 dp，其中 dp[i] 表示和为 i 时所需的最少完全平方数个数。初始化 dp[0] 为 0，其余为无穷大。通过双重循环，外层遍历所有可能的和 i，内层遍历所有小于等于 i 的完全平方数 j * j，并更新 dp[i] 为 dp[i - j * j] + 1 的最小值。最终，dp[n] 即为所求。该算法的时间复杂度为 $O(n \sqrt{n})$，空间复杂度为 $O(n)$。]]></description><category></category></item><item><title><![CDATA[【hot100-动态规划-198.打家劫舍】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147937084</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147937084</guid><author>Emnational</author><pubDate>Wed, 14 May 2025 00:56:38 +0800</pubDate><description><![CDATA[题目描述了一个小偷计划偷窃沿街房屋的问题，每间房屋都有一定金额，但相邻房屋装有防盗系统，不能同时偷窃相邻房屋。给定一个非负整数数组表示每间房屋的金额，要求计算在不触发警报的情况下，一夜内能偷窃到的最高金额。使用动态规划的思想，定义 dp[i] 为前 i 间房屋能偷窃的最高金额。状态转移方程为 dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i])，即分别考虑偷或不偷第 i 间房屋的情况。通过初始化 dp[0] 和 dp[1]，并依次计算 dp[i]，最终 dp[nu]]></description><category></category></item><item><title><![CDATA[【hot100-动态规划-118.杨辉三角】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147936974</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147936974</guid><author>Emnational</author><pubDate>Wed, 14 May 2025 00:37:19 +0800</pubDate><description><![CDATA[力扣第 118 题“杨辉三角”要求生成前 numRows 行的杨辉三角。杨辉三角的每一行由上一行相邻两个数字相加得到，边界数字始终为 1。代码通过两层循环实现：外层循环遍历每一行，内层循环计算中间元素的值。时间复杂度为 $O(n^2)$，空间复杂度为 $O(n^2)$，其中 $n$ 为行数。最终返回存储所有行的二维数组。]]></description><category></category></item><item><title><![CDATA[【hot100-动态规划-70.爬楼梯】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147936845</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147936845</guid><author>Emnational</author><pubDate>Wed, 14 May 2025 00:22:54 +0800</pubDate><description><![CDATA[力扣第 70 题“爬楼梯”要求计算爬到 n 阶楼梯的不同方法数，每次可以爬 1 或 2 个台阶。该问题可以通过动态规划解决，定义 dp[i] 为到达第 i 阶的方法数，状态转移方程为 dp[i] = dp[i-1] + dp[i-2]。代码初始化 dp 数组为 [0, 1, 2]，然后通过循环计算从第 3 阶到第 n 阶的方法数，最终返回 dp[n]。该方法的时间复杂度为 $O(n)$，空间复杂度为 $O(n)$。]]></description><category></category></item><item><title><![CDATA[【React中函数组件和类组件区别】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147923912</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147923912</guid><author>Emnational</author><pubDate>Tue, 13 May 2025 14:35:01 +0800</pubDate><description><![CDATA[React 中的函数组件和类组件是两种主要的组件构建方式，它们在语法、状态管理、生命周期、性能等方面存在显著差异。类组件使用 ES6 类语法，通过 this.state 和 this.setState 管理状态，并具有完整的生命周期方法，适合处理复杂逻辑。函数组件则使用函数定义，通过 useState 和 useEffect 等 Hooks 管理状态和副作用，代码更简洁，性能通常更好，适合简单 UI 和逻辑复用。函数组件在 React 16.8 引入 Hooks 后，逐渐成为主流，但类组件在特定场景下仍有其]]></description><category></category></item><item><title><![CDATA[【js中数据类型及区别】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147923785</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147923785</guid><author>Emnational</author><pubDate>Tue, 13 May 2025 14:32:03 +0800</pubDate><description><![CDATA[JavaScript 数据类型分为基本数据类型和复杂数据类型。基本数据类型包括 Number、String、Boolean、Undefined、Null、Symbol 和 BigInt，它们是不可变的，存储在栈内存中，赋值操作是值复制，比较操作是值比较。复杂数据类型包括 Object、Array、Function 等，它们是可变的，存储在堆内存中，变量保存的是对堆内存中实际数据的引用，赋值操作是引用复制，比较操作是引用比较。理解这些数据类型的区别对于编写高效且健壮的 JavaScript 代码至关重要。]]></description><category></category></item><item><title><![CDATA[【详解js中typeof与instance of区别】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147881847</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147881847</guid><author>Emnational</author><pubDate>Mon, 12 May 2025 00:13:07 +0800</pubDate><description><![CDATA[typeof 和 instanceof 是 JavaScript 中用于类型检测的两种主要方法，各有其特点和局限性。typeof 是一元运算符，返回基本类型的字符串表示，适用于检测基本数据类型和函数，但对引用类型（如数组、对象）统一返回 &quot;object&quot;，且存在 typeof null 返回 &quot;object&quot; 的历史遗留问题。instanceof 是二元运算符，用于检查对象是否为某构造函数的实例，基于原型链判断，适用于引用类型，但对基本类型无效，且受原型链完整性和跨全]]></description><category></category></item><item><title><![CDATA[【React中useRef钩子详解】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147881817</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147881817</guid><author>Emnational</author><pubDate>Mon, 12 May 2025 00:09:12 +0800</pubDate><description><![CDATA[useRef是React中的重要Hook，用于在函数组件中创建持久化引用，其核心特性包括持久化存储、不触发重新渲染以及支持多种数据类型。与useState相比，useRef适合存储与UI无关的数据，如定时器ID或DOM引用，且直接修改current属性不会导致组件重新渲染。典型应用场景包括访问DOM元素、存储可变数据、缓存先前状态以及跨组件方法调用。高级用法中，useRef可解决闭包问题，并需注意性能优化和类型安全。最佳实践建议避免在渲染期操作ref.current，优先使用useState管理UI状态，仅]]></description><category></category></item><item><title><![CDATA[【React中useReducer钩子详解】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147862620</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147862620</guid><author>Emnational</author><pubDate>Sun, 11 May 2025 00:36:46 +0800</pubDate><description><![CDATA[useReducer 是 React 中用于管理复杂状态逻辑的 Hook，它通过集中式状态更新逻辑替代 useState，特别适用于处理多值关联状态或依赖前序状态更新的场景。其核心概念包括 Reducer 模式（通过 (state, action) =&gt; newState 函数管理状态变更）和返回值（当前状态 state 和派发函数 dispatch）。useReducer 的参数包括 reducer（纯函数处理状态变更）、initialState（初始状态值）以及可选的 init 函数（用于惰性初始]]></description><category></category></item><item><title><![CDATA[【React中详解useLayoutEffect钩子详解】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147862607</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147862607</guid><author>Emnational</author><pubDate>Sun, 11 May 2025 00:34:02 +0800</pubDate><description><![CDATA[useLayoutEffect 是 React 中的一个 Hook，用于在浏览器绘制前同步执行副作用操作，适用于需要避免视觉闪烁或直接操作 DOM 的场景。与 useEffect 不同，useLayoutEffect 在 DOM 更新后、绘制前立即触发，确保操作与渲染同步。它常用于 DOM 尺寸测量、强制样式更新等需与渲染周期同步的任务。然而，由于它是同步执行，可能阻塞渲染，因此应避免耗时操作。在服务端渲染时，useLayoutEffect 会触发警告，建议替换为 useEffect 或条件调用。总的来说，]]></description><category></category></item><item><title><![CDATA[【React中useCallback钩子详解】]]></title><link>https://blog.youkuaiyun.com/Emnational/article/details/147862334</link><guid>https://blog.youkuaiyun.com/Emnational/article/details/147862334</guid><author>Emnational</author><pubDate>Sun, 11 May 2025 00:30:12 +0800</pubDate><description><![CDATA[useCallback 是 React 中的一个性能优化 Hook，用于缓存函数引用，避免在组件重新渲染时重复创建相同的函数，从而减少不必要的子组件渲染或副作用执行。其核心作用在于函数记忆化，仅在依赖项变化时重新创建函数，否则复用之前的函数引用。useCallback 的基本语法包括一个回调函数和一个依赖项数组，返回值是记忆化的函数引用。其工作原理涉及初始化阶段将函数和依赖项存储到 Fiber 节点的 memoizedState 中，更新阶段比较新旧依赖项以决定是否返回旧函数。使用场景包括传递回调给子组件、]]></description><category></category></item></channel></rss>