这里将作为我对技术细节、调试经验、踩坑分析和学习总结的集中记录地
你会在这里看到:
- 我在系统学习过程中的 关键知识点总结
- 阅读源码时的 有趣发现
- 做项目时遇到的 奇怪 bug 与解决思路
- 对底层原理、网络协议、日志系统、eBPF、数据库行为等的 深度理解
内容会根据课程、项目、阅读等不断更新
这里将作为我对技术细节、调试经验、踩坑分析和学习总结的集中记录地
你会在这里看到:
内容会根据课程、项目、阅读等不断更新

Promise 与 Event Loop:分步深入指南 简介 JavaScript 是单线程语言,却要处理大量异步操作(如网络请求、定时器、用户交互等)。为了既不阻塞主线程、又能保证回调按预期顺序执行,语言和运行时共同提供了两套核心机制: Promise —— 代表一个“未来会结束”的异步操作,提供了状态管理、链式调用、错误传播等语义,是现代异步编程的基石 Event Loop(事件循环) —— JavaScript 运行时真正的调度中心,它决定了同步代码、Promise 回调(微任务)、setTimeout/IO 等(宏任务)到底在什么时机被推入调用栈执行 这两者紧密协作: Promise 的 .then / .catch / await 后续全部属于微任务(microtask) 微任务与宏任务(macrotask)在 Event Loop 中有严格的优先级:每执行完一个宏任务,必须先清空全部微任务,才会进行渲染并进入下一个宏任务 掌握 Promise 的状态机细节 + Event Loop 的微/宏任务执行顺序,就等于拿到了 JavaScript 异步世界的完整“时序地图” 执行顺序表 执行顺序 类型 典型代表 触发时机 同步代码(包含Promise executor) console.log、变量赋值、函数调用 立即执行 微任务(microtask) .then/.catch、await 后续、queueMicrotask、MutationObserver 当前宏任务结束后、渲染前全部清空 渲染(浏览器) 页面重绘、布局 微任务清空后(可能跳过) 宏任务(macrotask) setTimeout、setInterval、I/O、UI 事件 每轮 Event Loop 执行一个 Promise 核心机制 Promise 的三个状态 ...
简介 在做密码存储的时候,我遇到了三种常见的数据表示方式:SHA256、Base64 和 Uint8Array(简称 Uint8)。它们各有用途和特点,于是写下这篇文章来总结一下。 SHA256 SHA256 是现代互联网广泛使用的加密哈希算法,例如在区块链、密码存储和数据完整性验证中都很常见。 特点: 将任意长度的输入数据经过数学运算后,输出 256 位二进制数(32 字节)。 几乎不可逆,意味着即使拿到 SHA256 的输出,也很难反推出原始输入。 示例输出(以十六进制表示): e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 缺点:可读性差,尤其是在前端需要显示或传输时不方便。 因此,通常会配合 Base64 或十六进制表示来方便存储和展示。 Base64 Base64 是一种将二进制数据编码为可打印 ASCII 字符的方式。 特点: 每 6 位二进制数映射为一个字符,字符集包含: A-Z, a-z, 0-9, +, / 以及 = 用作填充,使长度为 4 的倍数。 可以将 SHA256 的 32 字节(256 位)输出编码为 44 个 Base64 字符。 为什么是 44 个而不是 43 个?原因如下: Base64 按 每 3 个字节(24 位)为一组 来编码,每组会生成 4 个 Base64 字符。 SHA256 输出 32 字节 → 可以分为 10 组完整的 3 字节 + 剩余 2 字节。 ...