<?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" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Jingru Zhang - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ freeCodeCamp 是一个免费学习编程的开发者社区，涵盖 Python、HTML、CSS、React、Vue、BootStrap、JSON 教程等，还有活跃的技术论坛和丰富的社区活动，在你学习编程和找工作时为你提供建议和帮助。 ]]>
        </description>
        <link>https://www.freecodecamp.org/chinese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Jingru Zhang - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/chinese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 22 Jun 2026 05:24:50 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/chinese/news/author/jingru/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ 让编程功力迅速升级的几个 JavaScript 方法 ]]>
                </title>
                <description>
                    <![CDATA[ 目前绝大多数的软件都会涉及数据收集和处理，在日常工作里，处理数组是再平常不过了的操作。忘掉 for 循环吧，别再使用老套的 (let i=0; i < value.length; i++ ) 了。 > 小提示：如果在  for 循环中使用了 const ，你会被报错。因为在循环的时候， i 会递增，被 "i++" 重新赋值，所以每次在 let 和 const  之间犹豫不决的时候，你就问自己这个问题：这个值会不会被重新赋值？如果会，就选择 let；如果不会，就选择 const。 更多 [https://stackoverflow.com/questions/41067790/why-does-const-work-in-some-for-loops-in-javascript] 打个比方，你需要展示一系列产品，并且对数组进行分类、筛选、修改、更新等操作，又或者说你需要对数组做一些简单的计算，比如加法乘法等等。那么，要怎么操作才是上策呢？ 可能你听到箭头函数就摇头，可能你不是一个喜欢花很多时间学新东西的人，可能你觉得这些都与你无关，相信我，你不是唯一一个这样想的人。接下来请先看我用  ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/7-javascript-methods-that-will-boost-your-skills-in-less-than-8-minutes/</link>
                <guid isPermaLink="false">5d1db590fbfdee429dc5ea97</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jingru Zhang ]]>
                </dc:creator>
                <pubDate>Mon, 27 Dec 2021 10:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2019/07/1_H-25KB7EbSHjv70HXrdl6w-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>目前绝大多数的软件都会涉及数据收集和处理，在日常工作里，处理数组是再平常不过了的操作。忘掉 for 循环吧，别再使用老套的 (let i=0; i &lt; value.length; i++ ) 了。</p><blockquote>小提示：如果在 &nbsp;for 循环中使用了 <code>const</code> &nbsp;，你会被报错。因为在循环的时候， i 会递增，被 "<code>i++</code>" 重新赋值，所以每次在 <code>let</code> 和 <code>const</code> 之间犹豫不决的时候，你就问自己这个问题：这个值会不会被重新赋值？如果会，就选择 <code>let</code>；如果不会，就选择 <code>const</code>。 <a href="https://stackoverflow.com/questions/41067790/why-does-const-work-in-some-for-loops-in-javascript">更多</a></blockquote><p>打个比方，你需要展示一系列产品，并且对数组进行分类、筛选、修改、更新等操作，又或者说你需要对数组做一些简单的计算，比如加法乘法等等。那么，要怎么操作才是上策呢？</p><p>可能你听到<strong>箭头函数</strong>就摇头，可能你不是一个喜欢花很多时间学新东西的人，可能你觉得这些都与你无关，相信我，你不是唯一一个这样想的人。接下来请先看我用 ES5（普通函数） 和 ES6（箭头函数）来实现这些操作。</p><p><strong>注意：</strong> 箭头函数和普通函数不完全是一回事儿，不能<a href="https://stackoverflow.com/questions/34361379/arrow-function-vs-function-declaration-expressions-are-they-equivalent-exch?utm_medium=organic&amp;utm_source=google_rich_qa&amp;utm_campaign=google_rich_qa">随意相互替换改写</a>，记住，关键词 <code>this</code> 在箭头函数和普通函数里是两个不同的东西。</p><h4 id="-javascript-">本文涉及到的 JavaScript 方法列表：</h4><ol><li>展开操作符</li><li>for…of 循环</li><li>includes()</li><li>some()</li><li>every()</li><li>filter()</li><li>map()</li><li>reduce()</li></ol><blockquote>如果你想成为一名更好的 Web 开发者，或者是开创自己的事业，或者是教他人编程，抑或是想要精进自身的编程能力，请关注我的周更系列，我会分享关于最新 Web 开发语言的技巧要点。</blockquote><h3 id="1-">1. 展开操作符</h3><p>展开操作符能用来将数组 (array) 内的元素<strong>展开</strong> ，也可以用在对象常量 (object literals) 里。</p><p><strong>使用展开操作符的好处有哪些？</strong></p><ul><li>是一个展示数组元素的简单、直接的方式</li><li>适用于数组 (array) 和对象常量 (object literals)</li><li>是一个传递参数的快速、直接的方式</li><li>只用写三个点…</li></ul><p><strong>举个例子:</strong> 不写循环来展示最喜欢的食物列表中的元素，通过展开操作符来实现：</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image.png" class="kg-image" alt="image" width="600" height="400" loading="lazy"></figure><h3 id="2-for-of-">2. for…of 循环</h3><p><code>for...of</code> 语句可以用来遍历数组，也可以用来改写元素，可以基本替换传统的 <code>for-loop</code> 循环。</p><p><strong>使用 <code>for…of</code> 循环的好处有哪些？</strong></p><ul><li>是一个更新元素的简单方式</li><li>可以用来完成加法乘法等计算操作</li><li>可以和条件语句配合使用，比如 if，while，switch 等</li><li>写出简洁优雅的代码</li></ul><p><strong>举个例子：</strong> 你想展示工具箱里的工具，那么就可以使用 <code>for...of</code> 循环语句来轻松实现。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image-1.png" class="kg-image" alt="image-1" width="600" height="400" loading="lazy"><figcaption><code>for...of</code> 语句</figcaption></figure><h3 id="3-includes-">3. Includes() 方法</h3><p><code>includes()</code> 方法用于检查一个数组中是否含有某个字段，会返回 <code>true</code> 或者 <code>false</code>值。用来检验的字段要注意大小写，如果你得检验字段是 <code>school</code>，而数组中只有 &nbsp;<code>SCHOOL</code>，那么返回值就是 <code>false</code>。</p><p><strong>使用 includes() 的好处有哪些？</strong></p><ul><li>是一个简易的搜索功能</li><li>是一个快速判断某字段是否存在的简洁方式</li><li>可以使用条件语句来进行修改、筛选等操作</li><li>写出可读性更强的代码</li></ul><p><strong>举个例子：</strong>假设你想不起你车库里存放着哪些车了，你需要一个系统来帮你判断你想要的车存不存在，那么 <code>includes()</code> 可以帮到你！</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image-2.png" class="kg-image" alt="image-2" width="600" height="400" loading="lazy"><figcaption>带箭头函数的 <code>includes()</code></figcaption></figure><h3 id="4-some-">4. Some() 方法</h3><p><code>some()</code> 方法用来检验数组中是否存在某些元素，返回值为 <code>true</code> 或者 <code>false</code> ，和 <code>includes()</code> 方法的一些核心思想很相近，但是必须注意的是，传进 <code>some()</code>方法里的参数必须是函数，而不能是字符串。</p><p><strong>使用 some() 的好处有哪些？</strong></p><ul><li>用来验证数组中是否<strong>有</strong>元素满足检验条件</li><li>以函数形式来做条件判定</li><li>陈述式代码</li><li>检验有无即可</li></ul><p><strong>举个例子：</strong> 打个比方，你是一家俱乐部的老板，你不想限制客人进店，但对于明显喝多了的客人你不想让他们进来（原谅我贫瘠的想象力）。下面看看如何用 ES5 和 ES6 写这个函数：</p><h4 id="es5-">ES5:</h4><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image-3.png" class="kg-image" alt="image-3" width="600" height="400" loading="lazy"><figcaption><code>some()</code> 方法</figcaption></figure><h4 id="es6-">ES6:</h4><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image-4.png" class="kg-image" alt="image-4" width="600" height="400" loading="lazy"><figcaption>带箭头函数的 <code>some()</code> 方法</figcaption></figure><h3 id="5-every-">5. Every() 方法</h3><p>用 <code>every()</code> 来遍历数组，挨个元素检查，最后返回 &nbsp;<code>true</code> 或者 <code>false</code>值，和 <code>some()</code> 的核心思想是一样的，不同点在于一旦有某个元素不满足检验条件，返回值即为 &nbsp;<code>false</code> 。</p><p><strong>使用 every() 的好处有哪些？</strong></p><ul><li>用来验证数组中是否<strong>所有</strong>元素都满足检验条件</li><li>以函数形式来做条件判定</li><li>陈述式代码</li></ul><p><strong>举个例子：</strong> 上次你用 <code>some()</code> 方法，让一些年龄不满的学生混进来了，结果被人举报，警察找上了门。所以，这次你要用 <code>every()</code> 来做检验，保证<strong>每一个人</strong>都满足年龄要求，才能进俱乐部。</p><h4 id="es5">ES5</h4><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image-5.png" class="kg-image" alt="image-5" width="600" height="400" loading="lazy"><figcaption><code>every()</code> 方法</figcaption></figure><h4 id="es6">ES6</h4><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image-6.png" class="kg-image" alt="image-6" width="600" height="400" loading="lazy"><figcaption>带箭头函数的 <code>every()</code> 方法</figcaption></figure><h3 id="6-filter-">6. Filter() 方法</h3><p><code>filter()</code> 会将通过检验条件的所有元素放进一个新的数组。</p><p><strong>使用 filter() 的好处有哪些？</strong></p><ul><li>不会改动原始数组</li><li>剔除掉不需要的元素</li><li>可读性更强的代码</li></ul><p><strong>举个例子：</strong> 你只想要价格等于 30 或者 30 以上的，其他的价格剔除掉...</p><h4 id="es5-1">ES5</h4><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image-7.png" class="kg-image" alt="image-7" width="600" height="400" loading="lazy"><figcaption><code>filter()</code></figcaption></figure><h4 id="es6-1">ES6</h4><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image-8.png" class="kg-image" alt="image-8" width="600" height="400" loading="lazy"><figcaption>带箭头函数的 <code>filter()</code></figcaption></figure><h3 id="7-map-">7. Map() 方法</h3><p>和 &nbsp;<code>filter()</code> 一样，<code>map()</code> 也会返回一个新的数组，但不同的是，<code>map()</code> 可以用来修改元素。</p><p><strong>使用 map() 的好处有哪些？</strong></p><ul><li>不会改动原始数组</li><li>修改数组内元素</li><li>可读性更强的代码</li></ul><p><strong>举个例子：</strong> 你手头上有一些产品的价格，经理要求你把加 25% 税后的价格报给他，这个时候你就可以使用 &nbsp;<code>map()</code> 方法。</p><h4 id="es5-2">ES5</h4><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image-9.png" class="kg-image" alt="image-9" width="600" height="400" loading="lazy"><figcaption><code>map()</code></figcaption></figure><h4 id="es6-2">ES6</h4><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image-10.png" class="kg-image" alt="image-10" width="600" height="400" loading="lazy"><figcaption>带箭头函数的 <code>map()</code></figcaption></figure><h3 id="8-reduce-">8. Reduce() 方法</h3><p><code>reduce()</code> 可以将一个数组变成一个数字，一个对象，一系列 promises 等。一个使用 <code>reduce()</code> 的简易场景就是将一系列数字相加求和，将一个数组“浓缩”成一个数值。</p><p><strong>使用 reduce() 的好处有哪些？</strong></p><ul><li>进行计算操作</li><li>求值</li><li>重复值数量计数</li><li>按照属性对对象进行分组</li><li>按顺序执行 promises</li><li>快速计算</li></ul><p><strong>举个例子：</strong> 你想知道这一周花了多少钱，你可以使用 <code>reduce()</code> 求值。</p><h4 id="es5-3">ES5 </h4><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image-11.png" class="kg-image" alt="image-11" width="600" height="400" loading="lazy"><figcaption><code>reduce()</code></figcaption></figure><h4 id="es6-3">ES6</h4><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/image-12.png" class="kg-image" alt="image-12" width="600" height="400" loading="lazy"><figcaption>带箭头函数的 <code>reduce()</code></figcaption></figure><p>原文链接：<a href="https://www.freecodecamp.org/news/7-javascript-methods-that-will-boost-your-skills-in-less-than-8-minutes-4cc4c3dca03f/">These JavaScript methods will boost your skills in just a few minutes</a>，作者：<a href="https://www.freecodecamp.org/news/author/dler/">Dler Ari</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 如何在一小时内为你的人生加密 ]]>
                </title>
                <description>
                    <![CDATA[ > “唯有偏执狂可以生存下去。” — Andy Grove 题图：2012 年，艺术家 Federico Uribe 使用电线在油画布上创作的作品“连接过去” 。 Andy Grove 原本是匈牙利难民，逃离了共产主义政权，后来学习工程学，以英特尔 CEO 的身份掀起了一场个人电脑普及的全球革命。在和帕金森病魔长期斗争后，Andy Grove 于 2016 年 3 月份病逝于硅谷。 Andy Grove 作为世界上最有权力的人之一，当他建议你小心谨慎的时候，你最好洗耳恭听。 其实不只是 Andy Grove，美国联邦调查局（FBI）局长也曾建议把电脑的摄像头遮盖起来 [https://thehill.com/policy/national-security/295933-fbi-director-cover-up-your-webcam] ，这位局长曾经悬赏黑客百万，寻求破解枪杀案主犯的 iPhone 手机的办法。 于是你暗自忖度：自己又不违法犯纪，有什么好担心的，正如英国国家监视系统所宣传的那样：“如果你坦坦荡荡，就没有什么好担心的。” 但是，就算是遵纪守法的公民也有担心的 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/how-to-encrypt-your-entire-life-in-less-than-an-hour/</link>
                <guid isPermaLink="false">5d1cb2a0fbfdee429dc5ea26</guid>
                
                    <category>
                        <![CDATA[ 生活技巧 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jingru Zhang ]]>
                </dc:creator>
                <pubDate>Fri, 10 Dec 2021 10:00:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2019/07/1_heFbQfGHtoU_6vfRQSZkDg-1.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <blockquote>“唯有偏执狂可以生存下去。” — Andy Grove</blockquote><p>题图：2012 年，艺术家 Federico Uribe 使用电线在油画布上创作的作品“连接过去” 。</p><p>Andy Grove 原本是匈牙利难民，逃离了共产主义政权，后来学习工程学，以英特尔 CEO 的身份掀起了一场个人电脑普及的全球革命。在和帕金森病魔长期斗争后，Andy Grove 于 2016 年 3 月份病逝于硅谷。</p><p>Andy Grove 作为世界上最有权力的人之一，当他建议你小心谨慎的时候，你最好洗耳恭听。</p><p>其实不只是 Andy Grove，美国联邦调查局（FBI）局长也曾建议<a href="https://thehill.com/policy/national-security/295933-fbi-director-cover-up-your-webcam">把电脑的摄像头遮盖起来</a>，这位局长曾经悬赏黑客百万，寻求破解枪杀案主犯的 iPhone 手机的办法。</p><p>于是你暗自忖度：自己又不违法犯纪，有什么好担心的，正如英国国家监视系统所宣传的那样：“如果你坦坦荡荡，就没有什么好担心的。”</p><p>但是，就算是遵纪守法的公民也有担心的理由，也有理由保护自己的设备、文件、和所爱的人的沟通记录不受入侵。</p><blockquote>“哪怕是世界上最诚实的人，只要给我六行他写的字，我就能找出办法将他处以绞刑。” —红衣主教 Richelieu，于 1641 年</blockquote><p>我会在这篇文章中介绍当前最先进的加密技术，教你如何保护自己，<strong>帮助你在很短的时间内，完善自己的隐私设置。</strong></p><h3 id="-">普通人的隐私常识</h3><p>先把话说在前头，文中我介绍的方法是 100% 免费、100% 合法的。只要你晚上睡觉有锁门的意识，你就应该有保护个人隐私的意识。</p><blockquote>"时刻准备着。"—童军铭言</blockquote><p>接下来，我们做好准备吧。</p><p>第一步，先明确几个定义。当我说“入侵者”，我指的是每一个未经你亲自授权，但试图获取你的信息的人，他可以是黑客，公司、或者政府。</p><p>当我说“私密的”、“安全的”，我指的相对意义上的私密和安全。只要环节中有人的参与，就不能说这个系统是 100% 的安全和私密。</p><p>只要你的手机、电脑和账户是保护起来的，里面的内容是保持加密状态的，那么再强大的入侵者也无法肆意妄为。</p><h3 id="--1">锦囊一：开启邮箱双重验证</h3><p>邮箱是你电子生活的中枢系统，如果你的邮箱被入侵了，不仅你的邮件会被泄漏，你的各种社交账号、银行账号密码都可以通过邮箱重置。</p><p>想保护你的邮箱的话，最简单的方法就是开启双重验证功能。</p><p>简单的说，双重验证是在你登录邮箱的时候多一层保护，一般就是系统会发送一个验证码短信到你绑定的手机号上，验证通过后才能登陆。</p><p>双重验证可以有效的减少邮箱被盗的风险。</p><p>为 Gmail 设置双重验证，请点击<a href="https://myaccount.google.com/security#signin">这里</a>。</p><p>现在就去做设置吧。</p><p>我是认真的。</p><p>等你设置好，我在这里等你。</p><h3 id="--2">锦囊二：为硬盘加密</h3><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/03/image-1.png" class="kg-image" alt="image-1" width="800" height="649" loading="lazy"></figure><p><a href="https://support.microsoft.com/en-us/instantanswers/e7d75dd2-29c2-16ac-f03d-20cfdf54202f/turn-on-device-encryption">Windows</a> 和 <a href="https://support.apple.com/en-us/HT204837">MacOS</a> 都有现成的硬盘加密机制，你只需要将功能开启就好。</p><h3 id="--3">锦囊三：开启手机密码验证</h3><p>指纹加密可以起到一定作用，但只有指纹保护是不够的。</p><p>在美国宪法第五修正案（防止自证己罪）的保护下，你有权保护自己的密码不对外公开，但是指纹的话，法院完全可以下令让你自己用手指解锁手机。</p><p>而且，如果入侵者获取了你的指纹信息，你是几乎没有办法改指纹的。</p><p>一般来说，在 10 次密码验证失败后手机就会自动上锁，如果你的四位数密码出现在以下常见密码列表中，你最好修改密码。</p><pre><code>1234  
9999
1111  
3333
0000  
5555
1212  
6666
7777  
1122
1004  
1313
2000  
8888
4444  
4321
2222  
2001
6969  
1010
</code></pre><p><strong>提示</strong>: 如果图方便一定要使用指纹验证的话，那么在您被捕后一定要立马将手机关机，当有关部门要求您解锁手机时，则必须要通过密码验证。</p><h3 id="--4">锦囊四：不要重复使用密码</h3><p>密码<a href="https://medium.freecodecamp.com/360-million-reasons-to-destroy-all-passwords-9a100b2b5001">本来就是不安全的</a>。</p><p>Mark Zuckerberg 的 LinkedIn 账号密码是 “dadada”，在今年年初的时候有黑客在网上公布了 1.17 亿个邮箱账号+密码组合，Zuckerberg 的账号和密码赫然在其中，于是，黑客轻而易举的用同样的邮箱和密码组合入侵了他的推特和 Pinterest 账号。</p><p>所以，千万不要重复使用密码。</p><p>如果多个密码管理起来觉得有难度，可以考虑使用<a href="https://en.wikipedia.org/wiki/Password_manager">密码管理器</a>。</p><h3 id="-signal-">锦囊五：使用 Signal 发送私人讯息</h3><p><a href="https://www.eff.org/node/82654">电子前线基金会</a>将 Signal 评为满分的即时通讯工具，Signal 广受欢迎，可以用来发简讯、群聊、传图片和视频，任何通讯 APP 应该有的功能 Signal 都具备，而且一切通讯都是经过加密处理的。</p><p>Signal 免费、开源，在 iOS 和安卓系统都可以下载。我本人在短短五分钟内就完成了下载、设置到和亲友放心聊天的一系列步骤。</p><h4 id="-signal">第一步：安装 Signal</h4><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/03/image-2.png" class="kg-image" alt="image-2" width="800" height="1422" loading="lazy"></figure><h4 id="-signal-1">第二步：邀请朋友安装 Signal</h4><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/03/image-3.png" class="kg-image" alt="image-3" width="799" height="1066" loading="lazy"></figure><h4 id="--5">第三步：发送消息</h4><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/03/image-4.png" class="kg-image" alt="image-4" width="799" height="1066" loading="lazy"></figure><p>恭喜你！现在你可以和亲朋好友自由聊天啦，而且内容都经过加密，不用担心有人监听。</p><p>Signal 也可以用来打语音电话。</p><h3 id="--6">锦囊六：浏览器的隐私模式不能完全保护你的隐私</h3><p>就算你开启了 Chrome 浏览器的“隐身模式”或者是火狐浏览器的“私密阅览”，还是有人能够监听你的网络活动的：</p><ul><li>网络服务提供商</li><li>负责你所在学校、工作场所或任何所在网络的系统管理员</li><li>谷歌等浏览器提供商</li></ul><p>Internet Explorer, Safari, Opera 等其他浏览器并不会更私密。</p><p>如果你想换一个比较私密（不会有 100% 私密的系统）的浏览器，可以使用 Tor。</p><h3 id="-tor-">锦囊七：使用 Tor 浏览器</h3><p>免费开源的 Tor，即"洋葱路由器"（The Onion Router），名字来源于其像洋葱一样的特性，多层掩盖浏览活动，使用简单方便。</p><h4 id="-orbot">第一步：下载 Orbot</h4><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/03/image-5.png" class="kg-image" alt="image-5" width="800" height="1422" loading="lazy"></figure><h4 id="-orfox-">第二步：下载 Orfox 浏览器</h4><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/03/image-6.png" class="kg-image" alt="image-6" width="800" height="1422" loading="lazy"></figure><h4 id="-orbot-1">第三步：打开 Orbot</h4><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/03/image-7.png" class="kg-image" alt="image-7" width="800" height="1422" loading="lazy"></figure><h4 id="-orfox">第四步：打开 Orfox</h4><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/03/image-10.png" class="kg-image" alt="image-10" width="498" height="683" loading="lazy"></figure><h4 id="--7">第五步：验证有效性</h4><p>打开 check.torproject.org，看看加密是否生效。 恭喜你！现在你可以自由浏览，不用担心有人在监控你的网络活动。</p><h3 id="--8">锦囊八：私密搜索</h3><p>如果 Tor 使用起来不太方便，你可以尝试 <a href="https://duckduckgo.com/privacy">DuckDuckGo</a>，一个不跟踪搜索数据的搜索引擎。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/03/image-8.png" class="kg-image" alt="image-8" width="800" height="449" loading="lazy"></figure><p>DuckDuckGo 虽然没有一支在人数上媲美谷歌搜索引擎的工程师团队，但有需要的话，DuckDuckGo 可以帮你加密获取谷歌搜索结果，只需在 DuckDuckGo 搜索框中输入在要搜索的关键词，并在关键词前加上 !google 即可。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/03/image-9.png" class="kg-image" alt="image-9" width="800" height="386" loading="lazy"></figure><p>计算机安全专家 Bruce Schneier 的一本书《数据和歌利亚：一场争夺数据和控制世界的无烟之战》我非常推荐，我在阅读的过程中学到了很多东西，现在已经是第二遍在听这本书了。</p><p>原文链接：<a href="https://www.freecodecamp.org/news/tor-signal-and-beyond-a-law-abiding-citizens-guide-to-privacy-1a593f2104c3/">How to encrypt your entire life in less than an hour</a>，作者：<a href="https://www.freecodecamp.org/news/author/quincylarson/">Quincy Larson</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 是哪些工具和资源帮我拿下第一份前端工作的？ ]]>
                </title>
                <description>
                    <![CDATA[ 在学习前端开发的过程中，难免有时会觉得力不从心。学习的资源和工具那么多，但是时间却是很有限，我们应该选择哪些资源和工具，又应该把精力集中在哪些方面呢？ 我曾经在“如何在十个月内成功完成转型并拿下第一份程序员工作 [https://www.freecodecamp.org/news/how-i-switched-careers-and-got-a-developer-job-in-10-months-a-true-story-b8895e855a8b/] “一文中，分享了自己的旅程：我从一名毫无相关经验的英语教师成功转型，进入位于马德里的一家初创公司做前端。 在这篇文章中，我想更加深入地跟大家分享自己在学习中用到的各种资料和工具。 我会带着大家分析我上过的课程，介绍各自的优缺点以及上课时我做过的项目。我会把转型期间的几个里程碑事件拿出来详细讲讲，比如如何上手 GitHub，如何打造作品集，以及保持学习动力的方法。 学什么，在哪学？ 我坐在电脑前盯着一张太阳的照片，我当时想尖叫，想哭又想笑。这不仅仅是一张太阳的照片而已，这是一张我从美国国家航空航天局（NASA）数据库中扒下来的照片 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/the-tools-and-resources-that-landed-me-a-front-end-developer-job/</link>
                <guid isPermaLink="false">5d1cbc8cfbfdee429dc5ea4e</guid>
                
                    <category>
                        <![CDATA[ Web开发 ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jingru Zhang ]]>
                </dc:creator>
                <pubDate>Wed, 12 May 2021 07:08:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2019/07/1_rJ4vcEvOjO5k07-TpGrOyA.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>在学习前端开发的过程中，难免有时会觉得力不从心。学习的资源和工具那么多，但是时间却是很有限，我们应该选择哪些资源和工具，又应该把精力集中在哪些方面呢？</p><p>我曾经在“<a href="https://www.freecodecamp.org/news/how-i-switched-careers-and-got-a-developer-job-in-10-months-a-true-story-b8895e855a8b/">如何在十个月内成功完成转型并拿下第一份程序员工作</a>“一文中，分享了自己的旅程：我从一名毫无相关经验的英语教师成功转型，进入位于马德里的一家初创公司做前端。</p><p>在这篇文章中，我想更加深入地跟大家分享自己在学习中用到的各种资料和工具。</p><p>我会带着大家分析我上过的课程，介绍各自的优缺点以及上课时我做过的项目。我会把转型期间的几个里程碑事件拿出来详细讲讲，比如如何上手 GitHub，如何打造作品集，以及保持学习动力的方法。</p><h3 id="-">学什么，在哪学？</h3><p>我坐在电脑前盯着一张太阳的照片，我当时想尖叫，想哭又想笑。这不仅仅是一张太阳的照片而已，这是一张我从美国国家航空航天局（NASA）数据库中扒下来的照片！在漫长的尝试后，我终于学会了如何操作 NASA 的 API 了。我感觉像个顶尖黑客高手，感觉自己马上就能够控制红绿灯了！</p><p>实际上呢，我并没有能够控制红绿灯，我到现在也没做到。但我也没想到的是仅仅在几天后，我收到了第一份工作录用函。</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/1__gmlkF_JqEkxsAlvJCttFg.gif" class="kg-image" alt="1__gmlkF_JqEkxsAlvJCttFg" width="600" height="400" loading="lazy"><figcaption>图片来源：NASA 多媒体数据库</figcaption></figure><p>所以，我是如何从零开始，在前端开发领域中找到自己的第一份工作的，要学什么，在哪儿学？</p><p>其实在刚开始学习前端时，我很为此焦虑，我的时间那么宝贵，我一定要把时间花在最好的资源上面。在<a href="https://twitter.com/Syknapse">推特</a>上我也经常被问到这个问题，因为初学者总是最关心学什么，在哪学。</p><p>但我接下来要说的可能会让人大跌眼镜， 我想说其实在职业转型的整个过程中，这个问题是最不重要的，学什么、在哪儿学，并没有初学者想的那么关键。</p><p>不管你决定用什么资源、上什么课程，只要你有恒心有毅力，保持学习的动力，你一定会学到东西而且把它学好。</p><p>当然，课程绝对有优劣之分，找到掌握必要技能的方法和路径也至关重要。</p><p>但是，如果你半途而废，有再好的课程、再完整的学习路径也无济于事。所以，真正重要的是你找到能让你保持学习动力的方法，而不是决定上什么课程。什么才是最适合你的，这个答案因人而异。</p><p>我的建议是，在你一头扎进学习的海洋之前，花点时间了解自己的学习风格，找到适合自己的方法。在下决定之前，不妨多尝试几种不同的课程和学习风格。</p><h3 id="--1">我上过的课程</h3><p>在十个月紧张的学习过程中，我浏览了无数的资源，我从当下的学习需求出发，选择能让我保持兴趣的资源，我在不同的课程之间进进出出，取我所需，我评价自己进度的唯一标准是我究竟学到了什么。</p><p>我只选择能让我自由选择学习时间的资源，因为我当时还是全职工作状态，而且我的财务状况也不允许我参加昂贵的训练营或者课程，我只能选择免费或打折的学习资源。在我拿到第一份工作邀请函的时候，我在课程等资源上的花费总计不到一百欧元。</p><p>我会把我用到的所有资源都列在一个表单里，并在文末分享链接。</p><h3 id="youtube-">YouTube 先行</h3><p>Jake Wright 的“12 分钟内学会 HTML”教程视频是我最早的 Web 开发启蒙，然后就是他的“12 分钟内学会 CSS”。我在看完后创建了自己的第一个网页，总共下来花了很少的时间，很激励人。这套视频课程虽然很基础，甚至有点儿过时，但是对于零基础的小白来说再合适不过。</p><p>Traversy Media 和 LevelUpTuts 出品的教学视频我也经常看。</p><h3 id="colt-steele-the-web-developer-bootcamp-web-">Colt Steele 的 The Web Developer Bootcamp （全栈 Web 开发训练营）课程</h3><p>这是 Udemy 上最受欢迎的 Web 开发课程之一，而且经常打折。Colt 的教学水平很不错，适合小白，会带着零基础的你慢慢的打基础，到最后你会完成一系列好看的项目作品，以供展示。</p><p>这套课程涉猎范围很广，但如果你只对前端开发感兴趣，可能这套课程会有点超纲。课程采用的“照着写代码”的教学风格对初学者是有好处的，但对于初学者也要学习的解决问题的思维，这套课程却不怎么鼓励培养。</p><p>我制作了 <a href="https://github.com/Syknapse/RGB-Color-Changing-Game">RGB 颜色游戏</a>和 <a href="https://github.com/Syknapse/Patatap-Clone">Patatap Clone</a> 两个项目，后来在面试的时候，这两个项目变成了很好的话题点。另外，能在学习早期就做出两个网页 App 也极大地鼓舞了我。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2019/07/1_9Z1_KtDVDgitSkhMm4JiXw.gif" class="kg-image" alt="1_9Z1_KtDVDgitSkhMm4JiXw" width="600" height="400" loading="lazy"></figure><h3 id="freecodecamp-org">freeCodeCamp.org</h3><p>对每个准备上手 Web 开发的朋友，我都首推 freeCodeCamp 作为入门资源。在简单的注册后，任何人都可以立即开始写代码，准备和设置时间成本为零。你很快就会进入状态，迫不及待想要点亮那一个个绿色的勾号。</p><p>freeCodeCamp 课程体系覆盖了所有现代 Web 开发的知识点，它的背后是一个活跃的社区，而且资源完全免费！最重要的是，这个组织和它的使命是非常伟大的。</p><p>最好的部分是它的项目题。你必须从头开始构建项目，这会花一些时间，但这是你提升技能所需要的练习。当你遇到问题的时候，尽管没有直接的指导，freeCodeCamp 活跃的社区会帮你找到答案。</p><p>我为我最爱的“明星”（氢型，非红毯型）制作了一个<a href="https://github.com/Syknapse/Tychos-Supernova">致敬网页</a>，还制作了个人作品集和用 React 编写的<a href="https://github.com/Syknapse/random-quote-machine-react-beta">语录自动生成器</a>。</p><h3 id="wes-bos-javascript-30-">Wes Bos 的 JavaScript 30 课程</h3><p>Wes 是我最喜欢的讲师之一，每次听 Wes 讲课，我都知道我是在获取关于所讲话题最新、最深度的分析和信息。我强烈推荐他的课程。</p><p>我主要是上了他的 JavaScript 30 免费课程，毫不夸张地说，这个课程实在是太实用了。我写的每一个项目作业都变成了我日后的代码参考，我会反复的回来看我当时是怎么用代码实现各种操作的，这些课程代码项目陪我走过了技术面试，面试，以及我正式开工的最开始几个星期。就一门课程来说，这已经是我心目中的最高标准了。</p><p>我写的项目有<a href="https://github.com/Syknapse/Clock">时钟</a>，<a href="https://github.com/Syknapse/Drum-Kit">电子鼓</a>和<a href="https://github.com/Syknapse/Ajax-Type-Ahead">搜索器</a>。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/forum/uploads/default/original/1X/e73139aefddbf87837521d86dc76d0de292b36ad.jpeg" class="kg-image" alt="JavaScript 30" width="600" height="400" loading="lazy"></figure><h3 id="lynda-com">Lynda.com</h3><p>在网站免费试用期内，我选择了一些课程，很喜欢 Christina Truong 的教学，她的课程覆盖高级 CSS、工作流工具、网站上线等方面，我获益不少。Ray Villalobos 的课程也帮助我提升了 Git 方面的技能。</p><p>Lynda.com 的课程质量不错，但是在 Web 开发方面的课程目录并不是很全很专，内容连贯性方面也略逊于其他的专门平台。</p><h3 id="treehouse">Treehouse</h3><p>说到专门平台，就不得不提到 Treehouse。我只是在免费期间浏览试用了一下，很喜欢Treehouse 课程的细分和深度。</p><h3 id="michael-hartl-learn-enough-command-line-to-be-dangerous-">Michael Hartl 的命令行（Learn Enough Command Line to Be Dangerous）课程</h3><p>简单、简明的课程，让命令行神秘不再，让我很快就上手基本的命令行操作。</p><h3 id="cassidy-williams-javascript-and-react-for-developers-">Cassidy Williams 的 JavaScript and React for Developers &nbsp;课程</h3><p>Cassidy 知识广博，教学风格轻松愉快，她的课程具有足够的难度，逼迫着我去钻研更深层次的概念。我是在十个月的学习期结尾、快要开始求职的时候开始上这门课程的。</p><p>在这门课程中，我学会了如何使用 API 来调用并展示返还数据，我写了一个 GitHub 用户搜索 App，是我编程学习生涯中的高点，然后我还写了文章开头提到的那个 NASA 多媒体库搜索 App。</p><p>由于收到了面试的通知，我不得不暂停 NASA 多媒体库搜索 App 的开发，去完成面试布置的一个挑战作业，而这个挑战作业覆盖的内容跟我在课程内学过的东西基本一样。</p><p>我完成了挑战作业，成功拿下了 offer。</p><h3 id="udacity-front-end-web-developer-nanodegree-fend-">Udacity 的 Front-End Web Developer Nanodegree (FEND) 前端开发微专业</h3><p>在我开始学习前端开发几个月后，我拿到了 Udacity 前端开发课程的谷歌奖学金，不久后，我通过了第二阶段的选拔，很幸运的拿到了 Udacity 前端开发微专业（FEND）项目奖学金。</p><p>我得强调一下，就算你没有拿到奖学金，或者没有资金去上这个微专业的课程，也完全不会影响你成功的几率。虽然我在这个课程中获益良多，但这不是我成功的决定性因素，我在完成 FEND 的几个月前就已经拿下工作了。</p><p>其实在拿到奖学金的时候我心里很清楚，对于职业转型我是很认真的。哪怕没拿到奖学金，我也打算在学习资源上投入更多金钱，比如购买 Treehouse 课程或者 Udacity 的按月订阅服务等。</p><p>Udacity 的 FEND 课程标准非常高，授课老师都是行内精英，有着坚实的知识基础和实打实的行业经验。课程项目有难度，有趣味性，而且导师会对学生的项目做出非常有价值的梳理和指导。</p><p>毋庸置疑的是，课程最吸引我的一点是它背后这个活跃、积极的社区。在选择资源的时候，社区文化应该是首要考虑的要素，因为你会发现，你在同学身上学到的东西远比你在老师身上学到的东西多。</p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/forum/uploads/default/original/1X/5e1fa773db6783600bbe3e0ebe8c86c47cdaf452.gif" class="kg-image" alt="Pixel Art Maker" width="600" height="400" loading="lazy"></figure><p>我在 FEND 课程里完成了很多很好的项目，<a href="https://github.com/Syknapse/Pixel-art-maker">像素艺术</a>只是其中的一个，也称得上是我在当时完成过最复杂的项目了。在不断拓展这个项目的功能的过程中，我得到了充分的锻炼，让我像真正的工程师一样思考问题。</p><h3 id="--2">跟踪学习进度</h3><p>如果你想要更加清晰的看到这十个月的时间里我到底做了什么，你可以访问我的 GitHub 项目 <a href="https://github.com/Syknapse/My-Learning-Tracker-first-ten-months">My-Learning-Tracker</a>，我把我上过的所有课程和相关链接都放上去了。如果你想要创建自己的学习进度跟踪项目，你也可以复刻 (fork) 这个项目到你自己的GitHub 库里。</p><h3 id="--3">超越课程：成功的基石</h3><p>教程再好，没有其他方面的资源相助，只是上课也是远远不够的。你应该给课程以外的资源同样程度的重视。</p><p>以下，我列举一些对我转型很有帮助的资源。</p><h3 id="--4">保持动力</h3><p>动力是首要条件。没有动力，就没有一切。我有三个锦囊帮助我渡过难关，保持动力。</p><p>第一、明确的目标。我有一个目标：就是在一年内加入初创公司，成为一名前端开发工程师。有一个明确的目标让我在自我怀疑和缺乏动力时能够保持专注，走出低谷。</p><p>第二、亲友团的支持。当时，我和我的爱人还有我一个很好的朋友都在学习，身边有人能够感同身受，一起经历着一样的事情，能够一起想办法，互相督促，互相鼓励，是很有帮助的。</p><p>第三、网络社区的支持。我从社区里的人身上学到了很多东西，而且收获了许多鼓励和支持。</p><p>保持动力绝非易事，关键在于寻找不断成长的感觉，不管项目大小都要坚持写代码，而且要把握适合自己的学习方法，不要走过去失败的老路。</p><h3 id="--5">社交网络</h3><p>推特让我能够接触到很多专业人士和跟我一样的初学者，是我非常推荐的工具。推特帮助我掌握最新的行业信息和学习资料，帮助我拓展圈子，最后还帮到我找到工作。</p><p>我的推特活动以 freeCodeCamp、#100DaysOfCode 和 #CodeNewbie 为中心，在我编程学习路上的每一步，这些活跃的推特社区都给了我持续的支持。其中，<a href="https://twitter.com/ka11away">Alexander Kallaway</a> 的 <a href="https://www.100daysofcode.com/">#100DaysOfCode</a> 背后的想法非常简单，但是非常有效：每天坚持编程一小时，并且把每天的进度都挂到网上，监督自己，激励他人。</p><p>对于那些曾经鼓励过我、监督过我的社区朋友们，在这里我要特别感谢你们，感谢你们陪我走过这段旅程。</p><h3 id="github">GitHub</h3><p>GitHub 是每一个入门编程的人必定很快就接触到的，对于小白来说，这是一块陌生的、甚至有点让人害怕的领地，充斥着开源、协作项目等字样，感觉跟新手完全不沾边，但相信我，GitHub 和你息息相关。</p><p>GitHub 就是你工作的基石，作为程序员，你会经常用到 Git 和 Git 服务器，其实用多几次后你就会发现 Git 很好上手。对于我来说，在过了最开始的懵懂期后，GitHub 成为我编程学习的中心点，我所有的代码都在 GitHub 上，自然而然的 GitHub 就变成了我的作品集，我利用 GitHub Pages 做了一个网页用来放置我的项目作品。除此以外，我用 GitHub 跟踪我的学习进度，用它来跟其他人协作写项目。</p><p>GitHub 对我来说尤其重要，因为像我这样没有任何相关经验的小白，GitHub 是我展示技能的唯一渠道，绝大多数的雇主都会先看 GitHub 仓库，因为在上面可以很清晰地看到我能做什么、学过什么。我会确保我的 GitHub 仓库里有着丰富的项目经验和详细的文字说明。</p><p>在学习路上有一件让我自豪的事也跟 GitHub 有关。我在上 Udacity 课程的时候，发现很多同学都害怕 GitHub，所以我就做了一个简易教程叫 <a href="https://github.com/Syknapse/Contribute-To-This-Project">Contribute-To-This-Project</a>，帮助我的同学一步步学习如何操作 GitHub。教，是最好的学，不管你掌握的知识有多少，你总能帮助别人学点什么。</p><h3 id="--6">建立个人作品集</h3><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/05/image-4.png" class="kg-image" alt="image-4" width="600" height="400" loading="lazy"></figure><p>一个活跃的 GitHub 库也是不够的，你还需要作品集来充分展示自己的编程技能。建立网站本身也是一个很好的锻炼机会，就算你目前没有项目，你也应该先建站，然后在你写项目的过程中逐渐地把作品添加进去。</p><p>我很早就建站作为个人作品集的想法，我当时觉得自己离真正有能力建立网站还有很大距离，所以我先是在一张纸上画下了心目中想要的网站的样子。实际上呢，我很快就开始着手建站了，开始的早是件好事，因为初稿总不是完美的。</p><p>在当时，这是我做过的最复杂的从零开始的项目，推动我去深入学习，对我帮助极大。我花了无数的时间翻阅 MDN 文档和 Stack Overflow 论坛，一边做网站，一边不断搜索实现一些我不懂的操作的方法。我曾经花了若干小时去排查问题，最后发现就是一个小小的拼写错误，但在这个过程中，我学习如何面对挫折。</p><p>学习编程的精髓其实就在这里。这些技能是我每天工作中都会用到的：如何搜索，如何排查，如何解决问题，如何面对挫折，都是程序员的必修课。</p><p>网站建好的时候我特别激动 —— 这是我的创造！—— 这网站完完全全就是按照我想要的样子建好的！但是，我很快就意识到，作为一个作品集，这个网站完全不达标。所以第二天，我深呼了一口气，开始推翻重来。这次我决定建立一个简单的网站，强调功能性，能够跨越不同设备正常显示，用来展示作品和一点点的个人信息，并不需要做的花里胡哨。</p><p>这正好引出了下面我要说的。</p><h3 id="--7">独立开发</h3><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/05/image.png" class="kg-image" alt="image" width="600" height="400" loading="lazy"></figure><p>独立自己开发项目让很多初学者望而却步，但我的经验告诉我，就算项目没有做的很好，也对编程学习很有帮助。我独立编写的两个作品为我打下了坚实的编程基础，过程中虽然遇到很多挫折和问题，在我刚开始工作的时候这些挫折中收获的经验变成了无价之宝。</p><p>我绝不否认教程和例子实践的价值，但我想强调独立开发的价值：自己写项目的时候，我被推动者去思考添加新的功能，如何优化，如何突破自己。</p><p>做什么项目不重要，重要的是你的收获。举个例子，我做了一个很简单的温度换算器，虽然不是什么很炫的项目，但是我的的确确得从零开始，把所有点都落实清楚，当我完成这个换算器并测试正常时，那种自豪感油然而生。</p><h3 id="--8">播客、文章、对话、活动</h3><p>初学者的学习之路漫漫，有大块的主动学习时间也是不够的，因此，我把平时的碎片时间也调用起来，创造更多机会去获取信息，更深入的去了解程序员的世界。</p><p>阅读文章、看视频、听播客，都是我利用碎片时间的方式，让我在语法语义之外对编程概念有更深入的理解。</p><p>线下活动也是很好的资源，我在住的小城市组织了一个线下编程小组活动，如果你有类似的机会千万不要害怕。相信我，没有人会在活动上拦住你，逼着你向他们证明自己的资历。</p><p>我最喜欢的学习资源（部分）：</p><ul><li>播客：Command Line Heroes — Red Hat Podcast</li><li>播客：Base.cs — Computer science podcast with Vaidehi Joshi</li><li>播客：Syntax.fm — Wes Bos and Scott Tolinski podcast</li><li>播客：CodeNewbie — Saron Yitbarek podcast</li><li>文章：FreeCodeCamp Medium publication</li><li>文章：Hacker Noon articles</li><li>CSS 文章：Smashing Magazine — CSS articles</li><li>CSS 文章：CSS-Tricks</li><li>邮箱订阅：JavaScript Weekly and Frontend Focus</li><li>油管视频系列：Crash Course: Computer Science</li><li>油管视频：CS50 — YouTube videos of CS Harvard lectures</li><li>其他相关油管播主，我把我最喜欢的几个列出来放在<a href="https://www.youtube.com/playlist?list=PLPOncoWIkU9MBFf9s-B_n-IxK0A03FWIG">这里</a></li></ul><p><strong>祝你好运！</strong></p><figure class="kg-card kg-image-card"><img src="https://chinese.freecodecamp.org/news/content/images/2020/05/image-3.png" class="kg-image" alt="image-3" width="600" height="400" loading="lazy"></figure><p>学习之路紧张充实，避免“透支”非常重要。因此，我很重视休息、饮食、锻炼。当我在无法负荷的边缘时，我会给自己放个半天或者一天的假。</p><p>在这十个月的时间里，我放弃了很多，也投入了很多，但这过程中的每一分每一秒都很值，我对我的新职业 —— 前端工程师 —— 很满意。为转型付出的努力，我丝毫不后悔。</p><p>请谨记，每一个人学习的过程和遇到的问题都不尽相同，请不要对自己太苛刻，只要保持前进的方向就可以了。</p><p>原文链接：<a href="https://www.freecodecamp.org/news/the-tools-and-resources-that-landed-me-a-front-end-developer-job-1314c6f1fa7f/">The tools and resources that landed me a front-end developer job</a>，作者：<a href="https://www.freecodecamp.org/news/author/syknapse/">Syk Houdeib</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JavaScript 高阶函数入门浅析 ]]>
                </title>
                <description>
                    <![CDATA[ 高阶函数 高阶函数可以接收函数作为参数，同时也可以返回一个新的函数。 高阶函数之所以高阶 ，是因为高阶函数的参数和返回值对象可以是函数，这超越了普通函数处理的数据类型，例如字符串（strings）、数字（numbers）、布尔值（booleans）等。 JavaScript 中，函数的应用场景很丰富：  * 作为变量存储  * 在数组中使用  * 作为对象属性（即方法）  * 作为参数传递  * 作为其他函数的返回值 理解高阶函数的关键在于，函数即数据。 数据是函数运作的基本 数据：字符串（Strings） sayHi = (name) => `Hi, ${name}!`; result = sayHi('User'); console.log(result); // 'Hi, User!' 数据：数字（Numbers） double = (x) => x * 2; result = double(4); console.log(result); // ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/a-quick-intro-to-higher-order-functions-in-javascript/</link>
                <guid isPermaLink="false">5d2e9461fbfdee429dc5eed9</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Jingru Zhang ]]>
                </dc:creator>
                <pubDate>Wed, 28 Apr 2021 05:30:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2019/07/1_JyhQls2zLuu22yrnsk6mcA.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <h3 id="-">高阶函数</h3><p><strong>高阶函数</strong>可以接收函数作为参数，同时也可以返回一个新的函数。</p><p><strong>高阶函数</strong>之所以<em>高阶</em>，是因为高阶函数的参数和返回值对象可以是函数，这超越了普通函数处理的数据类型，例如字符串（strings）、数字（numbers）、布尔值（booleans）等。</p><p>JavaScript 中，函数的应用场景很丰富：</p><ul><li>作为变量存储</li><li>在数组中使用</li><li>作为对象属性（即方法）</li><li>作为参数传递</li><li>作为其他函数的返回值</li></ul><p>理解高阶函数的关键在于，<em>函数即数据</em>。</p><h3 id="--1">数据是函数运作的基本</h3><h4 id="-strings-">数据：字符串（Strings）</h4><pre><code class="language-javascript">sayHi = (name) =&gt; `Hi, ${name}!`;
result = sayHi('User');

console.log(result); // 'Hi, User!'
</code></pre><h4 id="-numbers-">数据：数字（Numbers）</h4><pre><code class="language-javascript">double = (x) =&gt; x * 2;
result = double(4);

console.log(result); // 8
</code></pre><h4 id="-booleans-">数据：布尔值（Booleans）</h4><pre><code class="language-javascript">getClearance = (allowed) =&gt; allowed ?  'Access granted' :  'Access denied';

result1 = getClearance(true);
result2 = getClearance(false);

console.log(result1); // 'Access granted'
console.log(result2); // 'Access denied'
</code></pre><h4 id="-objects-">数据：对象（Objects）</h4><pre><code class="language-javascript">getFirstName = (obj) =&gt; obj.firstName;

result = getFirstName({  
	firstName: 'Yazeed'
});

console.log(result); // 'Yazeed'
</code></pre><h4 id="-arrays-">数据：数组（Arrays）</h4><pre><code class="language-javascript">len = (array) =&gt; array.length;
result = len([1, 2, 3]);

console.log(result); // 3
</code></pre><p>在所有的主流语言中，以上这五种数据类型被称为 <a href="https://en.wikipedia.org/wiki/First-class_citizen">“头等对象”</a>。</p><p>为什么是“头等”呢？因为这五种数据类型既可以作为参数传递，又可以存储在变量或者数组中，还可以作为变量用于计算，是数据的基本形式。</p><h3 id="--2">函数也是数据</h3><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/4nuoQAsqNs7Ey8vt-bbSxPFGmJljCpf8JNEP" class="kg-image" alt="img" width="600" height="400" loading="lazy"></figure><h4 id="--3">函数作为参数</h4><pre><code class="language-javascript">isEven = (num) =&gt; num % 2 === 0;
result = [1, 2, 3, 4].filter(isEven);

console.log(result); // [2, 4]
</code></pre><p>请观察 <code>filter</code> 函数是如何使用 <code>isEven</code> 函数来判断要保留哪些内容的。这里的 <code>isEven</code> 是一个函数，作为参数传入了 <code>filter</code> 函数中。</p><p><code>filter</code> 函数每次在做判断的时候都会调用 <code>isEven</code> 函数，用 <code>isEven</code> 函数返回的布尔值来决定当前数值的去留。</p><h4 id="--4">函数作为返回值</h4><pre><code class="language-javascript">add = (x) =&gt; (y) =&gt; x + y;
</code></pre><p><code>add</code> 函数需要两个参数，但不需要它们俩同时传入，第一次传参传入 <code>x</code> 就会返还一个新函数，这个函数需要传入 <code>y</code> 参数。</p><p>能够这样操作的基础在于 JavaScript 语言允许函数本身作为返回值存在，就像函数可以返回字符串（strings）、数字（numbers）、布尔值（booleans）等，JS 函数还可以返回另一个函数。</p><p>当然，我们也可以使用“双重调用”的方式，一次性提供 <code>x</code> 和 <code>y</code> 两个参数：</p><pre><code class="language-javascript">result = add(10)(20);

console.log(result); // 30
</code></pre><p>或者分两次调用，先传参数 <code>x</code>，再传参数 <code>y</code>：</p><pre><code class="language-javascript">add10 = add(10);
result = add10(20);

console.log(result); // 30

</code></pre><p>在上面这个例子中， <code>add10</code> 函数是第一次调用 <code>add</code> 函数的返回值，可以尝试用 <code>console.log</code> 把结果打出来观察一下。</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/R6LO3CmJmNgKpKYZFy7Wf57Qvfo9hUL4TcBE" class="kg-image" alt="img" width="600" height="400" loading="lazy"></figure><p><code>add10</code> 函数会接收 <code>y</code> 参数，然后返回 <code>x + y</code> 值。一旦 <code>y</code> 值到位，函数会立马进行运算并返回结果。</p><figure class="kg-card kg-image-card"><img src="https://cdn-media-1.freecodecamp.org/images/S-ejanKAgKDdXAJOVOeVgYK5lbHK6eXeQvuR" class="kg-image" alt="img" width="600" height="400" loading="lazy"></figure><h3 id="--5">可重复利用性</h3><p>高阶函数的魅力在于它的可重复利用性，如果不是高阶函数，<code>map</code>、<code>filter</code>、<code>reduce</code> 等强大的数组函数就不可能存在。</p><p>假设我们有一组用户，如下所示，然后我们要对该数组进行操作。</p><pre><code class="language-javascript">users = [
  {
    name: 'Yazeed',
    age: 25
  },
  {
    name: 'Sam',
    age: 30
  },
  {
    name: 'Bill',
    age: 20
  }
];

</code></pre><h4 id="map-function map() { [native code] }1">Map</h4><p>没有高阶函数的话，我们必须回到 <code>for</code> 循环的怀抱才能实现 <code>map</code> 函数的操作。</p><pre><code class="language-javascript">getName = (user) =&gt; user.name;
usernames = [];

for (let i = 0; i &lt; users.length; i++) {
  const name = getName(users[i]);

  usernames.push(name);
}

console.log(usernames);
// ["Yazeed", "Sam", "Bill"]

</code></pre><p>用 <code>map</code> 函数就简单多啦！</p><pre><code class="language-javascript">usernames = users.map(getName);

console.log(usernames);
// ["Yazeed", "Sam", "Bill"]

</code></pre><h4 id="filter-function filter() { [native code] }1">Filter</h4><p>在没有高阶函数的情况下，必须要用 <code>for</code> 循环来实现 <code>filter</code> 函数的功能。</p><pre><code class="language-javascript">startsWithB = (string) =&gt; string.toLowerCase().startsWith('b');

namesStartingWithB = [];

for (let i = 0; i &lt; users.length; i++) {
  if (startsWithB(users[i].name)) {
    namesStartingWithB.push(users[i]);
  }
}

console.log(namesStartingWithB);
// [{ "name": "Bill", "age": 20 }]

</code></pre><p>用 <code>filter</code> 函数就简单多啦！</p><pre><code class="language-javascript">namesStartingWithB = users.filter((user) =&gt; startsWithB(user.name));

console.log(namesStartingWithB);
// [{ "name": "Bill", "age": 20 }]

</code></pre><h4 id="reduce-function reduce() { [native code] }1">Reduce</h4><p><code>reduce</code> 函数也是的……没有高阶函数的话，很多高端操作都是无法实现的！😁</p><pre><code class="language-javascript">total = 0;

for (let i = 0; i &lt; users.length; i++) {
  total += users[i].age;
}

console.log(total);
// 75

</code></pre><p>那这样是不是简单多啦？</p><pre><code class="language-javascript">totalAge = users.reduce((total, user) =&gt; user.age + total, 0);

console.log(totalAge);
// 75

</code></pre><h3 id="--6">总结</h3><ul><li>字符串（strings）、数字（numbers）、布尔值（booleans）、数组（arrays）、对象（objects）可以作为变量（variables）、数组（arrays）、属性（properties）或者方法（methods）存储起来。</li><li>JavaScript 语言中，函数也是像数据一样同等对待的。</li><li>因此函数可以作为另外一个函数的参数或者返回值使用，这样的做法叫<strong>高阶函数</strong>。</li><li><code>map</code>、<code>filter</code>、 <code>reduce</code> 等函数就是高阶函数的最佳代表，它们让数组的处理（改变、搜索、相加等）变得简单不少！</li></ul><p>如果你想和我继续交流，可以在<a href="https://twitter.com/yazeedBee">我的推特</a>找到我。下次见！</p><p>原文链接：<a href="https://www.freecodecamp.org/news/a-quick-intro-to-higher-order-functions-in-javascript-1a014f89c6b/" rel="nofollow">A quick intro to Higher-Order Functions in JavaScript</a>，作者：<a href="https://www.freecodecamp.org/news/author/yazeedb/">Yazeed Bzadough</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 谷歌 JavaScript 风格指南的13条精华规则 ]]>
                </title>
                <description>
                    <![CDATA[ 如果你还不熟悉 JavaScript 编写规则的话，谷歌发布了自己的 JS 编写风格指南 [https://google.github.io/styleguide/jsguide.html]，罗列出在他们看来最优雅的写法，以求写出的代码简单易读。 这份谷歌的风格指南并不提供硬性的要求，它不会教你如何写 JS，它只会针对如何写出连贯漂亮的 JS 提出风格方面的建议。JS 是很灵活的语言，允许很多编写风格的并存。 谷歌和爱彼邻 [https://github.com/airbnb/javascript]都有发布自己的 JS 风格指南，在目前同类指南中是最受瞩目的两份。如果你工作中涉及到大量的 JS 编写，我强烈建议你花点时间研究一下这两份指南。 我从谷歌的风格指南中提取了 13 点在我看来最有意思且最有实际意义的建议，罗列如下，仅供参考。 无论是行内争议较大的一些问题，比如，缩进是用制表符还是用空格，如何使用分号，还是比较细枝末节的方面，谷歌 JS 风格指南都给出了自己很明确的回应。毋庸置疑，这份指南大大改变我写 JS 的习惯。 针对每一点，我都会先大致总结一下规则，然后附上指南 ]]>
                </description>
                <link>https://www.freecodecamp.org/chinese/news/google-publishes-a-javascript-style-guide-here-are-some-key-lessons/</link>
                <guid isPermaLink="false">5d2d7745fbfdee429dc5ee82</guid>
                
                <dc:creator>
                    <![CDATA[ Jingru Zhang ]]>
                </dc:creator>
                <pubDate>Sun, 15 Mar 2020 07:20:00 +0000</pubDate>
                <media:content url="https://chinese.freecodecamp.org/news/content/images/2019/07/1_ouYvMzYuksK-IH1BPNKD0A.jpeg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p>如果你还不熟悉 JavaScript 编写规则的话，谷歌发布了自己的<a href="https://google.github.io/styleguide/jsguide.html"> JS 编写风格指南</a>，罗列出在他们看来最优雅的写法，以求写出的代码简单易读。</p><p>这份谷歌的风格指南并不提供硬性的要求，它不会教你如何写 JS，它只会针对如何写出连贯漂亮的 JS 提出风格方面的建议。JS 是很灵活的语言，允许很多编写风格的并存。</p><p>谷歌和<a href="https://github.com/airbnb/javascript">爱彼邻</a>都有发布自己的 JS 风格指南，在目前同类指南中是最受瞩目的两份。如果你工作中涉及到大量的 JS 编写，我强烈建议你花点时间研究一下这两份指南。</p><p>我从谷歌的风格指南中提取了 13 点在我看来最有意思且最有实际意义的建议，罗列如下，仅供参考。</p><p>无论是行内争议较大的一些问题，比如，缩进是用制表符还是用空格，如何使用分号，还是比较细枝末节的方面，谷歌 JS 风格指南都给出了自己很明确的回应。毋庸置疑，这份指南大大改变我写 JS 的习惯。</p><p>针对每一点，我都会先大致总结一下规则，然后附上指南的原文节选，来辅助对规则细节的理解。如果可能的话，我还会加上符合该条规则的代码范例来阐述，以及不合规的代码反例来加以对比。</p><h4 id="-">缩进用空格，不要用制表符</h4><p>除了行终止符，ASCII 水平空格字符（0x20）是源文件中出现过的唯一代表空白的字符，说明制表符<strong>不能</strong>用来缩进。</p><p>指南还推荐使用两个（不是四个）空格来完成缩进。</p><pre><code class="language-javascript">// bad
function foo() {
∙∙∙∙let name;
}

// bad
function bar() {
∙let name;
}

// good
function baz() {
∙∙let name;
}
</code></pre><h4 id="--1">必须用分号</h4><p>每个语句都要用分号来结尾，禁止依靠自动分号插入。</p><p>我是无法理解为什么有人要质疑分号结尾的必要性，但就像缩进是用制表符还是空格，要不要在语句结尾加上分号也变得越来越有争议性。在这份指南中，谷歌给出了非常明确的回应，即必须使用分号。</p><pre><code class="language-javascript">// bad
let luke = {}
let leia = {}
[luke, leia].forEach(jedi =&gt; jedi.father = 'vader')
// good
let luke = {};
let leia = {};
[luke, leia].forEach((jedi) =&gt; {
  jedi.father = 'vader';
});
</code></pre><h4 id="-es6-modules-">暂时还先别使用 ES6 的模块（modules）</h4><p>暂时还先别用 ES6 的模块（例如 &nbsp;<code>export</code> 和 <code>import</code> 命令），它们的语义还没完全确定下来。在 ES6 模块语义和用法完全确定下来后，我们会重新考量此条规则。</p><pre><code class="language-javascript">// 暂时先别这么写:
//------ lib.js ------
export function square(x) {
    return x * x;
}
export function diag(x, y) {
    return sqrt(square(x) + square(y));
}

//------ main.js ------
import { square, diag } from 'lib';
</code></pre><h4 id="--2">不鼓励（不禁止）水平对齐</h4><p>虽然水平对齐并没有被禁用，但一般来说，谷歌是<strong>不鼓励</strong>这种做法的。在代码中如果已经做过水平对齐处理，谷歌也不鼓励<em>保持</em>水平对齐的做法。</p><p>在代码中加入多余的空格，以和上下行的同类变量保持对齐的做法就是所说的"水平对齐“。</p><pre><code class="language-javascript">// bad
{
  tiny:   42,  
  longer: 435, 
};
// good
{
  tiny: 42, 
  longer: 435,
};
</code></pre><h4 id="-var-">别再用 <code>var</code> 了</h4><p>所有的本地变量都应该使用 <code>const</code> 或者 <code>let</code> 来引出声明。除非该变量需要被重新赋值，不然都默认用 <code>const</code> 来声明。禁止再使用 <code>var</code>。</p><p>在 StackOverflow 和其他地方，我还是会看到 <code>var</code> 出现在各种代码范例中，不知道是因为积习太难改，还是因为有人坚持认为 <code>var</code> 还有存在的理由……</p><pre><code class="language-javascript">// bad
var example = 42;
// good
let example = 42;
</code></pre><h4 id="--3">箭头函数是首选</h4><p>箭头函数的句法更简洁，也解决了 <code>this</code> 关键词使用中的一些老大难问题。特别是在写嵌套函数的时候，箭头函数的优势相较传统的 <code>function</code> 表达式更突出，是首选。</p><p>我个人更喜欢箭头函数只是因为觉得它更简洁、更美观，碰巧写箭头函数确实能解决一些重要的实际问题。</p><pre><code class="language-javascript">// bad
[1, 2, 3].map(function (x) {
  const y = x + 1;
  return x * y;
});

// good
[1, 2, 3].map((x) =&gt; {
  const y = x + 1;
  return x * y;
});
</code></pre><h4 id="--4">使用模版字符串，而不要将普通字符串叠加</h4><p>在处理复杂的字符串叠加，尤其是多行字符串的叠加时，模版字符串（使用反引号`来界定）是更优的选择，可以实现跨多行的效果。</p><pre><code class="language-javascript">// bad
function sayHi(name) {
  return 'How are you, ' + name + '?';
}

// bad
function sayHi(name) {
  return ['How are you, ', name, '?'].join();
}

// bad
function sayHi(name) {
  return `How are you, ${ name }?`;
}

// good
function sayHi(name) {
  return `How are you, ${name}?`;
}
</code></pre><h4 id="--5"><strong>长字符串不要使用反斜杠来分隔每行</strong></h4><p>请不要在基本字符串或者模版字符串的每行后用反斜杠（/）表示结尾，虽然 ES5 不会对这样的操作报错，但这样做会让你在排查错误的时候很头疼，因为斜杠后的多余空格会报错，而且很难看出。</p><p>爱彼邻（Airbnb）和谷歌在这一点上的推荐做法是有分歧的（详情参见<a href="https://github.com/airbnb/javascript#strings--line-length">爱彼邻的文档</a>）。</p><p>谷歌建议用 <code>+</code> 运算符将多行字符串相连（如下所示），爱彼邻建议什么都不做，让长字符串自由覆盖。</p><pre><code class="language-javascript">// bad (sorry, this doesn't show up well on mobile)
const longString = 'This is a very long string that \
    far exceeds the 80 column limit. It unfortunately \
    contains long stretches of spaces due to how the \
    continued lines are indented.';
// good
const longString = 'This is a very long string that ' + 
    'far exceeds the 80 column limit. It does not contain ' + 
    'long stretches of spaces since the concatenated ' +
    'strings are cleaner.';
</code></pre><h4 id="-for-of-for-"><code>“for… of”</code> 是写 <code>for</code> 循环的首选方式</h4><p>在 ES6 体系下，JS 支持三种写 <code>for</code> 循环的方式，但 <code>for</code>-<code>of</code> 是最优选。</p><p>其实我也觉得这条规则有点奇怪，但是我还是选择把它纳入，因为考虑到谷歌会明确规定写 <code>for</code> 循环的最优方式，还是很有看头的。</p><p>我个人觉得，<code>for…in</code> 更适合对象的循环，<code>for…of</code> 更适合数组的循环，要视情况而定。</p><p>谷歌的建议也不一定和我的想法相悖，但针对这个问题谷歌有明确的表态，让我觉得有必要列出来思考一下。</p><h4 id="-eval-">别使用<code>eval()</code></h4><p>除了在代码加载器中，平时不要使用 <code>eval</code>，也不要使用 <code>Function(...string)</code> 构造函数，这些特性都是有潜在的危险的，而且在 CSP 环境中根本不起作用。</p><p><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval">MDN上的 <code>eval()</code> 页</a> 有一个章节的标题就是“避免使用 <code>eval</code> !"。</p><pre><code class="language-javascript">// bad
let obj = { a: 20, b: 30 };
let propName = getPropName();  // returns "a" or "b"
eval( 'var result = obj.' + propName );
// good
let obj = { a: 20, b: 30 };
let propName = getPropName();  // returns "a" or "b"
let result = obj[ propName ];  //  obj[ "a" ] is the same as obj.a
</code></pre><h4 id="--6">常量命名应该全大写，并且用下划线分隔单词</h4><p>常量应该遵循 <code>CONSTANT_CASE</code> 命名规则：全大写，单词用下划线分割。</p><p>如果你确定一个变量的值不会发生改变，你应该用常量的命名规则来命名该变量，让你在浏览代码的时候更直观。</p><p>如果该常量仅定义并作用在某个函数内，那么这个常量的命名应该遵守 camelCase 规则，而不该全大写。</p><pre><code class="language-javascript">// bad
const number = 5;
// good
const NUMBER = 5;
</code></pre><h4 id="--7">每次只声明一个变量</h4><p>每个声明语句里只包含一个变量，像 <code>let a = 1, b = 2;</code> 这样的写法是不合规、不推荐的。</p><pre><code class="language-javascript">// bad
let a = 1, b = 2, c = 3;
// good
let a = 1;
let b = 2;
let c = 3;
</code></pre><h4 id="--8">用单引号，不用双引号</h4><p>普通字符串文字，用单引号 （<code>'</code>）而不是双引号（<code>"</code>）来标记字符串的结尾 。</p><p>小贴士：如果字符串中含有单引号，用模版字符串来避免单引号转义失效的情况。</p><pre><code class="language-javascript">// bad
let directive = "No identification of self or mission."
// bad
let saying = 'Say it ain\u0027t so.';
// good
let directive = 'No identification of self or mission.';
// good
let saying = `Say it ain't so`;
</code></pre><h4 id="--9">写在最后</h4><p>这 13 点规则并不是所谓的的金规玉律，我在文章开头说过的，这里再强调一下。谷歌是科技巨擘之一，这些推荐处理方法只是他们的一家之言。</p><p>虽说如此，这一家之言是很有分量的，谷歌雇用了大量的顶尖工程师，资质深厚的他们写过大量的优质代码，他们的建议值得一看。</p><p>如果你想写出符合谷歌源文件级别标准的代码，你可以完全遵循谷歌这套风格指南中的所有规则。如果你对其中的个别规则或者所有规则有异议——很多人都有异议——那你大可不必理会这些建议。</p><p>我个人觉得在很多写法问题的建议处理上，爱彼邻的版本会比谷歌更合理一些。但万变不离其宗，无论你个人认为怎么样写才是优雅简洁的，在写代码的时候还是要遵循一定的规则，尽量做到前后风格一致。</p><p>原文链接：<a href="https://medium.freecodecamp.org/google-publishes-a-javascript-style-guide-here-are-some-key-lessons-1810b8ad050b">https://medium.freecodecamp.org/google-publishes-a-javascript-style-guide-here-are-some-key-lessons-1810b8ad050b</a>，作者：Daniel Simmons</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
