[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"knowledge-\u002Fapi\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fsafe":3,"knowledge-related-\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fsafe":905,"knowledge-series-\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fsafe":932},{"source":4,"connector":5,"page":6},"sqlite","better-sqlite3",{"path":7,"title":8,"description":9,"category":10,"tags":11,"date":14,"pinned":15,"draft":15,"body":16,"seo":901,"stem":902,"id":903,"extension":904},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fsafe","安全","前端安全侧重在浏览器侧降低 XSS、CSRF、点击劫持等风险；最终防护须服务端配合（校验、鉴权、安全响应头）。","技能小册",[12,13],"javascript","safe","2023-06-26",false,{"type":17,"value":18,"toc":878},"minimark",[19,22,31,36,39,44,122,126,261,265,268,271,353,357,360,363,482,486,489,493,496,502,527,532,587,591,609,619,622,653,656,728,731,801,804,807,810,874],[20,21,8],"h1",{"id":8},[23,24,25,26,30],"p",{},"前端安全侧重在浏览器侧降低 XSS、CSRF、点击劫持等风险；",[27,28,29],"strong",{},"最终防护须服务端配合","（校验、鉴权、安全响应头）。",[32,33,35],"h2",{"id":34},"一xss跨站脚本攻击","一、XSS（跨站脚本攻击）",[23,37,38],{},"XSS 攻击指攻击者将恶意脚本注入网页，当其他用户浏览时执行，从而窃取数据、劫持会话或篡改页面。",[40,41,43],"h3",{"id":42},"_1-三种类型","1. 三种类型",[45,46,47,63],"table",{},[48,49,50],"thead",{},[51,52,53,57,60],"tr",{},[54,55,56],"th",{},"类型",[54,58,59],{},"触发方式",[54,61,62],{},"特点",[64,65,66,80,93],"tbody",{},[51,67,68,74,77],{},[69,70,71],"td",{},[27,72,73],{},"反射型",[69,75,76],{},"恶意脚本作为 URL 参数或表单数据，服务器直接返回该脚本并在页面中执行。",[69,78,79],{},"非持久，需诱骗用户点击恶意链接。",[51,81,82,87,90],{},[69,83,84],{},[27,85,86],{},"存储型",[69,88,89],{},"恶意脚本被存储在后端数据库或文件系统中，当其他用户访问受影响页面时执行。",[69,91,92],{},"持久性，影响范围广（如评论区、留言板）。",[51,94,95,100,119],{},[69,96,97],{},[27,98,99],{},"DOM 型",[69,101,102,103,107,108,111,112,107,115,118],{},"完全在前端发生，恶意脚本来自 ",[104,105,106],"code",{},"document.location","、",[104,109,110],{},"document.referrer"," 等，通过 ",[104,113,114],{},"innerHTML",[104,116,117],{},"eval"," 等动态执行。",[69,120,121],{},"不经过服务器，纯前端注入。",[40,123,125],{"id":124},"_2-防御措施","2. 防御措施",[127,128,129,178,215,245,255],"ul",{},[130,131,132,135,136],"li",{},[27,133,134],{},"输出转义（编码）","：根据上下文对用户输入进行转义。\n",[127,137,138,158,161,168,171],{},[130,139,140,141,144,145,144,148,144,151,144,154,157],{},"HTML 上下文：转义 ",[104,142,143],{},"\u003C",", ",[104,146,147],{},">",[104,149,150],{},"&",[104,152,153],{},"\"",[104,155,156],{},"'"," 等为实体。",[130,159,160],{},"HTML 属性：转义引号。",[130,162,163,164,167],{},"JavaScript 上下文：使用 ",[104,165,166],{},"JSON.stringify"," 或转义换行符等。",[130,169,170],{},"CSS 上下文：限制输入或转义特殊字符。",[130,172,173,174,177],{},"URL 上下文：使用 ",[104,175,176],{},"encodeURIComponent","。",[130,179,180,183,184],{},[27,181,182],{},"使用安全 API","：\n",[127,185,186,201],{},[130,187,188,191,192,195,196,107,198,177],{},[104,189,190],{},"textContent"," 或 ",[104,193,194],{},"innerText"," 替代 ",[104,197,114],{},[104,199,200],{},"outerHTML",[130,202,203,204,207,208,191,211,214],{},"设置 ",[104,205,206],{},"element.setAttribute"," 时避免使用 ",[104,209,210],{},"href",[104,212,213],{},"onclick"," 等可执行属性。",[130,216,217,220,221,237,238,191,241,244],{},[27,218,219],{},"内容安全策略（CSP）","：通过 HTTP 头声明允许的资源来源。\n",[222,223,228],"pre",{"className":224,"code":225,"language":226,"meta":227,"style":227},"language-http shiki shiki-themes material-theme-lighter github-light github-dark","Content-Security-Policy: default-src 'self'; script-src 'self' https:\u002F\u002Ftrusted.cdn.com\n","http","",[104,229,230],{"__ignoreMap":227},[231,232,235],"span",{"class":233,"line":234},"line",1,[231,236,225],{},"\n关键指令：",[104,239,240],{},"script-src 'nonce-...'",[104,242,243],{},"'strict-dynamic'","，可有效阻止内联脚本执行。",[130,246,247,250,251,254],{},[27,248,249],{},"HTTP-only Cookie","：将敏感 Cookie 标记为 ",[104,252,253],{},"HttpOnly","，使 JavaScript 无法读取，即使 XSS 也无法窃取 Session ID。",[130,256,257,260],{},[27,258,259],{},"输入验证","：对特定类型输入（如 email、数字）进行格式校验，拒绝或净化危险字符（但黑名单易绕过，推荐白名单）。",[32,262,264],{"id":263},"二csrf跨站请求伪造","二、CSRF（跨站请求伪造）",[23,266,267],{},"CSRF 攻击诱导用户当前已认证的浏览器向目标网站发送非本意的请求（如转账、修改密码），利用用户身份执行操作。",[40,269,270],{"id":270},"防御措施",[272,273,274,291,316,336,347],"ol",{},[130,275,276,279,280],{},[27,277,278],{},"CSRF Token","（同步令牌）",[127,281,282,285,288],{},[130,283,284],{},"服务器生成随机 token，嵌入表单或请求头中。",[130,286,287],{},"后端验证请求中的 token 是否与会话中的匹配。",[130,289,290],{},"攻击者无法读取页面中的 token（受同源策略保护）。",[130,292,293,296],{},[27,294,295],{},"SameSite Cookie 属性",[127,297,298,304,310],{},[130,299,300,303],{},[104,301,302],{},"SameSite=Lax","：跨站 GET 请求（如点击链接）可携带 Cookie，但 POST 等不安全方法不携带。",[130,305,306,309],{},[104,307,308],{},"SameSite=Strict","：任何跨站请求均不携带 Cookie。",[130,311,312,315],{},[104,313,314],{},"SameSite=None; Secure","：允许跨站携带，但必须 HTTPS 且显式设置，一般不推荐用于防 CSRF。",[130,317,318,321],{},[27,319,320],{},"验证 Referer \u002F Origin 头",[127,322,323,333],{},[130,324,325,326,191,329,332],{},"在服务端检查请求头的 ",[104,327,328],{},"Origin",[104,330,331],{},"Referer"," 是否来自可信源。",[130,334,335],{},"注意：某些场景可能被省略或篡改，作为辅助手段。",[130,337,338,341,342],{},[27,339,340],{},"双重 Cookie 验证","（适用于某些 SPA）",[127,343,344],{},[130,345,346],{},"在 Cookie 中设置一个随机值，同时在请求头或参数中发送相同值，后端比对。",[130,348,349,352],{},[27,350,351],{},"用户交互验证","：对关键操作加入图形验证码、重新输入密码等。",[32,354,356],{"id":355},"三点击劫持clickjacking","三、点击劫持（Clickjacking）",[23,358,359],{},"攻击者通过透明 iframe 覆盖合法页面，诱使用户在不知情的情况下点击隐藏按钮或链接，执行恶意操作（如添加权限、转发消息）。",[40,361,270],{"id":362},"防御措施-1",[272,364,365,390,424],{},[130,366,367,370],{},[27,368,369],{},"X-Frame-Options 响应头",[127,371,372,378,384],{},[130,373,374,377],{},[104,375,376],{},"DENY","：禁止任何页面嵌入 iframe。",[130,379,380,383],{},[104,381,382],{},"SAMEORIGIN","：只允许同源页面嵌入。",[130,385,386,389],{},[104,387,388],{},"ALLOW-FROM uri","（已废弃，不推荐）。",[130,391,392,398,414,417,418,420,421,177],{},[27,393,394,395],{},"Content-Security-Policy 的 ",[104,396,397],{},"frame-ancestors",[222,399,401],{"className":224,"code":400,"language":226,"meta":227,"style":227},"Content-Security-Policy: frame-ancestors 'none'\nContent-Security-Policy: frame-ancestors 'self' https:\u002F\u002Ftrusted.com\n",[104,402,403,408],{"__ignoreMap":227},[231,404,405],{"class":233,"line":234},[231,406,407],{},"Content-Security-Policy: frame-ancestors 'none'\n",[231,409,411],{"class":233,"line":410},2,[231,412,413],{},"Content-Security-Policy: frame-ancestors 'self' https:\u002F\u002Ftrusted.com\n",[415,416],"br",{},"现代浏览器优先支持 ",[104,419,397],{},"，可替代 ",[104,422,423],{},"X-Frame-Options",[130,425,426,429,430,475,477,478,481],{},[27,427,428],{},"窗口逃逸防御（前端辅助）","：在页面中通过 JavaScript 判断自身是否在顶层，若不是则强制跳出。",[222,431,435],{"className":432,"code":433,"language":434,"meta":227,"style":227},"language-js shiki shiki-themes material-theme-lighter github-light github-dark","if (top !== self) top.location = self.location;\n","js",[104,436,437],{"__ignoreMap":227},[231,438,439,443,447,451,454,458,461,464,467,469,472],{"class":233,"line":234},[231,440,442],{"class":441},"sVHd0","if",[231,444,446],{"class":445},"su5hD"," (top ",[231,448,450],{"class":449},"smGrS","!==",[231,452,453],{"class":445}," self) top",[231,455,457],{"class":456},"sP7_E",".",[231,459,460],{"class":445},"location ",[231,462,463],{"class":449},"=",[231,465,466],{"class":445}," self",[231,468,457],{"class":456},[231,470,471],{"class":445},"location",[231,473,474],{"class":456},";\n",[415,476],{},"注意可能被攻击者规避（如 ",[104,479,480],{},"sandbox"," 属性），只能作为补充。",[32,483,485],{"id":484},"四不安全第三方依赖","四、不安全第三方依赖",[23,487,488],{},"使用第三方库可能引入已知漏洞（如原型污染、XSS）或导致正则表达式拒绝服务（ReDoS）。",[40,490,492],{"id":491},"_1-redos正则表达式拒绝服务","1. ReDoS（正则表达式拒绝服务）",[23,494,495],{},"恶意构造的字符串可使某些正则表达式引擎进入灾难性回溯，消耗大量 CPU，导致服务不可用。",[23,497,498,501],{},[27,499,500],{},"典型危险模式","：",[127,503,504,516],{},[130,505,506,507,107,510,107,513],{},"嵌套量词：",[104,508,509],{},"(a+)+",[104,511,512],{},"(a|a)+",[104,514,515],{},"(a*)*",[130,517,518,519,522,523,526],{},"重叠的分组与选择：",[104,520,521],{},"a*b"," 与 ",[104,524,525],{},"a*ab"," 等",[23,528,529,501],{},[27,530,531],{},"防御",[127,533,534,549,560,570,573],{},[130,535,536,537,540,541,544,545,548],{},"使用原子分组（如 ",[104,538,539],{},"(?>a+)","）或占有量词（如 ",[104,542,543],{},"++","），但 JS 标准正则不支持；可借助 ",[104,546,547],{},"RegExp.prototype.exec"," 手动控制。",[130,550,551,552,555,556,559],{},"使用 ",[104,553,554],{},"new RegExp"," 时对用户输入进行转义（",[104,557,558],{},"escapeRegex"," 函数）。",[130,561,562,563,191,566,569],{},"限制输入长度，超时机制（使用 ",[104,564,565],{},"Promise.race",[104,567,568],{},"Worker"," 强制中断）。",[130,571,572],{},"使用简单正则或改用非回溯算法库（如 RE2 通过 WebAssembly 集成）。",[130,574,575,576,579,580,191,583,586],{},"定期运行 ",[104,577,578],{},"npm audit","，使用 ",[104,581,582],{},"Snyk",[104,584,585],{},"Dependabot"," 检测脆弱正则。",[40,588,590],{"id":589},"_2-供应链攻击","2. 供应链攻击",[127,592,593,603,606],{},[130,594,595,596,599,600,177],{},"锁定依赖版本，使用 ",[104,597,598],{},"package-lock.json"," \u002F ",[104,601,602],{},"yarn.lock",[130,604,605],{},"审查第三方包来源，避免使用未维护或低信誉包。",[130,607,608],{},"实施软件材料清单（SBOM）并监控 CVE 数据库。",[32,610,612,613,522,615,618],{"id":611},"五eval-与-new-function-的风险","五、",[104,614,117],{},[104,616,617],{},"new Function"," 的风险",[23,620,621],{},"两者都允许动态执行 JavaScript 字符串，带来严重安全隐患：",[127,623,624,630,641,647],{},[130,625,626,629],{},[27,627,628],{},"XSS 放大","：攻击者若控制字符串内容，可直接执行任意代码，绕过 CSP 等防御。",[130,631,632,501,635,637,638,640],{},[27,633,634],{},"作用域污染与变量泄露",[104,636,117],{}," 可访问本地作用域，",[104,639,617],{}," 仅访问全局作用域，但依然危险。",[130,642,643,646],{},[27,644,645],{},"性能下降","：现代引擎无法对动态代码进行有效优化，且阻止某些静态分析。",[130,648,649,652],{},[27,650,651],{},"难以审计","：动态代码使安全审查变得几乎不可能。",[40,654,655],{"id":655},"安全使用原则",[127,657,658,670,689,715],{},[130,659,660,663,664,666,667,669],{},[27,661,662],{},"绝对避免","：永远不要使用 ",[104,665,117],{}," 和 ",[104,668,617],{}," 处理用户输入。",[130,671,672,183,675],{},[27,673,674],{},"极少数合法场景",[127,676,677,683],{},[130,678,679,680,682],{},"框架模板编译（在安全沙箱中，如 Vue\u002FReact 的底层渲染函数，通常使用 ",[104,681,617],{},"，但仅作用于开发者信任的模板）。",[130,684,685,686,688],{},"在线代码演练（如 CodePen）需在严格隔离的 iframe + ",[104,687,480],{}," 中执行。",[130,690,691,183,694],{},[27,692,693],{},"替代方案",[127,695,696,705,712],{},[130,697,551,698,701,702,704],{},[104,699,700],{},"JSON.parse"," 代替 ",[104,703,117],{}," 解析数据。",[130,706,707,708,711],{},"动态属性访问：使用 ",[104,709,710],{},"obj[prop]"," 代替字符串构建代码。",[130,713,714],{},"若需动态函数，使用预定义映射表。",[130,716,717,720,721,724,725,727],{},[27,718,719],{},"CSP 加固","：设置 ",[104,722,723],{},"script-src 'unsafe-eval'"," 不包含（即禁止 ",[104,726,117],{}," 及类似方法），现代项目应默认禁止。",[32,729,730],{"id":730},"总结",[45,732,733,743],{},[48,734,735],{},[51,736,737,740],{},[54,738,739],{},"威胁",[54,741,742],{},"核心防御",[64,744,745,758,768,778,788],{},[51,746,747,752],{},[69,748,749],{},[27,750,751],{},"XSS",[69,753,754,755,757],{},"输出转义 + CSP + ",[104,756,253],{}," Cookie + 安全 API (innerText)",[51,759,760,765],{},[69,761,762],{},[27,763,764],{},"CSRF",[69,766,767],{},"CSRF Token + SameSite Cookie（Lax\u002FStrict） + Referer\u002FOrigin 校验",[51,769,770,775],{},[69,771,772],{},[27,773,774],{},"点击劫持",[69,776,777],{},"X-Frame-Options \u002F CSP frame-ancestors + 可选的 JS 逃逸",[51,779,780,785],{},[69,781,782],{},[27,783,784],{},"第三方依赖",[69,786,787],{},"ReDoS：限制输入长度、超时、审计正则；依赖扫描 + 版本锁定",[51,789,790,795],{},[69,791,792],{},[27,793,794],{},"eval \u002F Function",[69,796,797,798],{},"完全避免，必要情况使用沙箱 + CSP 禁止 ",[104,799,800],{},"'unsafe-eval'",[23,802,803],{},"安全是纵深防御：组合输出编码、CSP、Cookie 属性与服务端校验，并保持依赖更新。",[32,805,806],{"id":806},"参考文献",[23,808,809],{},"以下链接在编写时均可正常访问：",[45,811,812,822],{},[48,813,814],{},[51,815,816,819],{},[54,817,818],{},"资料",[54,820,821],{},"说明",[64,823,824,838,850,862],{},[51,825,826,835],{},[69,827,828],{},[829,830,834],"a",{"href":831,"rel":832},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FWeb\u002FHTTP\u002FGuides\u002FCSP",[833],"nofollow","MDN：内容安全策略",[69,836,837],{},"CSP",[51,839,840,847],{},[69,841,842],{},[829,843,846],{"href":844,"rel":845},"https:\u002F\u002Fdeveloper.mozilla.org\u002Fzh-CN\u002Fdocs\u002FGlossary\u002FCSRF",[833],"MDN：Cross-Site Request Forgery",[69,848,849],{},"CSRF 概念",[51,851,852,859],{},[69,853,854],{},[829,855,858],{"href":856,"rel":857},"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FCross_Site_Scripting_Prevention_Cheat_Sheet.html",[833],"OWASP：XSS Prevention",[69,860,861],{},"XSS 防护（英文）",[51,863,864,871],{},[69,865,866],{},[829,867,870],{"href":868,"rel":869},"https:\u002F\u002Fcheatsheetseries.owasp.org\u002Fcheatsheets\u002FCross-Site_Request_Forgery_Prevention_Cheat_Sheet.html",[833],"OWASP：CSRF Prevention",[69,872,873],{},"CSRF 防护（英文）",[875,876,877],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":227,"searchDepth":410,"depth":410,"links":879},[880,885,888,891,895,899,900],{"id":34,"depth":410,"text":35,"children":881},[882,884],{"id":42,"depth":883,"text":43},3,{"id":124,"depth":883,"text":125},{"id":263,"depth":410,"text":264,"children":886},[887],{"id":270,"depth":883,"text":270},{"id":355,"depth":410,"text":356,"children":889},[890],{"id":362,"depth":883,"text":270},{"id":484,"depth":410,"text":485,"children":892},[893,894],{"id":491,"depth":883,"text":492},{"id":589,"depth":883,"text":590},{"id":611,"depth":410,"text":896,"children":897},"五、eval 与 new Function 的风险",[898],{"id":655,"depth":883,"text":655},{"id":730,"depth":410,"text":730},{"id":806,"depth":410,"text":806},{"title":8,"description":9},"knowledge\u002Fbooklet\u002Fweb\u002FJs\u002Fsafe","knowledge\u002Fknowledge\u002Fbooklet\u002Fweb\u002FJs\u002Fsafe.md","md",{"items":906},[907,912,916,920,924,928],{"path":908,"title":909,"description":910,"category":10,"score":911},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Ferror","错误处理与调试","结构化错误类型、try\u002Fcatch 与全局未捕获处理是健壮应用的基础。",6,{"path":913,"title":914,"description":915,"category":10,"score":911},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fdom-bom","浏览器相关 API","DOM 事件、存储、fetch、Worker、Observer 等由浏览器提供的 Web API（非 ECMAScript 核心）。HTML 结构见 标签。",{"path":917,"title":918,"description":919,"category":10,"score":911},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fperformance","性能优化","防抖\u002F节流、渲染与内存、资源预加载及引擎行为是前端性能的主要抓手。相关 CSS 见 视觉效果、Head 资源提示。",{"path":921,"title":922,"description":923,"category":10,"score":911},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fcommon","模块化与工程化","ESM、CommonJS 与打包工具（Tree Shaking、代码分割）是前端工程化的基础。入门见 JavaScript 基础 · 模块。",{"path":925,"title":926,"description":927,"category":10,"score":911},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fscope","执行模型与作用域","执行上下文与词法作用域决定变量在何处可访问、闭包如何形成，以及 var \u002F let \u002F const 的差异。语言概览见 JavaScript 基础。",{"path":929,"title":930,"description":931,"category":10,"score":911},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fmap-set","数据结构与集合增强","Map \u002F Set、WeakMap \u002F WeakSet、数组高阶方法、TypedArray 与 Symbol 等扩展了内置数据结构能力。见 语言基础。",{"series":933,"title":434,"items":934,"index":976,"prev":977,"next":978},"booklet\u002Fweb\u002Fjs",[935,939,943,945,949,951,953,957,961,963,965,969,973,974],{"path":936,"title":937,"date":938,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fadvanced","函数进阶","2022-10-24",{"path":940,"title":941,"date":942,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fbasics","JavaScript 基础","2023-11-24",{"path":921,"title":922,"date":944,"pinned":15},"2025-06-21",{"path":946,"title":947,"date":948,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fdesign","设计模式","2021-10-05",{"path":913,"title":914,"date":950,"pinned":15},"2025-07-10",{"path":908,"title":909,"date":952,"pinned":15},"2026-06-25",{"path":954,"title":955,"date":956,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fevent-loop","异步编程与事件循环","2020-03-23",{"path":958,"title":959,"date":960,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fexec","正则表达式","2022-05-21",{"path":929,"title":930,"date":962,"pinned":15},"2024-07-10",{"path":917,"title":918,"date":964,"pinned":15},"2025-07-04",{"path":966,"title":967,"date":968,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fprototype","原型与面向对象","2020-04-13",{"path":970,"title":971,"date":972,"pinned":15},"\u002Fknowledge\u002Fbooklet\u002Fweb\u002Fjs\u002Fproxy","代理与反射","2022-10-23",{"path":7,"title":8,"date":14,"pinned":15},{"path":925,"title":926,"date":975,"pinned":15},"2025-01-29",12,{"path":970,"title":971,"date":972,"pinned":15},{"path":925,"title":926,"date":975,"pinned":15}]