[{"data":1,"prerenderedAt":3237},["ShallowReactive",2],{"blog-taxonomies":3,"blog-stats":507,"post-2026\u002F2026-01-19-杂记2026-01-19":1083},[4,11,16,21,25,29,36,39,44,47,52,58,63,66,71,76,80,84,87,93,96,101,105,110,113,117,122,127,132,136,141,143,146,151,155,157,162,165,169,173,176,179,183,186,190,193,197,200,205,208,211,214,219,222,228,234,237,239,245,249,253,256,260,266,271,276,281,283,287,290,293,298,301,304,306,308,311,314,316,318,321,327,332,337,342,347,352,354,356,358,361,365,367,369,371,374,376,378,381,386,390,393,396,400,404,407,411,413,415,417,421,423,425,428,431,433,435,437,439,441,443,446,448,450,454,456,459,461,463,465,467,469,471,473,477,483,486,488,491,493,495,497,499,501,503,505],{"category":5,"tags":6},"笔记",[7,8,9,10],"QQ","插件","LiteLoader","美化",{"category":12,"tags":13},"其他",[14,15,10],"博客","IP签名",{"category":17,"tags":18},"杂谈",[19,20],"互联网","观点",{"category":5,"tags":22},[14,23,24],"GitHub","数据可视化",{"category":5,"tags":26},[14,27,28],"访问统计","不蒜子",{"category":30,"tags":31},"工具",[32,33,34,35],"Python","爬虫","选课脚本","广州大学",{"category":5,"tags":37},[38,5],"数学分析",{"category":40,"tags":41},"算法",[42,40,43],"数据结构","线性表",{"category":40,"tags":45},[42,46],"复习",{"category":5,"tags":48},[49,50,51],"高等代数","线性代数","知识点",{"category":5,"tags":53},[14,54,55,56,57],"Typora","PicGo","图床","Markdown",{"category":30,"tags":59},[60,61,62],"Jupyter","工具配置","中文",{"category":30,"tags":64},[65,61,10],"VSCode",{"category":30,"tags":67},[68,69,70,35],"路由器","OpenWrt","校园网",{"category":12,"tags":72},[73,74,75],"网络协议","Wireshark","DEVP2P",{"category":5,"tags":77},[73,74,78,79],"Lua","解码器",{"category":5,"tags":81},[82,5,83],"常微分方程","数学",{"category":5,"tags":85},[86,5,83],"概率论",{"category":30,"tags":88},[89,90,91,92],"Docker","WSL","Windows","磁盘清理",{"category":30,"tags":94},[32,33,95,35],"课程表",{"category":5,"tags":97},[14,98,99,100],"Hexo","Gitalk","评论系统",{"category":5,"tags":102},[14,103,98,104],"Obsidian","写作工具",{"category":12,"tags":106},[107,108,109],"课题研究","泊松分布","参数估计",{"category":12,"tags":111},[107,108,109,112],"组会",{"category":12,"tags":114},[109,115,108,116],"IM模型","统计学",{"category":17,"tags":118},[119,120,121],"软考","网络规划","信息系统项目管理",{"category":30,"tags":123},[124,125,126],"Arch Linux","AppImage","Linux",{"category":5,"tags":128},[129,130,131],"编程语言","计算机科学","内存管理",{"category":5,"tags":133},[134,135],"Canvas","前端",{"category":5,"tags":137},[14,138,139,140],"GitHub Actions","Vite","部署",{"category":5,"tags":142},[135],{"category":5,"tags":144},[135,145],"系统设计",{"category":5,"tags":147},[135,148,149,150],"安全","XSS","CSRF",{"category":152,"tags":153},"项目",[134,154],"PixiJS",{"category":152,"tags":156},null,{"category":40,"tags":158},[42,159,160,161],"栈","队列","JavaScript",{"category":40,"tags":163},[42,164,161],"哈希表",{"category":5,"tags":166},[167,161,168],"ES6","Set",{"category":40,"tags":170},[40,171,172],"动态规划","背包问题",{"category":40,"tags":174},[40,175],"滑动窗口",{"category":40,"tags":177},[42,178,161],"链表",{"category":40,"tags":180},[40,181,161,182],"ACM","面试",{"category":40,"tags":184},[40,161,185],"数据类型转换",{"category":40,"tags":187},[42,188,178,189],"顺序表","TypeScript",{"category":5,"tags":191},[135,154,134,192],"渲染",{"category":5,"tags":194},[135,195,134,196],"富文本编辑","wangEditor",{"category":40,"tags":198},[199,40,178],"力扣",{"category":5,"tags":201},[202,203,204,91],"DNS","加密","网络安全",{"category":5,"tags":206},[135,207],"Axios",{"category":5,"tags":209},[135,207,189,210],"接口封装",{"category":5,"tags":212},[135,213,145],"JWT",{"category":152,"tags":215},[134,216,217,154,218],"画布","React","项目开发",{"category":17,"tags":220},[221],"日志",{"category":5,"tags":223},[224,225,226,227],"Neo4j","图数据库","中心度分析","PageRank",{"category":12,"tags":229},[230,231,232,233],"论文","机器学习","随机森林","保险欺诈",{"category":5,"tags":235},[236],"人工智能",{"category":5,"tags":238},[231,40,32],{"category":12,"tags":240},[241,242,243,244],"共识算法","最长链","区块链","算法设计",{"category":5,"tags":246},[161,247,248,135],"闭包","作用域",{"category":5,"tags":250},[14,138,251,252],"RSS","自动化",{"category":30,"tags":254},[89,90,91,255],"安装",{"category":30,"tags":257},[258,91,259],"MSYS2","开发环境",{"category":5,"tags":261},[262,263,264,265],"团队协作","Git","Commit规范","代码审查",{"category":30,"tags":267},[268,269,270],"oh-my-posh","终端美化","CLI",{"category":5,"tags":272},[273,274,275],"上下文工程","Agent","RAG",{"category":5,"tags":277},[278,279,280],"前端工程化","技术选型","工程基建",{"category":5,"tags":282},[275],{"category":5,"tags":284},[285,286],"SDD","规格驱动开发",{"category":5,"tags":288},[289],"neovim",{"category":5,"tags":291},[292],"技术写作",{"category":5,"tags":294},[295,32,296,89,297],"FastAPI","后端","工程实践",{"category":152,"tags":299},[274,300],"Harness Engineering",{"category":5,"tags":302},[303],"RFC",{"category":152,"tags":305},[274,300,275],{"category":152,"tags":307},[274],{"category":40,"tags":309},[199,40,161,310],"两数之和",{"category":40,"tags":312},[199,40,161,313],"双指针",{"category":40,"tags":315},[199,40,161,178],{"category":40,"tags":317},[199,40,161,175],{"category":40,"tags":319},[199,40,161,320],"回溯",{"category":5,"tags":322},[323,324,325,326],"分布式处理与计算","Spark","Scala","RDD",{"category":5,"tags":328},[323,329,330,331],"线性回归","逻辑回归","监督学习",{"category":5,"tags":333},[323,334,335,336],"数值优化","牛顿法","收敛性",{"category":5,"tags":338},[323,339,340,341],"PCA","数据降维","正则化",{"category":5,"tags":343},[323,344,345,346],"聚类","层次聚类","K-Means",{"category":5,"tags":348},[323,349,350,351],"随机模拟","统计推断","EM算法",{"category":5,"tags":353},[24],{"category":5,"tags":355},[24],{"category":5,"tags":357},[24],{"category":40,"tags":359},[42,360],"图论",{"category":40,"tags":362},[42,363,364],"树","二叉树",{"category":40,"tags":366},[42,160],{"category":40,"tags":368},[42],{"category":40,"tags":370},[42,159],{"category":40,"tags":372},[42,40,373],"复杂度分析",{"category":40,"tags":375},[42,43,178],{"category":40,"tags":377},[42,43,188],{"category":40,"tags":379},[42,380],"基础概念",{"category":17,"tags":382},[383,384,385],"随记","照片","高中",{"category":17,"tags":387},[383,388,389],"团建","战地",{"category":17,"tags":391},[383,392],"生活",{"category":17,"tags":394},[383,395],"文学",{"category":17,"tags":397},[383,398,399],"SCP","模因",{"category":17,"tags":401},[383,402,403],"画集","艺术",{"category":17,"tags":405},[14,406,383],"写作",{"category":17,"tags":408},[383,409,410],"音乐","摇滚",{"category":17,"tags":412},[383,392],{"category":17,"tags":414},[383,409],{"category":17,"tags":416},[383,35,392],{"category":17,"tags":418},[383,419,420],"同人","手书",{"category":17,"tags":422},[383,392],{"category":17,"tags":424},[383,392],{"category":17,"tags":426},[383,427],"植物",{"category":17,"tags":429},[383,430],"读书",{"category":17,"tags":432},[383,392],{"category":17,"tags":434},[383,392],{"category":17,"tags":436},[383,392],{"category":17,"tags":438},[383,392],{"category":17,"tags":440},[383,392],{"category":17,"tags":442},[383,392],{"category":17,"tags":444},[14,445,383],"一周年",{"category":17,"tags":447},[383,392],{"category":17,"tags":449},[383,392],{"category":17,"tags":451},[35,452,453],"开源组织","SITE-193",{"category":17,"tags":455},[383,392],{"category":17,"tags":457},[383,458],"年末",{"category":17,"tags":460},[383,392],{"category":17,"tags":462},[383,392],{"category":17,"tags":464},[14,17],{"category":17,"tags":466},[383,392],{"category":17,"tags":468},[383,392],{"category":17,"tags":470},[383,392],{"category":17,"tags":472},[383,392],{"category":17,"tags":474},[383,475,476],"游戏","Control",{"category":30,"tags":478},[479,480,481,482],"Quadim","图像处理","四叉树","Rust",{"category":17,"tags":484},[14,485],"上线纪念",{"category":17,"tags":487},[383,395],{"category":30,"tags":489},[203,490],"测试",{"category":17,"tags":492},[383],{"category":17,"tags":494},[383,392],{"category":17,"tags":496},[383],{"category":5,"tags":498},[40],{"category":5,"tags":500},[40],{"category":5,"tags":502},[40],{"category":5,"tags":504},[40],{"category":5,"tags":506},[40],[508,512,516,520,524,528,532,536,540,544,548,552,556,560,564,568,572,576,579,583,587,590,594,598,602,606,610,614,618,622,626,630,634,638,642,646,650,654,658,662,666,670,674,678,682,686,690,694,698,702,706,710,714,718,722,726,730,734,738,742,746,750,754,758,762,766,770,774,778,782,786,790,794,798,801,805,809,813,817,821,825,829,833,837,841,845,849,853,857,861,865,869,873,877,881,885,889,893,897,901,904,907,911,915,919,923,927,930,934,938,942,946,950,954,957,961,965,969,973,977,981,984,988,992,996,1000,1004,1007,1011,1015,1019,1023,1027,1031,1035,1039,1043,1047,1051,1055,1059,1063,1067,1071,1075,1079],{"path":509,"words":510,"published":511,"date":156},"\u002Fposts\u002F2024\u002F2024-06-25-liteloaderqqnt",1296,"2024-06-25 11:03:08",{"path":513,"words":514,"published":515,"date":156},"\u002Fposts\u002F2024\u002F2024-06-26-ip签名",0,"2024-06-26 22:53:53",{"path":517,"words":518,"published":519,"date":156},"\u002Fposts\u002F2024\u002F2024-06-29-何加盐中文互联网正在加速崩塌",4853,"2024-06-29 00:47:13",{"path":521,"words":522,"published":523,"date":156},"\u002Fposts\u002F2024\u002F2024-07-12-github-chart",270,"2024-07-12 20:02:50",{"path":525,"words":526,"published":527,"date":156},"\u002Fposts\u002F2024\u002F2024-07-14-访客数统计",192,"2024-07-24 01:34:28",{"path":529,"words":530,"published":531,"date":156},"\u002Fposts\u002F2024\u002F2024-07-26-广大选课脚本",110,"2024-07-26 01:34:28",{"path":533,"words":534,"published":535,"date":156},"\u002Fposts\u002F2024\u002F2024-07-26-数学分析笔记其二",14,"2024-07-26 23:54:02",{"path":537,"words":538,"published":539,"date":156},"\u002Fposts\u002F2024\u002F2024-07-26-数据结构复习其二",12856,"2024-07-26 02:48:08",{"path":541,"words":542,"published":543,"date":156},"\u002Fposts\u002F2024\u002F2024-07-26-数据结构复习相关",32856,"2024-07-26 02:24:14",{"path":545,"words":546,"published":547,"date":156},"\u002Fposts\u002F2024\u002F2024-07-26-线性代数与空间解析几何知识点全汇总",6110,"2024-07-26 03:27:55",{"path":549,"words":550,"published":551,"date":156},"\u002Fposts\u002F2024\u002F2024-07-31-typora-picgo-兰空图床打造markdown写作环境",311,"2024-07-31 12:56:23",{"path":553,"words":554,"published":555,"date":156},"\u002Fposts\u002F2024\u002F2024-09-02-jupyter配置中文",441,"2024-09-02 23:49:05",{"path":557,"words":558,"published":559,"date":156},"\u002Fposts\u002F2024\u002F2024-09-02-自定义vscode背景图片",100,"2024-09-02 23:39:00",{"path":561,"words":562,"published":563,"date":156},"\u002Fposts\u002F2024\u002F2024-09-03-制作gzhu校园网路由器",1423,"2024-09-03 23:43:18",{"path":565,"words":566,"published":567,"date":156},"\u002Fposts\u002F2024\u002F2024-09-26-09-25-2024",136,"2024-09-26 00:49:26",{"path":569,"words":570,"published":571,"date":156},"\u002Fposts\u002F2024\u002F2024-11-04-创建一个网络包解码器分析devp2p协议",1943,"2024-11-04 16:45:19",{"path":573,"words":574,"published":575,"date":156},"\u002Fposts\u002F2024\u002F2025-03-09-2024一些笔记常微分",16,"2024-12-09 22:51:00",{"path":577,"words":574,"published":578,"date":156},"\u002Fposts\u002F2024\u002F2025-03-09-2024一些笔记概率论","2025-03-09 22:51:00",{"path":580,"words":581,"published":582,"date":156},"\u002Fposts\u002F2025\u002F2025-03-01-windows下释放docker占用的wsl空间",164,"2025-03-01 13:54:15",{"path":584,"words":585,"published":586,"date":156},"\u002Fposts\u002F2025\u002F2025-03-01-爬虫实战-爬取广州大学课程表",774,"2025-03-01 14:55:48",{"path":588,"words":530,"published":589,"date":156},"\u002Fposts\u002F2025\u002F2025-04-03-hexo集成gitalk的问题","2025-04-03 14:26:34",{"path":591,"words":592,"published":593,"date":156},"\u002Fposts\u002F2025\u002F2025-09-22-记一次配置obsidian配合hexo写博客",92,"2025-09-22 16:47:52",{"path":595,"words":596,"published":597,"date":156},"\u002Fposts\u002F2025\u002F2025-10-24-10-20课题",204,"2025-10-24 08:15:01",{"path":599,"words":600,"published":601,"date":156},"\u002Fposts\u002F2025\u002F2025-11-02-组会朝花夕拾",501,"2025-11-02 18:56:59",{"path":603,"words":604,"published":605,"date":156},"\u002Fposts\u002F2025\u002F2025-11-05-基于随机加权推断模型im的参数估计算法",481,"2025-11-05 20:51:41",{"path":607,"words":608,"published":609,"date":156},"\u002Fposts\u002F2025\u002F2025-11-09-关于软考高项网规",884,"2025-11-09 19:54:52",{"path":611,"words":612,"published":613,"date":156},"\u002Fposts\u002F2025\u002F2025-11-17-arch-linux运行appimage相关",365,"2025-11-17 09:59:59",{"path":615,"words":616,"published":617,"date":156},"\u002Fposts\u002F2025\u002F2025-11-19-相关概念",2058,"2025-11-19 11:06:20",{"path":619,"words":620,"published":621,"date":156},"\u002Fposts\u002F2025\u002F2025-11-21-web可视化实践canvas",6393,"2025-11-21 14:50:48",{"path":623,"words":624,"published":625,"date":156},"\u002Fposts\u002F2025\u002F2025-11-22-使用-github-actions-自动部署基于vite的项目到-github-pages",272,"2025-11-23 01:59:24",{"path":627,"words":628,"published":629,"date":156},"\u002Fposts\u002F2025\u002F2025-11-22-关于前端包管理器npmpnpmyarn和bun",4890,"2025-11-22 21:21:15",{"path":631,"words":632,"published":633,"date":156},"\u002Fposts\u002F2025\u002F2025-11-23-undo-redo-机制具体实现",7839,"2025-11-23 19:15:00",{"path":635,"words":636,"published":637,"date":156},"\u002Fposts\u002F2025\u002F2025-11-27-前端安全-关于xss与crsf",1866,"2025-11-28 02:05:25",{"path":639,"words":640,"published":641,"date":156},"\u002Fposts\u002F2025\u002F2025-12-05-现代协同-2d-画布编辑器pixijs-v8",4285,"2025-12-05 02:00:16",{"path":643,"words":644,"published":645,"date":156},"\u002Fposts\u002F2025\u002F2025-12-07-杂谈-课题组系统设计",3710,"2025-12-07 21:09:33",{"path":647,"words":648,"published":649,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-javascript中的数组方法与栈stack和队列queue的实现",474,"2025-11-29 16:58:15",{"path":651,"words":652,"published":653,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-关于javascript-实现哈希表",189,"2025-11-27 11:31:39",{"path":655,"words":656,"published":657,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-关于javascript的set方法",332,"2025-12-25 15:26:18",{"path":659,"words":660,"published":661,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-关于动态规划(背包问题为例)",1238,"2025-11-17 18:24:04",{"path":663,"words":664,"published":665,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-关于滑动窗口",712,"2025-11-20 15:04:40",{"path":667,"words":668,"published":669,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-关于链表(javascript)",500,"2025-11-25 13:00:48",{"path":671,"words":672,"published":673,"date":156},"\u002Fposts\u002F2025\u002F2025-12-25-面试算法acm模式构建构建输入输出模板",2051,"2025-12-25 23:09:45",{"path":675,"words":676,"published":677,"date":156},"\u002Fposts\u002F2025\u002F2025-12-26-javascript-数字数组字符串的处理",483,"2025-12-26 11:20:25",{"path":679,"words":680,"published":681,"date":156},"\u002Fposts\u002F2025\u002F2025-12-26-javascripttypescript-的顺序表链表实现",446,"2025-12-26 12:16:12",{"path":683,"words":684,"published":685,"date":156},"\u002Fposts\u002F2025\u002F2025-12-27-前端画布设计vol-1-实现基础yuan素渲染和状态控制",2136,"2025-12-28 01:23:08",{"path":687,"words":688,"published":689,"date":156},"\u002Fposts\u002F2025\u002F2025-12-27-前端画布设计vol-2-实现富文本编辑",1838,"2025-12-28 02:58:47",{"path":691,"words":692,"published":693,"date":156},"\u002Fposts\u002F2025\u002F2025-12-27-算法刷题-关于链表操作",2135,"2025-12-27 16:12:42",{"path":695,"words":696,"published":697,"date":156},"\u002Fposts\u002F2025\u002F2025-12-27-配置dnscrypt-proxy实现加密dns服务windows",1899,"2025-11-15 01:06:37",{"path":699,"words":700,"published":701,"date":156},"\u002Fposts\u002F2025\u002F2025-12-28-前端-关于网络请求xhrajaxfetchaxios",7788,"2025-10-28 15:48:46",{"path":703,"words":704,"published":705,"date":156},"\u002Fposts\u002F2025\u002F2025-12-28-前端-接口封装与请求规范axios为例",2373,"2025-12-29 01:01:18",{"path":707,"words":708,"published":709,"date":156},"\u002Fposts\u002F2025\u002F2025-12-28-前端-身份验证管理-基于-jwt-token-的实现",2709,"2025-11-23 22:04:41",{"path":711,"words":712,"published":713,"date":156},"\u002Fposts\u002F2025\u002F2025-12-29-记canvas画布项目开发",6254,"2025-12-29 04:52:15",{"path":715,"words":716,"published":717,"date":156},"\u002Fposts\u002F2025\u002Fabout-site",116,"2025-03-31 16:44:24",{"path":719,"words":720,"published":721,"date":156},"\u002Fposts\u002F2025\u002F使用neo4j图数据科学库gds进行中心度分析",143,"2025-04-02 23:37:24",{"path":723,"words":724,"published":725,"date":156},"\u002Fposts\u002F2026\u002F2026-01-03-论文实训草稿",10445,"2026-01-03 14:10:49",{"path":727,"words":728,"published":729,"date":156},"\u002Fposts\u002F2026\u002F2026-01-06-人工智能导论",11461,"2026-01-07 03:25:49",{"path":731,"words":732,"published":733,"date":156},"\u002Fposts\u002F2026\u002F2026-01-07-机器学习相关算法",82,"2026-01-08 02:28:13",{"path":735,"words":736,"published":737,"date":156},"\u002Fposts\u002F2026\u002F2026-01-16-关于低复杂度最长链共识算法设计",4466,"2026-01-16 10:33:23",{"path":739,"words":740,"published":741,"date":156},"\u002Fposts\u002F2026\u002F2026-01-19-杂记2026-01-19",5754,"2026-01-20 01:03:26",{"path":743,"words":744,"published":745,"date":156},"\u002Fposts\u002F2026\u002F2026-01-22-github-action-自动同步博客到-github-主页",1069,"2026-01-22 16:31:47",{"path":747,"words":748,"published":749,"date":156},"\u002Fposts\u002F2026\u002F2026-03-01-windows-wsl安装docker",257,"2026-03-01 20:55:31",{"path":751,"words":752,"published":753,"date":156},"\u002Fposts\u002F2026\u002F2026-03-14-关于-msys2",701,"2026-03-15 03:05:04",{"path":755,"words":756,"published":757,"date":156},"\u002Fposts\u002F2026\u002F2026-03-28-团队项目协作规范随记",2419,"2026-03-29 05:33:50",{"path":759,"words":760,"published":761,"date":156},"\u002Fposts\u002F2026\u002F2026-03-29-oh-my-posh配置分享",104,"2026-03-29 16:34:43",{"path":763,"words":764,"published":765,"date":156},"\u002Fposts\u002F2026\u002F2026-06-13-从上下文工程到-agent-harness-engineering",8840,"2026-06-13 21:06:20",{"path":767,"words":768,"published":769,"date":156},"\u002Fposts\u002F2026\u002F2026-07-13-简谈前端基建质量标准与ai友好建设",3814,"2026-07-13 21:06:20",{"path":771,"words":772,"published":773,"date":156},"\u002Fposts\u002F2026\u002F2026-07-15-agentic-rag-系统实践",13357,"2026-07-15 21:06:20",{"path":775,"words":776,"published":777,"date":156},"\u002Fposts\u002F2026\u002F2026-07-18-简谈sdd规范驱动开发-copy",4476,"2026-07-18 11:06:20",{"path":779,"words":780,"published":781,"date":156},"\u002Fposts\u002F2026\u002F2026-07-20-个人neovim配置分享",366,"2026-07-22 13:46:50",{"path":783,"words":784,"published":785,"date":156},"\u002Fposts\u002F2026\u002F2026-07-20-关于技术写作-设计文档",6763,"2026-07-20 13:46:50",{"path":787,"words":788,"published":789,"date":156},"\u002Fposts\u002F2026\u002F2026-07-29-fastapi-工程实践随记",3417,"2026-07-29 04:58:34",{"path":791,"words":792,"published":793,"date":156},"\u002Fposts\u002Frfc_agentic_project\u002F2026-06-19-rfc-liskin_code_agent",3563,"2026-06-19 15:18:20",{"path":795,"words":796,"published":797,"date":156},"\u002Fposts\u002Frfc_agentic_project\u002F2026-07-25-rfc-glushkov_ogas",13461,"2026-07-28 23:46:50",{"path":799,"words":800,"published":793,"date":156},"\u002Fposts\u002Frfc_agentic_project\u002F2026-08-03-adr-ogas-arkhiv",2698,{"path":802,"words":803,"published":804,"date":156},"\u002Fposts\u002Frfc_agentic_project\u002Frag\u002F2026-08-12-arkhiv_rag-vol-1",4366,"2026-08-12 15:18:20",{"path":806,"words":807,"published":808,"date":156},"\u002Fposts\u002Fleetcode\u002F2025-12-25-力扣百题速练javascripttypescriptvol-1",3108,"2025-12-25 13:57:08",{"path":810,"words":811,"published":812,"date":156},"\u002Fposts\u002Fleetcode\u002F2025-12-26-力扣百题速练javascripttypescriptvol-2",3185,"2025-12-26 13:57:08",{"path":814,"words":815,"published":816,"date":156},"\u002Fposts\u002Fleetcode\u002F2025-12-28-力扣百题速练javascripttypescriptvol-3",2533,"2025-12-29 02:15:44",{"path":818,"words":819,"published":820,"date":156},"\u002Fposts\u002Fleetcode\u002F2026-01-17-力扣百题速练javascripttypescriptvol-4",3024,"2026-01-17 22:53:01",{"path":822,"words":823,"published":824,"date":156},"\u002Fposts\u002Fleetcode\u002F2026-01-19-力扣百题速练javascripttypescriptvol-5",293,"2026-01-19 15:15:12",{"path":826,"words":827,"published":828,"date":156},"\u002Fposts\u002F分布式处理与计算\u002F分布式处理与计算spark系统与scala语言",4320,"2026-07-06 14:10:49",{"path":830,"words":831,"published":832,"date":156},"\u002Fposts\u002F分布式处理与计算\u002F分布式处理与计算分类与回归分析",2081,"2026-07-07 12:40:29",{"path":834,"words":835,"published":836,"date":156},"\u002Fposts\u002F分布式处理与计算\u002F分布式处理与计算数值优化方法",2182,"2026-07-07 13:50:29",{"path":838,"words":839,"published":840,"date":156},"\u002Fposts\u002F分布式处理与计算\u002F分布式处理与计算数据降维",1583,"2026-07-07 21:50:29",{"path":842,"words":843,"published":844,"date":156},"\u002Fposts\u002F分布式处理与计算\u002F分布式处理与计算聚类分析",1882,"2026-07-07 16:50:29",{"path":846,"words":847,"published":848,"date":156},"\u002Fposts\u002F分布式处理与计算\u002F分布式处理与计算随机模拟与统计推断",2433,"2026-07-06 22:40:29",{"path":850,"words":851,"published":852,"date":156},"\u002Fposts\u002F数据可视化\u002F2026-06-14-数据可视化-基本图像",10011,"2026-06-14 20:18:20",{"path":854,"words":855,"published":856,"date":156},"\u002Fposts\u002F数据可视化\u002F2026-06-14-数据可视化-概论",10030,"2026-06-14 15:18:20",{"path":858,"words":859,"published":860,"date":156},"\u002Fposts\u002F数据可视化\u002F2026-06-15-数据可视化-可视化库",2032,"2026-06-15 20:18:20",{"path":862,"words":863,"published":864,"date":156},"\u002Fposts\u002F数据结构\u002F2025-09-29-数据结构-图",5451,"2025-04-15 20:48:06",{"path":866,"words":867,"published":868,"date":156},"\u002Fposts\u002F数据结构\u002F2025-09-29-数据结构-树",4211,"2025-04-30 02:19:06",{"path":870,"words":871,"published":872,"date":156},"\u002Fposts\u002F数据结构\u002F2025-09-29-数据结构-队列",921,"2025-04-11 15:30:08",{"path":874,"words":875,"published":876,"date":156},"\u002Fposts\u002F数据结构\u002F关于数据结构的一些想法",456,"2025-04-04 19:13:49",{"path":878,"words":879,"published":880,"date":156},"\u002Fposts\u002F数据结构\u002F数据结构-栈",920,"2025-04-18 00:17:37",{"path":882,"words":883,"published":884,"date":156},"\u002Fposts\u002F数据结构\u002F数据结构-算法复杂度",2153,"2025-04-05 16:09:55",{"path":886,"words":887,"published":888,"date":156},"\u002Fposts\u002F数据结构\u002F数据结构-线性表链表",4572,"2025-04-06 00:24:40",{"path":890,"words":891,"published":892,"date":156},"\u002Fposts\u002F数据结构\u002F数据结构-线性表顺序表",4191,"2025-04-05 22:09:59",{"path":894,"words":895,"published":896,"date":156},"\u002Fposts\u002F数据结构\u002F数据结构-绪论",2881,"2025-04-05 11:31:22",{"path":898,"words":899,"published":156,"date":900},"\u002Fposts\u002F杂记\u002F2023-12-26-2023年12月26日",7,"2023-12-26 23:51:33",{"path":902,"words":899,"published":156,"date":903},"\u002Fposts\u002F杂记\u002F2024-01-01-2024团建","2024-01-01 01:51:27",{"path":905,"words":581,"published":156,"date":906},"\u002Fposts\u002F杂记\u002F2024-01-09-随记","2024-01-09 20:50:35",{"path":908,"words":909,"published":156,"date":910},"\u002Fposts\u002F杂记\u002F2024-03-12-花名",5275,"2024-03-12 16:04:23",{"path":912,"words":913,"published":156,"date":914},"\u002Fposts\u002F杂记\u002F2024-04-15-逆模因",1353,"2024-04-15 00:26:16",{"path":916,"words":917,"published":156,"date":918},"\u002Fposts\u002F杂记\u002F2024-05-03-艺作",27,"2024-05-03 00:01:00",{"path":920,"words":921,"published":156,"date":922},"\u002Fposts\u002F杂记\u002F2024-05-21-关于博客",1720,"2024-02-21 23:21:11",{"path":924,"words":925,"published":156,"date":926},"\u002Fposts\u002F杂记\u002F2024-06-20-dnvrc维克多崔专访-2023",2036,"2024-06-20 00:28:39",{"path":928,"words":760,"published":156,"date":929},"\u002Fposts\u002F杂记\u002F2024-06-25-6月25日随记","2024-06-25 12:46:36",{"path":931,"words":932,"published":156,"date":933},"\u002Fposts\u002F杂记\u002F2024-06-25-歌名-想見星星",148,"2024-06-25 22:47:59",{"path":935,"words":936,"published":156,"date":937},"\u002Fposts\u002F杂记\u002F2024-07-11-桂花岗",6,"2024-07-11 00:28:17",{"path":939,"words":940,"published":156,"date":941},"\u002Fposts\u002F杂记\u002F2024-07-15-rolling-bocci",9,"2024-07-15 21:25:56",{"path":943,"words":944,"published":156,"date":945},"\u002Fposts\u002F杂记\u002F2024-07-22-七月九日",34,"2024-07-09 17:54:23",{"path":947,"words":948,"published":156,"date":949},"\u002Fposts\u002F杂记\u002F2024-07-22-六月随记",1052,"2024-07-22 01:03:19",{"path":951,"words":952,"published":156,"date":953},"\u002Fposts\u002F杂记\u002F2024-07-22-石菖蒲",41,"2024-07-10 01:26:05",{"path":955,"words":514,"published":156,"date":956},"\u002Fposts\u002F杂记\u002F2024-07-23-新书","2024-07-23 01:05:49",{"path":958,"words":959,"published":156,"date":960},"\u002Fposts\u002F杂记\u002F2024-07-29-年前",74,"2024-07-29 23:59:07",{"path":962,"words":963,"published":156,"date":964},"\u002Fposts\u002F杂记\u002F2024-07-30-周边",138,"2024-07-30 02:03:23",{"path":966,"words":967,"published":156,"date":968},"\u002Fposts\u002F杂记\u002F2024-07-31-2024-7-31日",185,"2024-07-31 01:21:52",{"path":970,"words":971,"published":156,"date":972},"\u002Fposts\u002F杂记\u002F2024-08-02-八月",1710,"2024-08-30 00:31:02",{"path":974,"words":975,"published":156,"date":976},"\u002Fposts\u002F杂记\u002F2024-09-01-九月",1484,"2024-09-26 16:30:15",{"path":978,"words":979,"published":156,"date":980},"\u002Fposts\u002F杂记\u002F2024-09-08-2024年9月8日",97,"2024-09-08 13:59:36",{"path":982,"words":514,"published":156,"date":983},"\u002Fposts\u002F杂记\u002F2024-09-19-博客站的一周年","2024-09-18 23:36:24",{"path":985,"words":986,"published":156,"date":987},"\u002Fposts\u002F杂记\u002F2024-10-03-十月",1028,"2024-10-31 23:54:27",{"path":989,"words":990,"published":156,"date":991},"\u002Fposts\u002F杂记\u002F2024-11-04-十一月",2134,"2024-11-30 00:04:39",{"path":993,"words":994,"published":156,"date":995},"\u002Fposts\u002F杂记\u002F2024-11-10-gzhu-site-193",80,"2024-11-10 19:19:12",{"path":997,"words":998,"published":156,"date":999},"\u002Fposts\u002F杂记\u002F2024-12-01-十二月",455,"2024-12-30 23:13:47",{"path":1001,"words":1002,"published":156,"date":1003},"\u002Fposts\u002F杂记\u002F2024-12-21-年末",23,"2024-12-21 23:21:49",{"path":1005,"words":522,"published":156,"date":1006},"\u002Fposts\u002F杂记\u002F2025-01-30-一月","2025-01-30 23:44:41",{"path":1008,"words":1009,"published":156,"date":1010},"\u002Fposts\u002F杂记\u002F2025-03-01-二月",224,"2025-02-28 00:11:08",{"path":1012,"words":1013,"published":156,"date":1014},"\u002Fposts\u002F杂记\u002F2025-03-01-博客杂谈",344,"2025-03-01 16:03:18",{"path":1016,"words":1017,"published":156,"date":1018},"\u002Fposts\u002F杂记\u002F2025-03-05-三月",2090,"2025-03-05 19:17:28",{"path":1020,"words":1021,"published":156,"date":1022},"\u002Fposts\u002F杂记\u002F2025-07-10-七月",361,"2025-07-10 22:04:32",{"path":1024,"words":1025,"published":156,"date":1026},"\u002Fposts\u002F杂记\u002F2025-09-21-九月",781,"2025-09-21 20:53:37",{"path":1028,"words":1029,"published":156,"date":1030},"\u002Fposts\u002F杂记\u002F2025-10-09-十月",591,"2025-10-09 00:35:07",{"path":1032,"words":1033,"published":156,"date":1034},"\u002Fposts\u002F杂记\u002Fcontrol",13,"2023-09-25 13:03:59",{"path":1036,"words":1037,"published":156,"date":1038},"\u002Fposts\u002F杂记\u002Fquadim四叉树图像处理",1094,"2023-10-21 11:27:06",{"path":1040,"words":1041,"published":156,"date":1042},"\u002Fposts\u002F杂记\u002Fsuccess",24,"2023-09-22 15:59:07",{"path":1044,"words":1045,"published":156,"date":1046},"\u002Fposts\u002F杂记\u002F三光年",295,"2023-11-18 04:18:40",{"path":1048,"words":1049,"published":156,"date":1050},"\u002Fposts\u002F杂记\u002F加密测试",961,"2023-11-21 14:24:01",{"path":1052,"words":1053,"published":156,"date":1054},"\u002Fposts\u002F杂记\u002F啊啊啊啊啊啊啊",54,"2023-09-20 17:29:33",{"path":1056,"words":1057,"published":156,"date":1058},"\u002Fposts\u002F杂记\u002F杂谈",124,"2023-09-25 23:11:32",{"path":1060,"words":1061,"published":156,"date":1062},"\u002Fposts\u002F杂记\u002F艹",25,"2023-10-21 17:40:43",{"path":1064,"words":1065,"published":1066,"date":156},"\u002Fposts\u002F神经网络\u002F神经网络与深度学习卷积神经网络",3168,"2026-06-07 11:23:08",{"path":1068,"words":1069,"published":1070,"date":156},"\u002Fposts\u002F神经网络\u002F神经网络与深度学习循环神经网络",2348,"2026-06-07 11:33:08",{"path":1072,"words":1073,"published":1074,"date":156},"\u002Fposts\u002F神经网络\u002F神经网络与深度学习改进学习方法",3360,"2026-06-07 10:13:08",{"path":1076,"words":1077,"published":1078,"date":156},"\u002Fposts\u002F神经网络\u002F神经网络与深度学习深度生成模型",2727,"2026-06-07 11:43:08",{"path":1080,"words":1081,"published":1082,"date":156},"\u002Fposts\u002F神经网络\u002F神经网络与深度学习神经网络基础",3205,"2026-06-07 10:03:08",{"id":1084,"title":1085,"abbrlink":1086,"body":1087,"category":5,"cover":156,"date":156,"description":1122,"extension":3227,"mathjax":3228,"meta":3229,"navigation":3228,"path":739,"published":741,"readingMinutes":3232,"seo":3233,"stem":3234,"sticky":156,"swiper_index":156,"tags":3235,"updated":156,"words":740,"__hash__":3236},"posts\u002Fposts\u002F2026\u002F2026-01-19-杂记2026-01-19.md","2026-01-19-杂记 2026-01-19","22446",{"type":1088,"value":1089,"toc":3182},"minimark",[1090,1093,1097,1103,1112,1115,1126,1129,1133,1143,1149,1156,1162,1170,1176,1179,1186,1189,1195,1198,1204,1207,1213,1216,1219,1222,1228,1231,1234,1242,1245,1250,1253,1259,1262,1267,1270,1276,1279,1284,1287,1293,1296,1299,1301,1305,1308,1311,1319,1323,1336,1339,1342,1348,1350,1352,1356,1362,1369,1372,1386,1390,1395,1401,1407,1421,1425,1434,1562,1568,1572,1575,1581,1585,1592,1598,1602,1614,1620,1623,1663,1665,1667,1671,1674,1677,1680,1686,1689,1692,1800,1804,1836,1839,1845,1850,1858,1878,1880,1882,2268,2272,2275,2281,2295,2299,2304,2332,2338,2342,2424,2428,2433,2458,2462,2467,2490,2496,2500,2505,2537,2541,2593,2599,2603,2612,2620,2629,2635,2640,2648,2652,2656,2662,2667,2681,2687,2691,2696,2738,2742,2747,2767,2772,2780,2784,2855,2859,2864,2882,2887,2913,2917,2972,2976,2981,2999,3004,3020,3024,3029,3043,3048,3062,3067,3078,3080,3082,3086,3090,3095,3106,3111,3126,3134,3138,3143,3154,3159,3169,3174],[1091,1092,247],"h2",{"id":247},[1094,1095,1096],"p",{},"函数＋创建时的词法环境",[1098,1099,1100],"blockquote",{},[1094,1101,1102],{},"当一个函数能够“记住并访问”它被创建时所处的词法作用域中的变量，即使这个函数在它原本的作用域之外被执行，这个函数就形成了闭包。",[1094,1104,1105,1109],{},[1106,1107,1108],"strong",{},"“闭包就是函数和其词法环境的组合”",[1106,1110,1111],{},"“闭包就是能够读取其他函数内部变量的函数”",[1094,1113,1114],{},"闭包是语言运行时的一种行为现象",[1116,1117,1123],"pre",{"className":1118,"code":1120,"language":1121,"meta":1122},[1119],"language-ts","\u002F\u002F 计数器\nfunction createCounter() {\n  let count = 0;           \u002F\u002F 处于外部函数作用域的变量\n  return function() {      \u002F\u002F 内部函数形成了闭包\n    return count++;\n  };\n}\n\nconst counter = createCounter();\nconsole.log(counter()); \u002F\u002F 0\nconsole.log(counter()); \u002F\u002F 1\nconsole.log(counter()); \u002F\u002F 2\n","ts","",[1124,1125,1120],"code",{"__ignoreMap":1122},[1094,1127,1128],{},"作用：封装，保存状态，延迟执行\n判断：能否访问已销毁外部作用域的变量（基于函数定义位置）",[1130,1131,1132],"h4",{"id":1132},"闭包应用场景",[1134,1135,1136],"ul",{},[1137,1138,1139,1142],"li",{},[1106,1140,1141],{},"在定时器、事件监听、Ajax 请求、Web Workers 或者任何异步中","，只要使用了回调函数，实际上就是在使用闭包：",[1116,1144,1147],{"className":1145,"code":1146,"language":1121,"meta":1122},[1119],"\u002F\u002F 定时器\nsetTimeout(function handler(){\n  console.log('1');\n}，1000);\n\u002F\u002F 事件监听\ndocument.getElementById(app).addEventListener('click', () => {\n  console.log('Event Listener');\n});\n",[1124,1148,1146],{"__ignoreMap":1122},[1134,1150,1151],{},[1137,1152,1153],{},[1106,1154,1155],{},"作为函数参数传递的形式：",[1116,1157,1160],{"className":1158,"code":1159,"language":1121,"meta":1122},[1119],"var a = 1;\nfunction foo(){\n  var a = 2;\n  function baz(){\n    console.log(a);\n  }\n  bar(baz);\n}\nfunction bar(fn){\n  \u002F\u002F 这是闭包\n  fn();\n}\nfoo();  \u002F\u002F 输出2，而不是1\n",[1124,1161,1159],{"__ignoreMap":1122},[1134,1163,1164],{},[1137,1165,1166,1169],{},[1106,1167,1168],{},"IIFE（立即执行函数）","，创建了闭包，保存了全局作用域（window）和当前函数的作用域，因此可以输出全局的变量：",[1116,1171,1174],{"className":1172,"code":1173,"language":1121,"meta":1122},[1119],"var a = 2;\n(function IIFE(){\n  console.log(a);  \u002F\u002F 输出2\n})();\n",[1124,1175,1173],{"__ignoreMap":1122},[1094,1177,1178],{},"IIFE 是一种自执行匿名函数，这个匿名函数拥有独立的作用域。这不仅可以避免了外界访问此 IIFE 中的变量，而且又不会污染全局作用域。",[1134,1180,1181],{},[1137,1182,1183],{},[1106,1184,1185],{},"结果缓存（备忘模式）",[1094,1187,1188],{},"备忘模式就是应用闭包的特点的一个典型应用。比如下面函数：",[1116,1190,1193],{"className":1191,"code":1192,"language":1121,"meta":1122},[1119],"function add(a) {\n    return a + 1;\n}\n",[1124,1194,1192],{"__ignoreMap":1122},[1094,1196,1197],{},"当多次执行 add() 时，每次得到的结果都是重新计算得到的，如果是开销很大的计算操作的话就比较消耗性能了，这里可以对已经计算过的输入做一个缓存。所以这里可以利用闭包的特点来实现一个简单的缓存，在函数内部用一个对象存储输入的参数，如果下次再输入相同的参数，那就比较一下对象的属性，如果有缓存，就直接把值从这个对象里面取出来。实现代码如下：",[1116,1199,1202],{"className":1200,"code":1201,"language":1121,"meta":1122},[1119],"function memorize(fn) {\n    var cache = {}\n    return function() {\n        var args = Array.prototype.slice.call(arguments)\n        var key = JSON.stringify(args)\n        return cache[key] || (cache[key] = fn.apply(fn, args))\n    }\n}\n\nfunction add(a) {\n    return a + 1\n}\n\nvar adder = memorize(add)\n\nadder(1)            \u002F\u002F 输出: 2    当前: cache: { '[1]': 2 }\nadder(1)            \u002F\u002F 输出: 2    当前: cache: { '[1]': 2 }\nadder(2)            \u002F\u002F 输出: 3    当前: cache: { '[1]': 2, '[2]': 3 }\n",[1124,1203,1201],{"__ignoreMap":1122},[1094,1205,1206],{},"使用 ES6 的方式实现：",[1116,1208,1211],{"className":1209,"code":1210,"language":1121,"meta":1122},[1119],"function memorize(fn) {\n    const cache = {}\n    return function(...args) {\n        const key = JSON.stringify(args)\n        return cache[key] || (cache[key] = fn.apply(fn, args))\n    }\n}\n\nfunction add(a) {\n    return a + 1\n}\n\nconst adder = memorize(add)\n\nadder(1)            \u002F\u002F 输出: 2    当前: cache: { '[1]': 2 }\nadder(1)            \u002F\u002F 输出: 2    当前: cache: { '[1]': 2 }\nadder(2)            \u002F\u002F 输出: 3    当前: cache: { '[1]': 2, '[2]': 3 }\n",[1124,1212,1210],{"__ignoreMap":1122},[1094,1214,1215],{},"备忘函数中用 JSON.stringify 把传给 adder 函数的参数序列化成字符串，把它当做 cache 的索引，将 add 函数运行的结果当做索引的值传递给 cache，这样 adder 运行的时候如果传递的参数之前传递过，那么就返回缓存好的计算结果，不用再计算了，如果传递的参数没计算过，则计算并缓存 fn.apply(fn, args)，再返回计算的结果。",[1130,1217,1218],{"id":1218},"循环输出问题",[1094,1220,1221],{},"最后来看一个常见的和闭包相关的循环输出问题，代码如下：",[1116,1223,1226],{"className":1224,"code":1225,"language":1121,"meta":1122},[1119],"for(var i = 1; i \u003C= 5; i ++){\n  setTimeout(function() {\n    console.log(i)\n  }, 0)\n}\n",[1124,1227,1225],{"__ignoreMap":1122},[1094,1229,1230],{},"这段代码输出的结果是 5 个 6，那为什么都是 6 呢？如何才能输出 1、2、3、4、5 呢？",[1094,1232,1233],{},"可以结合以下两点来思考第一个问题：",[1134,1235,1236,1239],{},[1137,1237,1238],{},"setTimeout 为宏任务，由于 JS 中单线程 eventLoop 机制，在主线程同步任务执行完后才去执行宏任务，因此循环结束后 setTimeout 中的回调才依次执行。",[1137,1240,1241],{},"因为 setTimeout 函数也是一种闭包，往上找它的父级作用域链就是 window，变量 i 为 window 上的全局变量，开始执行 setTimeout 之前变量 i 已经就是 6 了，因此最后输出的连续就都是 6。",[1094,1243,1244],{},"那如何按顺序依次输出 1、2、3、4、5 呢？",[1094,1246,1247],{},[1106,1248,1249],{},"1）利用 IIFE",[1094,1251,1252],{},"可以利用 IIFE（立即执行函数），当每次 for 循环时，把此时的变量 i 传递到定时器中，然后执行，改造之后的代码如下。",[1116,1254,1257],{"className":1255,"code":1256,"language":1121,"meta":1122},[1119],"for(var i = 1;i \u003C= 5;i++){\n  (function(j){\n    setTimeout(function timer(){\n      console.log(j)\n    }, 0)\n  })(i)\n}\n",[1124,1258,1256],{"__ignoreMap":1122},[1094,1260,1261],{},"可以看到，通过这样改造使用 IIFE（立即执行函数），可以实现序号的依次输出。利用立即执行函数的入参来缓存每一个循环中的 i 值。",[1094,1263,1264],{},[1106,1265,1266],{},"2）使用 ES6 中的 let",[1094,1268,1269],{},"ES6 中新增的 let 定义变量的方式，使得 ES6 之后 JS 发生革命性的变化，让 JS 有了块级作用域，代码的作用域以块级为单位进行执行。",[1116,1271,1274],{"className":1272,"code":1273,"language":1121,"meta":1122},[1119],"for(let i = 1; i \u003C= 5; i++){\n  setTimeout(function() {\n    console.log(i);\n  },0)\n}\n",[1124,1275,1273],{"__ignoreMap":1122},[1094,1277,1278],{},"可以看到，通过 let 定义变量的方式，重新定义 i 变量，则可以用最少的改动成本，解决该问题。",[1094,1280,1281],{},[1106,1282,1283],{},"3）定时器第三个参数",[1094,1285,1286],{},"setTimeout 作为经常使用的定时器，它是存在第三个参数的。我们经常使用前两个，一个是回调函数，另外一个是定时时间，setTimeout 从第三个入参位置开始往后，是可以传入无数个参数的。这些参数会作为回调函数的附加参数存在。那么结合第三个参数，调整完之后的代码如下：",[1116,1288,1291],{"className":1289,"code":1290,"language":1121,"meta":1122},[1119],"for(var i=1;i\u003C=5;i++){\n  setTimeout(function(j) {\n    console.log(j)\n  }, 0, i)\n}\n",[1124,1292,1290],{"__ignoreMap":1122},[1094,1294,1295],{},"可以看到，第三个参数的传递，可以改变 setTimeout 的执行逻辑，从而实现想要的结果",[1297,1298],"hr",{},[1297,1300],{},[1091,1302,1304],{"id":1303},"高阶函数higher-order-function","高阶函数（Higher-Order Function）",[1094,1306,1307],{},"JavaScript的函数其实都指向某个变量。既然变量可以指向函数，函数的参数能接收变量，那么一个函数就可以接收另一个函数作为参数，这种函数就称之为高阶函数。",[1094,1309,1310],{},"一个最简单的高阶函数：",[1116,1312,1317],{"className":1313,"code":1315,"language":1316,"meta":1122},[1314],"language-javascript","function add(x, y, f) {\n    return f(x) + f(y);\n}\n","javascript",[1124,1318,1315],{"__ignoreMap":1122},[1091,1320,1322],{"id":1321},"柯里化currying","柯里化（Currying）",[1098,1324,1325],{},[1094,1326,1327,1328,1331,1332,1335],{},"柯里化是将一个接受 ",[1106,1329,1330],{},"多个参数"," 的函数，转换为 ",[1106,1333,1334],{},"一系列只接受单个参数"," 的函数的变换过程。",[1094,1337,1338],{},"f(a, b, c) === f(a)(b)(c)",[1094,1340,1341],{},"把“一次传入多个参数” → 拆成“多次每次只传一个参数”的调用链。",[1116,1343,1346],{"className":1344,"code":1345,"language":1121,"meta":1122},[1119],"\u002F\u002F 普通函数（非柯里化）\nfunction add(a, b, c) {\n  return a + b + c;\n}\n\nadd(1, 2, 3);         \u002F\u002F 6\n\n\n\u002F\u002F 柯里化版本\nfunction addCurried(a) {\n  return function(b) {\n    return function(c) {\n      return a + b + c;\n    };\n  };\n}\n\naddCurried(1)(2)(3);  \u002F\u002F 6\n\n\n\u002F\u002F 更常见的简写形式（箭头函数）\nconst addC = a => b => c => a + b + c;\n\naddC(1)(2)(3);        \u002F\u002F 6\n",[1124,1347,1345],{"__ignoreMap":1122},[1297,1349],{},[1297,1351],{},[1091,1353,1355],{"id":1354},"防抖debounce","防抖（Debounce）",[1094,1357,1358,1361],{},[1106,1359,1360],{},"定义","：当事件被触发后，延迟 n 秒再执行回调函数。如果在这 n 秒内事件再次被触发，则重新开始计时。",[1116,1363,1367],{"className":1364,"code":1366,"language":161,"meta":1122},[1365],"language-JavaScript","\u002F\u002F 方式1：简单版（非立即执行）\nfunction debounce(fn, wait) {\n  let timer = null;\n  \n  return function (...args) {\n    \u002F\u002F 每次触发都清除之前的定时器\n    if (timer) clearTimeout(timer);\n    \n    \u002F\u002F 重新设置定时器\n    timer = setTimeout(() => {\n      fn.apply(this, args);\n    }, wait);\n  };\n}\n\n\u002F\u002F 方式2：立即执行版 + 尾部执行（更常用）\nfunction debounce(fn, wait, immediate = false) {\n  let timer = null;\n  \n  return function (...args) {\n    const context = this;\n    \n    if (timer) clearTimeout(timer);\n    \n    if (immediate) {\n      const callNow = !timer;\n      timer = setTimeout(() => {\n        timer = null;\n      }, wait);\n      \n      if (callNow) fn.apply(context, args);\n    } else {\n      timer = setTimeout(() => {\n        fn.apply(context, args);\n      }, wait);\n    }\n  };\n}\n",[1124,1368,1366],{"__ignoreMap":1122},[1094,1370,1371],{},"**应用：",[1134,1373,1374,1377,1380,1383],{},[1137,1375,1376],{},"搜索框输入自动搜索（用户输入完再发请求）",[1137,1378,1379],{},"表单验证（输入停止后才校验）",[1137,1381,1382],{},"按钮短时间内多次点击（防止重复提交）",[1137,1384,1385],{},"window.resize 事件",[1091,1387,1389],{"id":1388},"节流throttle","节流（Throttle）",[1094,1391,1392,1394],{},[1106,1393,1360],{},"：规定时间内只执行一次函数，无论这段时间内触发多少次。",[1116,1396,1399],{"className":1397,"code":1398,"language":161,"meta":1122},[1365],"\u002F\u002F 方式1：时间戳版（第一次触发会立即执行）\nfunction throttle(fn, wait) {\n  let prev = 0;\n  \n  return function (...args) {\n    const now = Date.now();\n    \n    if (now - prev >= wait) {\n      fn.apply(this, args);\n      prev = now;\n    }\n  };\n}\n\n\u002F\u002F 方式2：定时器版（最后一次一定会执行）\nfunction throttle(fn, wait) {\n  let timer = null;\n  let lastArgs = null;\n  \n  return function (...args) {\n    lastArgs = args;\n    \n    if (!timer) {\n      fn.apply(this, lastArgs);\n      lastArgs = null;\n      \n      timer = setTimeout(() => {\n        if (lastArgs) {\n          fn.apply(this, lastArgs);\n        }\n        timer = null;\n        lastArgs = null;\n      }, wait);\n    }\n  };\n}\n\n\u002F\u002F 方式3：最推荐的综合版（头尾都能执行）\nfunction throttle(fn, wait) {\n  let timer = null;\n  let previous = 0;\n  \n  return function (...args) {\n    const now = Date.now();\n    const remaining = wait - (now - previous);\n    \n    if (remaining \u003C= 0) {\n      if (timer) {\n        clearTimeout(timer);\n        timer = null;\n      }\n      fn.apply(this, args);\n      previous = now;\n    } else if (!timer) {\n      timer = setTimeout(() => {\n        fn.apply(this, args);\n        previous = Date.now();\n        timer = null;\n      }, remaining);\n    }\n  };\n}\n",[1124,1400,1398],{"__ignoreMap":1122},[1094,1402,1403,1406],{},[1106,1404,1405],{},"应用场景","：",[1134,1408,1409,1412,1415,1418],{},[1137,1410,1411],{},"页面滚动到底部加载更多（无限滚动）",[1137,1413,1414],{},"拖拽元素时实时计算位置",[1137,1416,1417],{},"鼠标移动时画板实时绘制",[1137,1419,1420],{},"游戏中技能释放冷却（最典型的思想来源）",[1091,1422,1424],{"id":1423},"callapply-和-bind","call、apply 和 bind",[1094,1426,1427,1429,1430,1433],{},[1106,1428,1424],{}," 是 JavaScript 中 Function 对象提供的三个非常重要且经常被面试考察的方法，它们的主要作用都是",[1106,1431,1432],{},"改变函数执行时的 this 指向","，但在用法、参数传递方式和执行时机上存在显著差异。",[1435,1436,1437,1456],"table",{},[1438,1439,1440],"thead",{},[1441,1442,1443,1447,1450,1453],"tr",{},[1444,1445,1446],"th",{},"特性",[1444,1448,1449],{},"call",[1444,1451,1452],{},"apply",[1444,1454,1455],{},"bind",[1457,1458,1459,1476,1490,1503,1516,1529,1543],"tbody",{},[1441,1460,1461,1465,1468,1470],{},[1462,1463,1464],"td",{},"主要功能",[1462,1466,1467],{},"立即执行函数，并改变 this 指向",[1462,1469,1467],{},[1462,1471,1472,1475],{},[1106,1473,1474],{},"不立即执行","，返回一个新函数，永久绑定 this",[1441,1477,1478,1481,1484,1487],{},[1462,1479,1480],{},"参数传递方式",[1462,1482,1483],{},"逐个参数列出",[1462,1485,1486],{},"参数以数组形式传递",[1462,1488,1489],{},"逐个参数列出（与 call 相同）",[1441,1491,1492,1495,1498,1500],{},[1462,1493,1494],{},"返回值",[1462,1496,1497],{},"函数执行后的返回值",[1462,1499,1497],{},[1462,1501,1502],{},"新的绑定了 this 的函数",[1441,1504,1505,1508,1511,1513],{},[1462,1506,1507],{},"是否立即执行",[1462,1509,1510],{},"是",[1462,1512,1510],{},[1462,1514,1515],{},"否",[1441,1517,1518,1521,1524,1526],{},[1462,1519,1520],{},"参数是否可以后续补充",[1462,1522,1523],{},"否（一次性传完）",[1462,1525,1523],{},[1462,1527,1528],{},"是（可以分两次传参）",[1441,1530,1531,1534,1537,1540],{},[1462,1532,1533],{},"典型使用场景",[1462,1535,1536],{},"需要明确控制 this 并立即执行时",[1462,1538,1539],{},"处理类数组对象\u002F动态参数时",[1462,1541,1542],{},"事件处理、固定 this 的回调函数",[1441,1544,1545,1548,1551,1559],{},[1462,1546,1547],{},"语法示例",[1462,1549,1550],{},"fn.call(obj, 1, 2, 3)",[1462,1552,1553,1554,1558],{},"fn.apply(obj, ",[1555,1556,1557],"span",{},"1, 2, 3",")",[1462,1560,1561],{},"const newFn = fn.bind(obj, 1, 2)",[1116,1563,1566],{"className":1564,"code":1565,"language":161,"meta":1122},[1365],"\u002F\u002F 准备一个测试函数和对象\nfunction greet(greeting, punctuation) {\n  console.log(`${greeting}, 我是${this.name}${punctuation}`);\n}\n\nconst person = {\n  name: \"张三\"\n};\n\nconst anotherPerson = {\n  name: \"李四\"\n};\n",[1124,1567,1565],{"__ignoreMap":1122},[1130,1569,1571],{"id":1570},"_1-call","1. call()",[1094,1573,1574],{},"立即执行，参数逐个传入",[1116,1576,1579],{"className":1577,"code":1578,"language":161,"meta":1122},[1365],"greet.call(person, \"您好\", \"！\");     \n\u002F\u002F 输出：您好，我是张三！\n\ngreet.call(anotherPerson, \"早上好\", \"～\");\n\u002F\u002F 输出：早上好，我是李四～\n",[1124,1580,1578],{"__ignoreMap":1122},[1130,1582,1584],{"id":1583},"_2-apply","2. apply()",[1094,1586,1587,1588,1591],{},"立即执行，参数以",[1106,1589,1590],{},"数组","形式传入（非常适合处理 arguments 或类数组对象）",[1116,1593,1596],{"className":1594,"code":1595,"language":161,"meta":1122},[1365],"greet.apply(person, [\"下午好\", \"。\"]);   \n\u002F\u002F 输出：下午好，我是张三。\n\n\u002F\u002F 经典用法：求数组最大\u002F最小值（以前常考，现在 Math.max(...arr) 更常用）\nconst numbers = [5, 2, 9, 1, 7];\nconsole.log(Math.max.apply(null, numbers)); \u002F\u002F 9\n\u002F\u002F 现代写法：Math.max(...numbers)\n",[1124,1597,1595],{"__ignoreMap":1122},[1130,1599,1601],{"id":1600},"_3-bind","3. bind()",[1094,1603,1604,1607,1608,1610,1611],{},[1106,1605,1606],{},"最重要","的特点：",[1106,1609,1474],{},"，而是返回一个",[1106,1612,1613],{},"永久绑定了 this 的新函数",[1116,1615,1618],{"className":1616,"code":1617,"language":161,"meta":1122},[1365],"\u002F\u002F 绑定 this，并预设部分参数（函数柯里化常用）\nconst greetZhangSan = greet.bind(person, \"你好\");  \n\ngreetZhangSan(\"!\");      \n\u002F\u002F 输出：你好，我是张三!\n\ngreetZhangSan(\"呀～\");   \n\u002F\u002F 输出：你好，我是张三呀～\n\n\u002F\u002F 事件处理中最常见的用法\nclass Button {\n  constructor(text) {\n    this.text = text;\n    this.element = document.createElement(\"button\");\n    this.element.textContent = text;\n    \n    \u002F\u002F 错误写法：this.handleClick 中的 this 会指向 DOM 元素\n    \u002F\u002F this.element.addEventListener(\"click\", this.handleClick);\n    \n    \u002F\u002F 正确写法：\n    this.element.addEventListener(\"click\", this.handleClick.bind(this));\n  }\n  \n  handleClick() {\n    console.log(`按钮 ${this.text} 被点击了`);\n  }\n}\n",[1124,1619,1617],{"__ignoreMap":1122},[1094,1621,1622],{},"场景：",[1134,1624,1625,1637,1646,1654],{},[1137,1626,1627,1628,1631,1632,1634,1635],{},"需要",[1106,1629,1630],{},"立刻执行"," → 选 ",[1106,1633,1449],{}," 或 ",[1106,1636,1452],{},[1137,1638,1639,1640,1643,1644],{},"处理",[1106,1641,1642],{},"数组\u002F类数组","参数 → 优先考虑 ",[1106,1645,1452],{},[1137,1647,1627,1648,1651,1652],{},[1106,1649,1650],{},"保存一个固定 this 的函数","（最常见：事件回调、setTimeout、React class 组件等）→ 选 ",[1106,1653,1455],{},[1137,1655,1656,1657,1660,1661],{},"想",[1106,1658,1659],{},"同时固定 this 又预设部分参数","（函数柯里化）→ 也用 ",[1106,1662,1455],{},[1297,1664],{},[1297,1666],{},[1091,1668,1670],{"id":1669},"iife","IIFE",[1094,1672,1673],{},"IIFE是 Immediately Invoked Function Expression 的缩写",[1094,1675,1676],{},"JavaScript 中一种非常常见且重要的设计模式，主要用于创建独立的作用域并立即执行代码，同时避免污染全局命名空间",[1094,1678,1679],{},"ES6前常用",[1116,1681,1684],{"className":1682,"code":1683,"language":161,"meta":1122},[1365],"(function() {\n    \u002F\u002F 这里的所有变量都是局部变量\n    var privateVar = '这是一个私有变量';\n    console.log('立即执行！');\n})();  \u002F\u002F 最后的 () 负责立即调用\n",[1124,1685,1683],{"__ignoreMap":1122},[1091,1687,1688],{"id":1688},"事件循环",[1094,1690,1691],{},"事件循环是 JavaScript 单线程运行时用来处理异步任务的调度器，它通过“同步代码 → 微任务 → 一个宏任务 → 微任务 → 下一个宏任务……”的循环，不断地把异步回调安排到合适的时机执行，从而实现了看似并发的效果",[1435,1693,1694,1713],{},[1438,1695,1696],{},[1441,1697,1698,1701,1704,1707,1710],{},[1444,1699,1700],{},"组成部分",[1444,1702,1703],{},"英文名称",[1444,1705,1706],{},"主要职责",[1444,1708,1709],{},"执行时机",[1444,1711,1712],{},"示例任务来源",[1457,1714,1715,1732,1749,1766,1783],{},[1441,1716,1717,1720,1723,1726,1729],{},[1462,1718,1719],{},"调用栈",[1462,1721,1722],{},"Call Stack",[1462,1724,1725],{},"存放当前正在执行的同步代码，按 LIFO（后进先出）执行",[1462,1727,1728],{},"立即执行",[1462,1730,1731],{},"函数调用、代码块",[1441,1733,1734,1737,1740,1743,1746],{},[1462,1735,1736],{},"微任务队列",[1462,1738,1739],{},"Microtask Queue",[1462,1741,1742],{},"存放优先级最高的异步回调",[1462,1744,1745],{},"当前宏任务结束后立即清空",[1462,1747,1748],{},"Promise.then\u002Fcatch\u002Ffinally、queueMicrotask、MutationObserver",[1441,1750,1751,1754,1757,1760,1763],{},[1462,1752,1753],{},"宏任务队列",[1462,1755,1756],{},"Task Queue \u002F Macrotask Queue",[1462,1758,1759],{},"存放普通的异步回调",[1462,1761,1762],{},"微任务队列清空后取一个执行",[1462,1764,1765],{},"setTimeout、setInterval、setImmediate、I\u002FO、UI rendering、requestAnimationFrame",[1441,1767,1768,1771,1774,1777,1780],{},[1462,1769,1770],{},"Web APIs",[1462,1772,1773],{},"（浏览器提供）",[1462,1775,1776],{},"处理真正的异步操作（定时器、网络请求、DOM事件等），完成后将回调放入队列",[1462,1778,1779],{},"由浏览器\u002F运行时独立线程管理",[1462,1781,1782],{},"XMLHttpRequest、fetch、DOM事件监听",[1441,1784,1785,1788,1791,1794,1797],{},[1462,1786,1787],{},"事件循环（Event Loop）",[1462,1789,1790],{},"Event Loop",[1462,1792,1793],{},"不停询问：调用栈是否为空？→ 是的话先清空微任务 → 再取一个宏任务执行",[1462,1795,1796],{},"持续运行",[1462,1798,1799],{},"—",[1801,1802,1803],"h3",{"id":1803},"事件循环一次完整循环的执行顺序",[1805,1806,1807,1814,1820,1830,1833],"ol",{},[1137,1808,1809,1810,1813],{},"执行当前调用栈中的所有",[1106,1811,1812],{},"同步代码","（直到调用栈清空）",[1137,1815,1816,1819],{},[1106,1817,1818],{},"清空微任务队列","（执行所有微任务，直到微任务队列为空）\n只要有微任务，就会一直执行完所有微任务",[1137,1821,1822,1823,1825,1826,1829],{},"从",[1106,1824,1753],{},"中取",[1106,1827,1828],{},"一个","任务执行（注意：只取一个！）",[1137,1831,1832],{},"执行完这个宏任务后 → 回到第 2 步，再次清空微任务队列",[1137,1834,1835],{},"重复 3～4 步，直到所有任务处理完毕",[1801,1837,1838],{"id":1838},"代码示例与执行顺序演示",[1116,1840,1843],{"className":1841,"code":1842,"language":161,"meta":1122},[1365],"console.log('1');\n\nsetTimeout(() => {\n  console.log('2');\n  Promise.resolve().then(() => console.log('3'));\n  setTimeout(() => console.log('4'));\n}, 0);\n\nPromise.resolve().then(() => {\n  console.log('5');\n  Promise.resolve().then(() => console.log('6'));\n});\n\nconsole.log('7');\n",[1124,1844,1842],{"__ignoreMap":1122},[1094,1846,1847,1406],{},[1106,1848,1849],{},"执行结果顺序",[1116,1851,1856],{"className":1852,"code":1854,"language":1855},[1853],"language-text","1\n7\n5\n6\n2\n3\n4\n","text",[1124,1857,1854],{"__ignoreMap":1122},[1805,1859,1860,1863,1866,1869,1872,1875],{},[1137,1861,1862],{},"同步代码 → 打印 1、7",[1137,1864,1865],{},"微任务队列有 then(5) → 执行 → 打印 5，并产生新的微任务 then(6)",[1137,1867,1868],{},"继续清空微任务 → 执行 then(6) → 打印 6",[1137,1870,1871],{},"微任务队列清空，执行第一个宏任务（setTimeout 0ms）→ 打印 2",[1137,1873,1874],{},"宏任务执行中产生微任务 then(3) → 宏任务结束后立即清微任务 → 打印 3",[1137,1876,1877],{},"微任务清空，继续下一个宏任务（setTimeout 里面的）→ 打印 4",[1297,1879],{},[1297,1881],{},[1435,1883,1884,1897],{},[1438,1885,1886],{},[1441,1887,1888,1891,1894],{},[1444,1889,1890],{},"序号",[1444,1892,1893],{},"问题",[1444,1895,1896],{},"回答",[1457,1898,1899,1914,1938,1961,1980,2019,2034,2048,2071,2112,2134,2153,2182,2204,2215,2245],{},[1441,1900,1901,1904,1907],{},[1462,1902,1903],{},"1",[1462,1905,1906],{},"项目里用了泛型，怎么根据传入类型适配不同处理函数",[1462,1908,1909,1910,1913],{},"通常用",[1106,1911,1912],{},"泛型约束 + 映射类型 + 条件类型 + infer"," 实现函数重载效果 最常见两种做法： 1. 传入对象类型 → 用 keyof T 约束字段名 2. 传入联合类型 → 用条件类型分发实现不同分支",[1441,1915,1916,1919,1922],{},[1462,1917,1918],{},"2",[1462,1920,1921],{},"泛型是什么",[1462,1923,1924,1927,1928,1931,1932,1935,1937],{},[1106,1925,1926],{},"泛型（Generics）"," 是 TypeScript（以及许多现代编程语言）中一种强大的类型系统特性，其核心目的是",[1106,1929,1930],{},"允许开发者编写可复用、类型安全的代码","，同时让代码在不同具体类型下都能保持正确的类型推断和约束。",[1933,1934],"br",{},[1933,1936],{},"简单来说，泛型就是**“类型参数化”**：把类型当作参数一样传入，让同一个函数、类、接口能够处理多种类型的数据，而无需为每种类型都重复编写代码。",[1441,1939,1940,1943,1946],{},[1462,1941,1942],{},"3",[1462,1944,1945],{},"interface 和 type 的区别",[1462,1947,1948,1949,1952,1953,1956,1957,1960],{},"现在差别已经很小，主要记住这几点： • interface 可",[1106,1950,1951],{},"多次声明自动合并","（对库\u002F模块声明补丁最有用） • type 可做",[1106,1954,1955],{},"联合、交叉、映射、条件、模板字符串","等复杂类型操作 • interface 性能略好（声明合并时） • 目前绝大多数团队：",[1106,1958,1959],{},"能用 type 就用 type","，除非明确需要声明合并",[1441,1962,1963,1966,1969],{},[1462,1964,1965],{},"4",[1462,1967,1968],{},"keyof、in、typeof、infer 实际工作中怎么用",[1462,1970,1971,1972,1975,1976,1979],{},"- keyof：取对象所有键名（表单字段校验、权限映射最常用） - in：映射类型必备（生成只读、部分、可选等类型） - typeof：获取",[1106,1973,1974],{},"值","的类型（尤其是从 const 断言对象取类型） - infer：在条件类型中",[1106,1977,1978],{},"推断","出某一部分类型（最强大，常用于提取 Promise 返回值、数组元素类型、函数返回值等）",[1441,1981,1982,1985,1988],{},[1462,1983,1984],{},"5",[1462,1986,1987],{},"封装表单组件，要求字段名必须是后端返回字段的一部分，怎么处理",[1462,1989,1990,1991,1993,1994,1996,1998,1999],{},"最推荐做法（2024~2026 主流）： ts",[1933,1992],{},"type ApiResponse = { id: number; name: string; age: number; email?: string }",[1933,1995],{},[1933,1997],{},"type FormField",[2000,2001,2002,2003,2006,2008,2010,2011],"t",{}," = keyof T | ",[1124,2004,2005],{},"${keyof T}.${string}",[1933,2007],{},[1933,2009],{},"function Form\u003CT extends Record\u003Cstring, any>>(props: { fields: FormField",[2000,2012,2013,2015,2016,2018],{},[1555,2014],{}," }) { ... }",[1933,2017],{}," 进阶：用 const assertion + typeof 做更严格的路径类型",[1441,2020,2021,2024,2027],{},[1462,2022,2023],{},"6",[1462,2025,2026],{},"回流（reflow）和重绘（repaint）的区别",[1462,2028,2029,2030,2033],{},"回流（Layout\u002FReflow）：几何属性\u002F布局变化 → 影响元素位置\u002F大小 → 必须重新计算布局 重绘（Repaint）：外观变化（颜色、visibility、阴影等）→ 不影响布局 ",[1106,2031,2032],{},"回流代价远大于重绘","（通常是重绘的几倍到几十倍）",[1441,2035,2036,2039,2042],{},[1462,2037,2038],{},"7",[1462,2040,2041],{},"浏览器加载一个页面时，整个渲染流程（关键节点）",[1462,2043,2044,2045],{},"1. DNS → TCP → TLS 2. 请求 HTML 3. 构建 DOM + CSSOM 4. 合成 Render Tree 5. Layout（回流） 6. Paint（重绘） 7. Composite（图层合成） 重要：",[1106,2046,2047],{},"Parse → Style → Layout → Paint → Composite",[1441,2049,2050,2053,2056],{},[1462,2051,2052],{},"8",[1462,2054,2055],{},"做骨架屏时，怎么判断骨架内容和真实内容之间的切换时机",[1462,2057,2058,2059,2062,2063,2066,2067,2070],{},"推荐组合方式（从激进到保守）： 1. 最激进：",[1106,2060,2061],{},"第一个\u002F几个关键接口请求完成","就切 2. 常用：",[1106,2064,2065],{},"所有必须数据接口都 resolve"," 后切（Promise.all） 3. 保守：",[1106,2068,2069],{},"主图\u002F首屏关键资源加载完成","（img onload + 定时兜底） 4. 极致体验：分层渐进式替换（文字先换、图片后换）",[1441,2072,2073,2076,2079],{},[1462,2074,2075],{},"9",[1462,2077,2078],{},"移动端怎么做适配（2025~2026 主流方案）",[1462,2080,2081,2082,2085,2086,2089,2090,2093,2094,2097,2098,2089,2101,2104,2105,2089,2108,2111],{},"当前最主流组合： 1. ",[1106,2083,2084],{},"postcss-px-to-viewport-8-plugin"," \u002F ",[1106,2087,2088],{},"postcss-px-to-rem"," + ",[1106,2091,2092],{},"tailwindcss"," 2. ",[1106,2095,2096],{},"设计稿 375px"," → vw 方案（750 设计稿用 100vw = 750px） 3. 大屏\u002F横屏特殊处理：",[1106,2099,2100],{},"100vh polyfill",[1106,2102,2103],{},"env(safe-area-inset-*)"," 4. 字体：",[1106,2106,2107],{},"clamp()",[1106,2109,2110],{},"rem","（根字体 100px 常见）",[1441,2113,2114,2117,2120],{},[1462,2115,2116],{},"10",[1462,2118,2119],{},"async 函数在执行栈中的位置是怎么样的",[1462,2121,2122,2123,2126,2127,2130,2131],{},"async 函数",[1106,2124,2125],{},"本身是同步执行","到第一个 await 第一个 await 之后 → ",[1106,2128,2129],{},"后续代码作为微任务","放入微任务队列 所以：",[1106,2132,2133],{},"async 函数 = 同步前半段 + 多个微任务",[1441,2135,2136,2139,2142],{},[1462,2137,2138],{},"11",[1462,2140,2141],{},"Promise.all 和 Promise.allSettled 的区别",[1462,2143,2144,2145,2148,2149,2152],{},"Promise.all：",[1106,2146,2147],{},"有一个 reject 就整体 reject","，结果顺序严格对应 Promise.allSettled：",[1106,2150,2151],{},"永远 resolve","，返回每个 promise 的 {status, value\u002Freason}，永远不会 reject",[1441,2154,2155,2158,2161],{},[1462,2156,2157],{},"12",[1462,2159,2160],{},"JS 是单线程，为什么可以实现并发加载多个接口？",[1462,2162,2163,2164,2167,2168,2171,2172,2175,2176,2178,2179],{},"JS 单线程指的是",[1106,2165,2166],{},"执行 JavaScript 代码的线程只有一个"," 真正的网络请求、定时器、DOM事件等都由",[1106,2169,2170],{},"浏览器底层多线程","完成 JS 只负责",[1106,2173,2174],{},"注册回调","，回调通过",[1106,2177,1688],{},"被调度执行 → 所以",[1106,2180,2181],{},"宏观上是并发",[1441,2183,2184,2187,2190],{},[1462,2185,2186],{},"13",[1462,2188,2189],{},"setTimeout 和 requestAnimationFrame 哪个更精确",[1462,2191,2192,2193,2196,2197,2200,2201],{},"requestAnimationFrame ",[1106,2194,2195],{},"更精确","（与浏览器刷新率同步，通常 16.7ms\u002F60fps） setTimeout 实际延迟往往",[1106,2198,2199],{},"偏长","（最低 4ms + 事件循环排队延迟） ",[1106,2202,2203],{},"动画\u002F滚动相关优先使用 rAF",[1441,2205,2206,2209,2212],{},[1462,2207,2208],{},"14",[1462,2210,2211],{},"帧率监控你们是怎么做的",[1462,2213,2214],{},"主流几种方式（按精度\u002F成本排序）： 1. requestAnimationFrame 循环 + performance.now() 差值（最常用） 2. PerformanceObserver + 'longtask'（监控长任务） 3. Web Vitals（CLS、FID、LCP） 4. 第三方：sentry、ddtrace、阿里云 ARMS 等",[1441,2216,2217,2220,2223],{},[1462,2218,2219],{},"15",[1462,2221,2222],{},"小程序渲染卡顿时怎么优化（微信\u002F支付宝小程序）",[1462,2224,2225,2226,2229,2230,2085,2233,2236,2237,2240,2241,2244],{},"优先级排序（效果最明显→一般）： 1. setData 合并 + 减少次数（一次 setData 尽量多字段） 2. 使用 ",[1106,2227,2228],{},"block wx:if"," 代替大量 wx:if 3. 列表用 ",[1106,2231,2232],{},"virtual-list",[1106,2234,2235],{},"recycle-view"," 4. 图片用 ",[1106,2238,2239],{},"webp + lazy-load"," 5. 避免在循环里写 setData 6. 自定义组件",[1106,2242,2243],{},"纯数据组件","化",[1441,2246,2247,2250,2253],{},[1462,2248,2249],{},"16",[1462,2251,2252],{},"H5 页面嵌入小游戏时，遇到过页面内存持续上涨吗？怎么解决的？",[1462,2254,2255,2256,2259,2260,2263,2264,2267],{},"非常常见，尤其 canvas + webgl 小游戏 ",[1106,2257,2258],{},"常见原因","： • 事件监听未移除 • canvas 未清理（ctx.clearRect 不够） • 纹理\u002F缓冲区未释放 • 闭包引用大对象 • requestAnimationFrame 未取消 ",[1106,2261,2262],{},"解决办法","： 1. 组件卸载时",[1106,2265,2266],{},"务必 cancelAnimationFrame"," 2. 清理纹理：gl.deleteTexture\u002Fgl.deleteBuffer 3. 用 WeakMap\u002FWeakSet 存引用 4. 定时检查 performance.memory（chrome devtools） 5. 必要时主动销毁整个 canvas 元素再重建",[1801,2269,2271],{"id":2270},"js中异步的概念是什么","JS中异步的概念是什么？",[1094,2273,2274],{},"JavaScript异步是指代码的执行不必等待某个操作完成，可以继续执行后续代码。当异步操作完成后，通过回调函数、Promise或async\u002Fawait来处理结果。这是为了解决JS单线程可能导致的阻塞问题。",[1094,2276,2277,2280],{},[1106,2278,2279],{},"核心机制","：事件循环 + 回调队列",[1134,2282,2283,2286,2289,2292],{},[1137,2284,2285],{},"同步任务在主线程执行",[1137,2287,2288],{},"异步任务交由Web APIs处理",[1137,2290,2291],{},"完成后的回调进入任务队列",[1137,2293,2294],{},"事件循环从队列中取出回调执行",[1801,2296,2298],{"id":2297},"为什么js是单线程还需要事件循环","为什么JS是单线程还需要事件循环？",[1094,2300,2301,1406],{},[1106,2302,2303],{},"看似矛盾实则巧妙的设计",[1805,2305,2306,2312],{},[1137,2307,2308,2311],{},[1106,2309,2310],{},"单线程的必然性","：避免多线程的复杂性（锁、竞态条件）",[1137,2313,2314,2317,2318],{},[1106,2315,2316],{},"事件循环的价值","：\n",[1134,2319,2320,2323,2326,2329],{},[1137,2321,2322],{},"处理I\u002FO密集型操作（网络、文件）",[1137,2324,2325],{},"维持UI响应性",[1137,2327,2328],{},"管理定时器、用户交互",[1137,2330,2331],{},"实现\"非阻塞\"的并发",[1094,2333,2334,2337],{},[1106,2335,2336],{},"简单比喻","：就像餐厅里只有一个服务员（单线程），但通过叫号系统（事件循环）可以高效服务多桌客人。",[1801,2339,2341],{"id":2340},"栈内存和堆内存的差异","栈内存和堆内存的差异？",[1435,2343,2344,2356],{},[1438,2345,2346],{},[1441,2347,2348,2350,2353],{},[1444,2349,1446],{},[1444,2351,2352],{},"栈内存",[1444,2354,2355],{},"堆内存",[1457,2357,2358,2369,2380,2391,2402,2413],{},[1441,2359,2360,2363,2366],{},[1462,2361,2362],{},"存储内容",[1462,2364,2365],{},"基本类型、引用地址",[1462,2367,2368],{},"引用类型（对象、数组）",[1441,2370,2371,2374,2377],{},[1462,2372,2373],{},"分配方式",[1462,2375,2376],{},"自动分配\u002F释放",[1462,2378,2379],{},"动态分配，GC回收",[1441,2381,2382,2385,2388],{},[1462,2383,2384],{},"大小",[1462,2386,2387],{},"固定，较小",[1462,2389,2390],{},"动态，较大",[1441,2392,2393,2396,2399],{},[1462,2394,2395],{},"访问速度",[1462,2397,2398],{},"快",[1462,2400,2401],{},"慢",[1441,2403,2404,2407,2410],{},[1462,2405,2406],{},"管理",[1462,2408,2409],{},"系统自动管理",[1462,2411,2412],{},"开发者\u002FGC管理",[1441,2414,2415,2418,2421],{},[1462,2416,2417],{},"示例",[1462,2419,2420],{},"let a = 1",[1462,2422,2423],{},"let obj = {x: 1}",[1801,2425,2427],{"id":2426},"为什么数组要存在堆内存而不是栈内存","为什么数组要存在堆内存而不是栈内存？",[1094,2429,2430,1406],{},[1106,2431,2432],{},"根本原因",[1805,2434,2435,2441,2447,2452],{},[1137,2436,2437,2440],{},[1106,2438,2439],{},"大小不确定","：数组长度动态变化，栈内存固定大小无法满足",[1137,2442,2443,2446],{},[1106,2444,2445],{},"性能考虑","：复制大数组到栈中成本高",[1137,2448,2449,2451],{},[1106,2450,131],{},"：堆内存可动态扩展，GC负责回收",[1137,2453,2454,2457],{},[1106,2455,2456],{},"引用语义","：多个变量可共享同一数组",[1801,2459,2461],{"id":2460},"js中有哪些基本数据类型","JS中有哪些基本数据类型？",[1094,2463,2464,1406],{},[1106,2465,2466],{},"7种基本类型",[1805,2468,2469,2472,2475,2478,2481,2484,2487],{},[1137,2470,2471],{},"String",[1137,2473,2474],{},"Number",[1137,2476,2477],{},"Boolean",[1137,2479,2480],{},"Undefined",[1137,2482,2483],{},"Null",[1137,2485,2486],{},"Symbol（ES6）",[1137,2488,2489],{},"BigInt（ES2020）",[1094,2491,2492,2495],{},[1106,2493,2494],{},"1种引用类型","：Object（包括Array、Function、Date等）",[1801,2497,2499],{"id":2498},"函数内部的this含义是什么","函数内部的this含义是什么？",[1094,2501,2502,1406],{},[1106,2503,2504],{},"this的指向规则",[1805,2506,2507,2513,2519,2525,2531],{},[1137,2508,2509,2512],{},[1106,2510,2511],{},"默认绑定","：独立函数调用 → window\u002Fundefined（严格模式）",[1137,2514,2515,2518],{},[1106,2516,2517],{},"隐式绑定","：作为对象方法调用 → 该对象",[1137,2520,2521,2524],{},[1106,2522,2523],{},"显式绑定","：call\u002Fapply\u002Fbind → 指定的对象",[1137,2526,2527,2530],{},[1106,2528,2529],{},"new绑定","：构造函数调用 → 新创建的对象",[1137,2532,2533,2536],{},[1106,2534,2535],{},"箭头函数","：无自己的this，继承外层",[1801,2538,2540],{"id":2539},"callapplybind的区别","call、apply、bind的区别？",[1435,2542,2543,2558],{},[1438,2544,2545],{},[1441,2546,2547,2550,2553,2555],{},[1444,2548,2549],{},"方法",[1444,2551,2552],{},"参数传递",[1444,2554,1728],{},[1444,2556,2557],{},"返回",[1457,2559,2560,2572,2582],{},[1441,2561,2562,2564,2567,2569],{},[1462,2563,1449],{},[1462,2565,2566],{},"参数列表",[1462,2568,1510],{},[1462,2570,2571],{},"函数结果",[1441,2573,2574,2576,2578,2580],{},[1462,2575,1452],{},[1462,2577,1590],{},[1462,2579,1510],{},[1462,2581,2571],{},[1441,2583,2584,2586,2588,2590],{},[1462,2585,1455],{},[1462,2587,2566],{},[1462,2589,1515],{},[1462,2591,2592],{},"新函数",[1116,2594,2597],{"className":2595,"code":2596,"language":1316,"meta":1122},[1314],"func.call(thisArg, arg1, arg2);\nfunc.apply(thisArg, [arg1, arg2]);\nconst newFunc = func.bind(thisArg, arg1, arg2);\n",[1124,2598,2596],{"__ignoreMap":1122},[1801,2600,2602],{"id":2601},"typescript联合类型和交叉类型的概念","TypeScript联合类型和交叉类型的概念？",[1094,2604,2605,1406,2608,2611],{},[1106,2606,2607],{},"联合类型 (Union Types)",[1124,2609,2610],{},"|","表示\"或\"",[1116,2613,2618],{"className":2614,"code":2616,"language":2617,"meta":1122},[2615],"language-typescript","type Status = \"success\" | \"error\" | \"loading\";\nlet value: string | number;\n","typescript",[1124,2619,2616],{"__ignoreMap":1122},[1094,2621,2622,1406,2625,2628],{},[1106,2623,2624],{},"交叉类型 (Intersection Types)",[1124,2626,2627],{},"&","表示\"且\"",[1116,2630,2633],{"className":2631,"code":2632,"language":2617,"meta":1122},[2615],"interface A {\n    x: number;\n}\ninterface B {\n    y: string;\n}\ntype C = A & B; \u002F\u002F { x: number, y: string }\n",[1124,2634,2632],{"__ignoreMap":1122},[1094,2636,2637,1406],{},[1106,2638,2639],{},"区别",[1134,2641,2642,2645],{},[1137,2643,2644],{},"联合：可接受任一类型",[1137,2646,2647],{},"交叉：必须同时满足所有类型",[1091,2649,2651],{"id":2650},"二浏览器网络类","二、浏览器\u002F网络类",[1801,2653,2655],{"id":2654},"什么是同源策略","什么是同源策略？",[1094,2657,2658,2661],{},[1106,2659,2660],{},"同源","：协议、域名、端口完全相同",[1094,2663,2664,1406],{},[1106,2665,2666],{},"限制内容",[1134,2668,2669,2672,2675,2678],{},[1137,2670,2671],{},"DOM访问",[1137,2673,2674],{},"Cookie\u002FLocalStorage访问",[1137,2676,2677],{},"AJAX请求",[1137,2679,2680],{},"脚本执行",[1094,2682,2683,2686],{},[1106,2684,2685],{},"目的","：防止恶意网站窃取用户数据",[1801,2688,2690],{"id":2689},"如何实现跨域请求","如何实现跨域请求？",[1094,2692,2693,1406],{},[1106,2694,2695],{},"常用方案",[1805,2697,2698,2704,2714,2720,2726,2732],{},[1137,2699,2700,2703],{},[1106,2701,2702],{},"CORS","：服务器设置响应头",[1137,2705,2706,2709,2710,2713],{},[1106,2707,2708],{},"JSONP","：利用",[1124,2711,2712],{},"\u003Cscript>","标签",[1137,2715,2716,2719],{},[1106,2717,2718],{},"代理服务器","：同源服务器转发",[1137,2721,2722,2725],{},[1106,2723,2724],{},"WebSocket","：不受同源限制",[1137,2727,2728,2731],{},[1106,2729,2730],{},"postMessage","：窗口间通信",[1137,2733,2734,2737],{},[1106,2735,2736],{},"nginx反向代理","：服务器端代理",[1801,2739,2741],{"id":2740},"为什么代理可以绕过同源限制","为什么代理可以绕过同源限制？",[1094,2743,2744,1406],{},[1106,2745,2746],{},"核心原理",[1805,2748,2749,2755,2761],{},[1137,2750,2751,2754],{},[1106,2752,2753],{},"同源限制是浏览器的安全策略","，不是服务器的",[1137,2756,2757,2760],{},[1106,2758,2759],{},"代理服务器与页面同源","，不受限制",[1137,2762,2763,2766],{},[1106,2764,2765],{},"服务器间无同源限制","，可自由通信",[1094,2768,2769,1406],{},[1106,2770,2771],{},"流程",[1116,2773,2778],{"className":2774,"code":2776,"language":2777,"meta":1122},[2775],"language-markdown","浏览器(同源) → 代理服务器(同源) → 目标服务器(不同源)\n","markdown",[1124,2779,2776],{"__ignoreMap":1122},[1801,2781,2783],{"id":2782},"cookie和session的定义和差异","Cookie和Session的定义和差异？",[1435,2785,2786,2798],{},[1438,2787,2788],{},[1441,2789,2790,2792,2795],{},[1444,2791,1446],{},[1444,2793,2794],{},"Cookie",[1444,2796,2797],{},"Session",[1457,2799,2800,2811,2822,2833,2844],{},[1441,2801,2802,2805,2808],{},[1462,2803,2804],{},"存储位置",[1462,2806,2807],{},"客户端",[1462,2809,2810],{},"服务器端",[1441,2812,2813,2816,2819],{},[1462,2814,2815],{},"安全性",[1462,2817,2818],{},"较低（可篡改）",[1462,2820,2821],{},"较高",[1441,2823,2824,2827,2830],{},[1462,2825,2826],{},"存储大小",[1462,2828,2829],{},"4KB左右",[1462,2831,2832],{},"更大",[1441,2834,2835,2838,2841],{},[1462,2836,2837],{},"生命周期",[1462,2839,2840],{},"可设置过期时间",[1462,2842,2843],{},"依赖服务器配置",[1441,2845,2846,2849,2852],{},[1462,2847,2848],{},"跨域",[1462,2850,2851],{},"可设置domain",[1462,2853,2854],{},"依赖Cookie或token",[1801,2856,2858],{"id":2857},"cookie是怎么种下的","Cookie是怎么种下的？",[1094,2860,2861,1406],{},[1106,2862,2863],{},"两种方式",[1805,2865,2866,2874],{},[1137,2867,2868,1406,2871],{},[1106,2869,2870],{},"HTTP响应头",[1124,2872,2873],{},"Set-Cookie: name=value; options",[1137,2875,2876,1406,2879],{},[1106,2877,2878],{},"JavaScript设置",[1124,2880,2881],{},"document.cookie = \"name=value; options\"",[1094,2883,2884,1406],{},[1106,2885,2886],{},"关键属性",[1134,2888,2889,2895,2901,2907],{},[1137,2890,2891,2894],{},[1124,2892,2893],{},"HttpOnly","：禁止JS访问",[1137,2896,2897,2900],{},[1124,2898,2899],{},"Secure","：仅HTTPS传输",[1137,2902,2903,2906],{},[1124,2904,2905],{},"SameSite","：限制跨站发送",[1137,2908,2909,2912],{},[1124,2910,2911],{},"Domain\u002FPath","：作用域",[1801,2914,2916],{"id":2915},"localstorage和sessionstorage的区别","LocalStorage和SessionStorage的区别？",[1435,2918,2919,2931],{},[1438,2920,2921],{},[1441,2922,2923,2925,2928],{},[1444,2924,1446],{},[1444,2926,2927],{},"LocalStorage",[1444,2929,2930],{},"SessionStorage",[1457,2932,2933,2943,2953,2962],{},[1441,2934,2935,2937,2940],{},[1462,2936,2837],{},[1462,2938,2939],{},"永久，需手动清除",[1462,2941,2942],{},"标签页关闭即清除",[1441,2944,2945,2947,2950],{},[1462,2946,248],{},[1462,2948,2949],{},"同源窗口共享",[1462,2951,2952],{},"仅当前标签页",[1441,2954,2955,2957,2960],{},[1462,2956,2826],{},[1462,2958,2959],{},"5-10MB",[1462,2961,2959],{},[1441,2963,2964,2967,2970],{},[1462,2965,2966],{},"数据同步",[1462,2968,2969],{},"同源窗口实时同步",[1462,2971,2952],{},[1801,2973,2975],{"id":2974},"http强缓存和协商缓存的区别","HTTP强缓存和协商缓存的区别？",[1094,2977,2978,1406],{},[1106,2979,2980],{},"强缓存",[1134,2982,2983,2993,2996],{},[1137,2984,2985,2986,2989,2990],{},"响应头：",[1124,2987,2988],{},"Cache-Control","、",[1124,2991,2992],{},"Expires",[1137,2994,2995],{},"状态码：200 (from cache)",[1137,2997,2998],{},"过程：不请求服务器，直接使用缓存",[1094,3000,3001,1406],{},[1106,3002,3003],{},"协商缓存",[1134,3005,3006,3014,3017],{},[1137,3007,2985,3008,2989,3011],{},[1124,3009,3010],{},"ETag\u002FIf-None-Match",[1124,3012,3013],{},"Last-Modified\u002FIf-Modified-Since",[1137,3015,3016],{},"状态码：304 (Not Modified)",[1137,3018,3019],{},"过程：请求服务器，验证缓存有效性",[1801,3021,3023],{"id":3022},"_301和302状态码的区别","301和302状态码的区别？",[1094,3025,3026,1406],{},[1106,3027,3028],{},"301 Moved Permanently",[1134,3030,3031,3034,3037,3040],{},[1137,3032,3033],{},"永久重定向",[1137,3035,3036],{},"搜索引擎更新索引",[1137,3038,3039],{},"浏览器缓存新地址",[1137,3041,3042],{},"权重传递",[1094,3044,3045,1406],{},[1106,3046,3047],{},"302 Found (临时重定向)",[1134,3049,3050,3053,3056,3059],{},[1137,3051,3052],{},"临时重定向",[1137,3054,3055],{},"搜索引擎不更新",[1137,3057,3058],{},"浏览器不缓存",[1137,3060,3061],{},"权重不传递",[1094,3063,3064,1406],{},[1106,3065,3066],{},"实际使用",[1134,3068,3069,3072,3075],{},[1137,3070,3071],{},"网站改版用301",[1137,3073,3074],{},"登录跳转用302",[1137,3076,3077],{},"移动端适配用302",[1297,3079],{},[1297,3081],{},[1091,3083,3085],{"id":3084},"三css类","三、CSS类",[1801,3087,3089],{"id":3088},"_1-设备像素和逻辑像素的区别","1. 设备像素和逻辑像素的区别？",[1094,3091,3092,1406],{},[1106,3093,3094],{},"设备像素 (Physical Pixel)",[1134,3096,3097,3100,3103],{},[1137,3098,3099],{},"物理像素，屏幕实际发光点",[1137,3101,3102],{},"固定不变",[1137,3104,3105],{},"高DPI设备像素更密集",[1094,3107,3108,1406],{},[1106,3109,3110],{},"逻辑像素 (CSS Pixel)",[1134,3112,3113,3116,3119],{},[1137,3114,3115],{},"编程使用的像素单位",[1137,3117,3118],{},"与实际像素有比例关系",[1137,3120,3121,3122,3125],{},"由",[1124,3123,3124],{},"devicePixelRatio","决定",[1094,3127,3128,1406,3131],{},[1106,3129,3130],{},"关系",[1124,3132,3133],{},"物理像素 = 逻辑像素 × devicePixelRatio",[1801,3135,3137],{"id":3136},"_2-css两种盒模型的差异","2. CSS两种盒模型的差异",[1094,3139,3140,1406],{},[1106,3141,3142],{},"标准盒模型 (content-box)",[1134,3144,3145,3151],{},[1137,3146,3147,3150],{},[1124,3148,3149],{},"width\u002Fheight","= 内容宽度",[1137,3152,3153],{},"总宽度 = width + padding + border + margin",[1094,3155,3156,1406],{},[1106,3157,3158],{},"IE盒模型 (border-box)",[1134,3160,3161,3166],{},[1137,3162,3163,3165],{},[1124,3164,3149],{},"= 内容 + padding + border",[1137,3167,3168],{},"总宽度 = width + margin",[1094,3170,3171,1406],{},[1106,3172,3173],{},"设置方式",[1116,3175,3180],{"className":3176,"code":3178,"language":3179,"meta":1122},[3177],"language-css","box-sizing: content-box; \u002F* 默认 *\u002F\nbox-sizing: border-box; \u002F* 常用 *\u002F\n","css",[1124,3181,3178],{"__ignoreMap":1122},{"title":1122,"searchDepth":3183,"depth":3183,"links":3184},4,[3185,3190,3191,3192,3193,3194,3199,3200,3213,3223],{"id":247,"depth":3186,"text":247,"children":3187},2,[3188,3189],{"id":1132,"depth":3183,"text":1132},{"id":1218,"depth":3183,"text":1218},{"id":1303,"depth":3186,"text":1304},{"id":1321,"depth":3186,"text":1322},{"id":1354,"depth":3186,"text":1355},{"id":1388,"depth":3186,"text":1389},{"id":1423,"depth":3186,"text":1424,"children":3195},[3196,3197,3198],{"id":1570,"depth":3183,"text":1571},{"id":1583,"depth":3183,"text":1584},{"id":1600,"depth":3183,"text":1601},{"id":1669,"depth":3186,"text":1670},{"id":1688,"depth":3186,"text":1688,"children":3201},[3202,3204,3205,3206,3207,3208,3209,3210,3211,3212],{"id":1803,"depth":3203,"text":1803},3,{"id":1838,"depth":3203,"text":1838},{"id":2270,"depth":3203,"text":2271},{"id":2297,"depth":3203,"text":2298},{"id":2340,"depth":3203,"text":2341},{"id":2426,"depth":3203,"text":2427},{"id":2460,"depth":3203,"text":2461},{"id":2498,"depth":3203,"text":2499},{"id":2539,"depth":3203,"text":2540},{"id":2601,"depth":3203,"text":2602},{"id":2650,"depth":3186,"text":2651,"children":3214},[3215,3216,3217,3218,3219,3220,3221,3222],{"id":2654,"depth":3203,"text":2655},{"id":2689,"depth":3203,"text":2690},{"id":2740,"depth":3203,"text":2741},{"id":2782,"depth":3203,"text":2783},{"id":2857,"depth":3203,"text":2858},{"id":2915,"depth":3203,"text":2916},{"id":2974,"depth":3203,"text":2975},{"id":3022,"depth":3203,"text":3023},{"id":3084,"depth":3186,"text":3085,"children":3224},[3225,3226],{"id":3088,"depth":3203,"text":3089},{"id":3136,"depth":3203,"text":3137},"md",true,{"uuid":3230,"slots":3231},"c5508100-f558-11f0-947e-9b9ca7bb4598",{},19,{"title":1085,"description":1122},"posts\u002F2026\u002F2026-01-19-杂记2026-01-19",[161,247,248,135],"RjCsb69Aw3trXJqcqqjj8IwABVVMKbuVlpugswJEjjk",1790443286073]