<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>云淡风轻</title>
  
  <subtitle>一个安静的角落</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://ioliu.cn/"/>
  <updated>2026-04-01T11:17:24.570Z</updated>
  <id>https://ioliu.cn/</id>
  
  <author>
    <name>云淡风轻</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>在Debian 11上升级内核并启用BBR加速</title>
    <link href="https://ioliu.cn/2024/upgrade-debian-kernel-version/"/>
    <id>https://ioliu.cn/2024/upgrade-debian-kernel-version/</id>
    <published>2024-03-23T14:53:34.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p>如果你正在使用Debian 11并且希望提升你的系统性能，升级到最新的内核版本并启用BBR加速可能是一个不错的选择。以下是一篇指南，将带你了解如何安全地升级内核以及如何启用BBR来优化你的网络连接。</p><h2 id="升级到新版内核"><a href="#升级到新版内核" class="headerlink" title="升级到新版内核"></a>升级到新版内核</h2><h3 id="第一步：备份你的系统"><a href="#第一步：备份你的系统" class="headerlink" title="第一步：备份你的系统"></a>第一步：备份你的系统</h3><p>在进行任何重大系统更改之前，备份是非常重要的。你可以使用如<a href="https://github.com/linuxmint/timeshift">Timeshift</a>等工具来备份你的系统。</p><h3 id="第二步：修改软件源"><a href="#第二步：修改软件源" class="headerlink" title="第二步：修改软件源"></a>第二步：修改软件源</h3><p>为了安装最新的内核，我们可能需要添加Debian的Backports源。以下是添加Backports源的步骤：</p><ol><li><p>打开<code>/etc/apt/sources.list</code>文件：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> nano /etc/apt/sources.list</span><br></pre></td></tr></table></figure></li><li><p>在文件末尾添加以下行：</p> <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">deb http://deb.debian.org/debian bullseye-backports main contrib non-free</span><br><span class="line">deb-src http://deb.debian.org/debian bullseye-backports main contrib non-free</span><br></pre></td></tr></table></figure></li><li><p>保存并退出编辑器。</p></li><li><p>更新软件包列表：</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt update</span><br></pre></td></tr></table></figure></li></ol><h3 id="第三步：安装新内核"><a href="#第三步：安装新内核" class="headerlink" title="第三步：安装新内核"></a>第三步：安装新内核</h3><p>使用Backports源安装新内核：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get -t bullseye-backports install linux-image-6.x.x-x-amd64</span><br><span class="line"><span class="built_in">sudo</span> apt-get -t bullseye-backports install linux-headers-6.x.x-x-amd64</span><br></pre></td></tr></table></figure><p>请确保替换命令中的版本号为你想要安装的实际版本。</p><h3 id="第四步：更新GRUB并重启"><a href="#第四步：更新GRUB并重启" class="headerlink" title="第四步：更新GRUB并重启"></a>第四步：更新GRUB并重启</h3><p>安装完新内核后，更新GRUB：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> update-grub</span><br></pre></td></tr></table></figure><p>然后重启你的系统：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> reboot</span><br></pre></td></tr></table></figure><h2 id="清除旧内核"><a href="#清除旧内核" class="headerlink" title="清除旧内核"></a>清除旧内核</h2><h3 id="第一步：列出当前内核"><a href="#第一步：列出当前内核" class="headerlink" title="第一步：列出当前内核"></a>第一步：列出当前内核</h3><p>使用以下命令查看当前安装的内核：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">dpkg --list | grep linux-image</span><br><span class="line">dpkg --list | grep linux-headers</span><br></pre></td></tr></table></figure><h3 id="第二步：删除旧内核"><a href="#第二步：删除旧内核" class="headerlink" title="第二步：删除旧内核"></a>第二步：删除旧内核</h3><p>选择你不再需要的内核版本，并使用<code>apt-get purge</code>命令进行删除：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get purge linux-image-5.x.x-x-amd64</span><br><span class="line"><span class="built_in">sudo</span> apt-get purge linux-headers-5.x.x-x-amd64</span><br></pre></td></tr></table></figure><h3 id="第三步：更新GRUB"><a href="#第三步：更新GRUB" class="headerlink" title="第三步：更新GRUB"></a>第三步：更新GRUB</h3><p>再次更新GRUB配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> update-grub</span><br></pre></td></tr></table></figure><h2 id="启用BBR加速"><a href="#启用BBR加速" class="headerlink" title="启用BBR加速"></a>启用BBR加速</h2><h3 id="第一步：加载TCP-BBR模块"><a href="#第一步：加载TCP-BBR模块" class="headerlink" title="第一步：加载TCP BBR模块"></a>第一步：加载TCP BBR模块</h3><p>编辑<code>/etc/sysctl.conf</code>文件，在文件末尾添加以下两行：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">net.core.default_qdisc=fq</span><br><span class="line">net.ipv4.tcp_congestion_control=bbr</span><br></pre></td></tr></table></figure><h3 id="第二步：应用新的系统配置"><a href="#第二步：应用新的系统配置" class="headerlink" title="第二步：应用新的系统配置"></a>第二步：应用新的系统配置</h3><p>应用新的配置：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> sysctl -p</span><br></pre></td></tr></table></figure><h3 id="第三步：验证BBR是否启用"><a href="#第三步：验证BBR是否启用" class="headerlink" title="第三步：验证BBR是否启用"></a>第三步：验证BBR是否启用</h3><p>运行以下命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">sysctl net.ipv4.tcp_congestion_control</span><br></pre></td></tr></table></figure><p>如果输出显示<code>bbr</code>，则BBR已启用。</p><h2 id="结语"><a href="#结语" class="headerlink" title="结语"></a>结语</h2><p>现在，你的Debian 11系统应该运行在最新的内核上，并且已经启用了BBR加速。这将帮助你提高系统的整体性能和网络连接的速度。请确保在执行以上操作时仔细检查，并始终保持系统的备份。</p><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h2><ul><li><a href="https://backports.debian.org/Instructions/">Debian Backports Instructions</a></li><li><a href="https://github.com/linuxmint/timeshift">Timeshift on GitHub</a></li><li><a href="https://research.google/pubs/pub45646/">Google BBR Congestion Control Algorithm</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;如果你正在使用Debian 11并且希望提升你的系统性能，升级到最新的内核版本并启用BBR加速可能是一个不错的选择。以下是一篇指南，将带你了解如何安全地升级内核以及如何启用BBR来优化你的网络连接。&lt;/p&gt;
&lt;h2 id=&quot;升级到新版内核&quot;&gt;&lt;a href=&quot;#升级到新版内
      
    
    </summary>
    
    
      <category term="学习笔记" scheme="https://ioliu.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="bbr" scheme="https://ioliu.cn/tags/bbr/"/>
    
      <category term="linux" scheme="https://ioliu.cn/tags/linux/"/>
    
  </entry>
  
  <entry>
    <title>Git中的一些骚操作</title>
    <link href="https://ioliu.cn/2017/git-command-backup/"/>
    <id>https://ioliu.cn/2017/git-command-backup/</id>
    <published>2017-11-10T06:30:25.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p>最近因为<a href="https://valine.js.org/">Valine</a>，所以经常用到<code>Git</code>。当然，工作中也有用到，但基本上是用的<code>图形化</code>。</p><p>这里最<code>Git</code>的相关操作命令做个备份，以备不时之需。</p><blockquote><p>可能不定时更新。</p></blockquote><h1 id="配置自动换行"><a href="#配置自动换行" class="headerlink" title="配置自动换行"></a>配置自动换行</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git config --global core.autocrlf input <span class="comment"># 提交时自动将换行符转成lf</span></span><br></pre></td></tr></table></figure><h1 id="多账号配置SSH"><a href="#多账号配置SSH" class="headerlink" title="多账号配置SSH"></a>多账号配置SSH</h1><p>修改<code>~/.ssh/config</code>文件(Windows平台)</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 配置 Github.com</span></span><br><span class="line">Host github.com</span><br><span class="line">     HostName github.com</span><br><span class="line">     IdentityFile C:\\path\\to\\.ssh\\id_rsa_github</span><br><span class="line">     PreferredAuthentications publickey</span><br><span class="line">     User YourName</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置 Coding.net</span></span><br><span class="line">Host git.coding.net</span><br><span class="line">     HostName git.coding.net</span><br><span class="line">     IdentityFile C:\\path\\to\\.ssh\\id_rsa_coding</span><br><span class="line">     PreferredAuthentications publickey</span><br><span class="line">     User YourName</span><br><span class="line"></span><br><span class="line"><span class="comment"># 配置 Gitee.com</span></span><br><span class="line">Host gitee.com</span><br><span class="line">     HostName gitee.com</span><br><span class="line">     IdentityFile C:\\path\\to\\.ssh\\id_rsa_gitee</span><br><span class="line">     PreferredAuthentications publickey</span><br><span class="line">     User YourName</span><br></pre></td></tr></table></figure><h1 id="pull-强制覆盖本地文件"><a href="#pull-强制覆盖本地文件" class="headerlink" title="pull 强制覆盖本地文件"></a>pull 强制覆盖本地文件</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git fetch --all  </span><br><span class="line">git reset --hard origin/master </span><br></pre></td></tr></table></figure><h1 id="push-强制覆盖远程文件"><a href="#push-强制覆盖远程文件" class="headerlink" title="push 强制覆盖远程文件"></a>push 强制覆盖远程文件</h1><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push -f origin master </span><br></pre></td></tr></table></figure><h1 id="保持fork之后的项目和上游同步"><a href="#保持fork之后的项目和上游同步" class="headerlink" title="保持fork之后的项目和上游同步"></a>保持fork之后的项目和上游同步</h1><p>团队协作，为了规范，一般都是fork组织的仓库到自己帐号下，再提交pr，组织的仓库一直保持更新，下面介绍如何保持自己fork之后的仓库与上游仓库同步。</p><p>下面以我 fork 团队的博客仓库为例</p><p>点击 fork 组织仓库到自己帐号下，然后就可以在自己的帐号下 clone 相应的仓库</p><p>使用 <code>git remote -v</code> 查看当前的远程仓库地址，输出如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">origin  git@github.com:ibrother/staticblog.github.io.git (fetch)</span><br><span class="line">origin  git@github.com:ibrother/staticblog.github.io.git (push)</span><br></pre></td></tr></table></figure><p>可以看到从自己帐号 clone 下来的仓库，远程仓库地址是与自己的远程仓库绑定的（这不是废话吗）</p><p>接下来运行: </p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git remote add upstream https://github.com/staticblog/staticblog.github.io.git</span><br></pre></td></tr></table></figure><p>这条命令就算添加一个别名为 upstream（上游）的地址，指向之前 fork 的原仓库地址。<code>git remote -v</code> 输出如下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">origin  git@github.com:ibrother/staticblog.github.io.git (fetch)</span><br><span class="line">origin  git@github.com:ibrother/staticblog.github.io.git (push)</span><br><span class="line">upstream        https://github.com/staticblog/staticblog.github.io.git (fetch)</span><br><span class="line">upstream        https://github.com/staticblog/staticblog.github.io.git (push)</span><br></pre></td></tr></table></figure><p>之后运行下面几条命令，就可以保持本地仓库和上游仓库同步了</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git fetch upstream</span><br><span class="line">git checkout master</span><br><span class="line">git merge upstream/master</span><br></pre></td></tr></table></figure><p>接着就是熟悉的推送本地仓库到远程仓库</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin master</span><br></pre></td></tr></table></figure><blockquote><p>From <a href="https://github.com/staticblog/wiki/wiki/%E4%BF%9D%E6%8C%81fork%E4%B9%8B%E5%90%8E%E7%9A%84%E9%A1%B9%E7%9B%AE%E5%92%8C%E4%B8%8A%E6%B8%B8%E5%90%8C%E6%AD%A5">staticblog</a> .</p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;最近因为&lt;a href=&quot;https://valine.js.org/&quot;&gt;Valine&lt;/a&gt;，所以经常用到&lt;code&gt;Git&lt;/code&gt;。当然，工作中也有用到，但基本上是用的&lt;code&gt;图形化&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里最&lt;code&gt;Git&lt;/code&gt;的相关操
      
    
    </summary>
    
    
      <category term="学习笔记" scheme="https://ioliu.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="Git" scheme="https://ioliu.cn/tags/Git/"/>
    
      <category term="Command" scheme="https://ioliu.cn/tags/Command/"/>
    
  </entry>
  
  <entry>
    <title>Valine -- 一款极简的评论系统</title>
    <link href="https://ioliu.cn/2017/add-valine-comments-to-your-blog/"/>
    <id>https://ioliu.cn/2017/add-valine-comments-to-your-blog/</id>
    <published>2017-08-07T06:30:25.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://img2.imgtp.com/2024/03/23/WLqYOfWP.png" alt="Valine"></p><blockquote><p><a href="https://valine.js.org/">Valine</a> - 一款极简的<code>无后端</code>评论系统.</p></blockquote><p>2017年6月1日，在你等超龄儿童欢度节日的时候，多说躺下了。<br>2017年8月1日，不甘寂寞的网易云跟帖也跟多说随风而去了。</p><p>2017年8月7日，一款基于<code>Leancloud</code>的极简风评论系统诞生：<a href="https://valine.js.org/">Valine</a>。</p><h1 id="食用方法"><a href="#食用方法" class="headerlink" title="食用方法"></a>食用方法</h1><h2 id="获取-APP-ID-和-APP-KEY"><a href="#获取-APP-ID-和-APP-KEY" class="headerlink" title="获取 APP ID 和 APP KEY"></a>获取 <code>APP ID</code> 和 <code>APP KEY</code></h2><ol><li><a href="https://leancloud.cn/dashboard/login.html#/signup">点击这里登录或注册<code>Leancloud</code></a></li><li><a href="https://leancloud.cn/dashboard/applist.html#/newapp">点这里创建应用</a>，应用名看个人喜好。</li><li>选择刚刚创建的<code>应用</code>&gt;<code>设置</code>&gt;选择<code>应用 Key</code>，然后你就能看到你的<code>APP ID</code>和<code>APP KEY</code>了，参考下图：<br> <img src="https://img2.imgtp.com/2024/03/23/Wco7Z5H2.png"></li><li>为了您的数据安全，请填写<code>应用</code>&gt;<code>设置</code>&gt;<code>安全设置</code>中的<code>Web 安全域名</code>，如下图：<br> <img src="https://img2.imgtp.com/2024/03/23/E8Q9R7K9.png"></li></ol><h2 id="页面中的设置"><a href="#页面中的设置" class="headerlink" title="页面中的设置"></a>页面中的设置</h2><p>页面中的食用方法炒鸡简单，来来来，我们用代码说话：</p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Valine - A simple comment system based on Leancloud.<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--Leancloud 操作库:--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;//cdn1.lncld.net/static/js/3.0.4/av-min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--Valine 的核心代码库:--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span> <span class="attr">src</span>=<span class="string">&quot;./dist/Valine.min.js&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;comment&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">script</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">        <span class="keyword">new</span> <span class="title class_">Valine</span>(&#123;</span></span><br><span class="line"><span class="language-javascript">            <span class="comment">// AV 对象来自上面引入av-min.js(老司机们不要开车➳♡゛扎心了老铁)</span></span></span><br><span class="line"><span class="language-javascript">            <span class="attr">av</span>: <span class="variable constant_">AV</span>, </span></span><br><span class="line"><span class="language-javascript">            <span class="attr">el</span>: <span class="string">&#x27;.comment&#x27;</span>, <span class="comment">// </span></span></span><br><span class="line"><span class="language-javascript">            <span class="attr">app_id</span>: <span class="string">&#x27;Your APP ID&#x27;</span>, <span class="comment">// 这里填写上面得到的APP ID</span></span></span><br><span class="line"><span class="language-javascript">            <span class="attr">app_key</span>: <span class="string">&#x27;Your APP KEY&#x27;</span>, <span class="comment">// 这里填写上面得到的APP KEY</span></span></span><br><span class="line"><span class="language-javascript">            <span class="attr">placeholder</span>: <span class="string">&#x27;ヾﾉ≧∀≦)o来啊，快活啊!&#x27;</span> <span class="comment">// [v1.0.7 new]留言框占位提示文字</span></span></span><br><span class="line"><span class="language-javascript">        &#125;);</span></span><br><span class="line"><span class="language-javascript">    </span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p>看吧，我是不是没说大话(<code>_(:з」∠)_一本正经的胡说八道</code>)。</p><h1 id="评论数据管理"><a href="#评论数据管理" class="headerlink" title="评论数据管理"></a>评论数据管理</h1><p>插播一下，关于评论数据管理，请自行登录<code>Leancloud</code>应用管理。<br>具体步骤：<code>登录</code>&gt;选择你创建的<code>应用</code>&gt;<code>存储</code>&gt;选择Class<code>Comment</code>，然后就可以尽情的发挥你的权利啦(～￣▽￣)～<br><img src="https://img2.imgtp.com/2024/03/23/50Kg2g5x.png"></p><hr><blockquote><p>更多配置信息请移步：<a href="https://valine.js.org/">https://valine.js.org</a></p></blockquote><hr><p>–EOF–</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;img src=&quot;https://img2.imgtp.com/2024/03/23/WLqYOfWP.png&quot; alt=&quot;Valine&quot;&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://valine.js.org/&quot;&gt;Valine&lt;/a&gt; -
      
    
    </summary>
    
    
      <category term="学习笔记" scheme="https://ioliu.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="Valine" scheme="https://ioliu.cn/tags/Valine/"/>
    
      <category term="Comment System" scheme="https://ioliu.cn/tags/Comment-System/"/>
    
      <category term="评论系统" scheme="https://ioliu.cn/tags/%E8%AF%84%E8%AE%BA%E7%B3%BB%E7%BB%9F/"/>
    
  </entry>
  
  <entry>
    <title>不同的国家/地区与语言缩写代码</title>
    <link href="https://ioliu.cn/2017/country-city-and-language/"/>
    <id>https://ioliu.cn/2017/country-city-and-language/</id>
    <published>2017-06-29T07:30:08.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<table><thead><tr><th>国家&#x2F;地区</th><th align="center">语言代码</th><th>国家地区</th><th align="center">语言代码</th></tr></thead><tbody><tr><td>简体中文(中国)</td><td align="center">zh-cn</td><td>简体中文(台湾地区)</td><td align="center">zh-tw</td></tr><tr><td>繁体中文(香港)</td><td align="center">zh-hk</td><td>英语(香港)</td><td align="center">en-hk</td></tr><tr><td>英语(美国)</td><td align="center">en-us</td><td>英语(英国)</td><td align="center">en-gb</td></tr><tr><td>英语(全球)</td><td align="center">en-ww</td><td>英语(加拿大)</td><td align="center">en-ca</td></tr><tr><td>英语(澳大利亚)</td><td align="center">en-au</td><td>英语(爱尔兰)</td><td align="center">en-ie</td></tr><tr><td>英语(芬兰)</td><td align="center">en-fi</td><td>芬兰语(芬兰)</td><td align="center">fi-fi</td></tr><tr><td>英语(丹麦)</td><td align="center">en-dk</td><td>丹麦语(丹麦)</td><td align="center">da-dk</td></tr><tr><td>英语(以色列)</td><td align="center">en-il</td><td>希伯来语(以色列)</td><td align="center">he-il</td></tr><tr><td>英语(南非)</td><td align="center">en-za</td><td>英语(印度)</td><td align="center">en-in</td></tr><tr><td>英语(挪威)</td><td align="center">en-no</td><td>英语(新加坡)</td><td align="center">en-sg</td></tr><tr><td>英语(新西兰)</td><td align="center">en-nz</td><td>英语(印度尼西亚)</td><td align="center">en-id</td></tr><tr><td>英语(菲律宾)</td><td align="center">en-ph</td><td>英语(泰国)</td><td align="center">en-th</td></tr><tr><td>英语(马来西亚)</td><td align="center">en-my</td><td>英语(阿拉伯)</td><td align="center">en-xa</td></tr><tr><td>韩文(韩国)</td><td align="center">ko-kr</td><td>日语(日本)</td><td align="center">ja-jp</td></tr><tr><td>荷兰语(荷兰)</td><td align="center">nl-nl</td><td>荷兰语(比利时)</td><td align="center">nl-be</td></tr><tr><td>葡萄牙语(葡萄牙)</td><td align="center">pt-pt</td><td>葡萄牙语(巴西)</td><td align="center">pt-br</td></tr><tr><td>法语(法国)</td><td align="center">fr-fr</td><td>法语(卢森堡)</td><td align="center">fr-lu</td></tr><tr><td>法语(瑞士)</td><td align="center">fr-ch</td><td>法语(比利时)</td><td align="center">fr-be</td></tr><tr><td>法语(加拿大)</td><td align="center">fr-ca</td><td>西班牙语(拉丁美洲)</td><td align="center">es-la</td></tr><tr><td>西班牙语(西班牙)</td><td align="center">es-es</td><td>西班牙语(阿根廷)</td><td align="center">es-ar</td></tr><tr><td>西班牙语(美国)</td><td align="center">es-us</td><td>西班牙语(墨西哥)</td><td align="center">es-mx</td></tr><tr><td>西班牙语(哥伦比亚)</td><td align="center">es-co</td><td>西班牙语(波多黎各)</td><td align="center">es-pr</td></tr><tr><td>德语(德国)</td><td align="center">de-de</td><td>德语(奥地利)</td><td align="center">de-at</td></tr><tr><td>德语(瑞士)</td><td align="center">de-ch</td><td>俄语(俄罗斯)</td><td align="center">ru-ru</td></tr><tr><td>意大利语(意大利)</td><td align="center">it-it</td><td>希腊语(希腊)</td><td align="center">el-gr</td></tr><tr><td>挪威语(挪威)</td><td align="center">no-no</td><td>匈牙利语(匈牙利)</td><td align="center">hu-hu</td></tr><tr><td>土耳其语(土耳其)</td><td align="center">tr-tr</td><td>捷克语(捷克共和国)</td><td align="center">cs-cz</td></tr><tr><td>斯洛文尼亚语</td><td align="center">sl-sl</td><td>波兰语(波兰)</td><td align="center">pl-pl</td></tr><tr><td>瑞典语(瑞典)</td><td align="center">sv-se</td><td>西班牙语 (智利)</td><td align="center">es-cl</td></tr></tbody></table>]]></content>
    
    <summary type="html">
    
      
      
        &lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;国家&amp;#x2F;地区&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;语言代码&lt;/th&gt;
&lt;th&gt;国家地区&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;语言代码&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;

      
    
    </summary>
    
    
      <category term="其他" scheme="https://ioliu.cn/categories/%E5%85%B6%E4%BB%96/"/>
    
    
      <category term="国家/地区" scheme="https://ioliu.cn/tags/%E5%9B%BD%E5%AE%B6-%E5%9C%B0%E5%8C%BA/"/>
    
      <category term="语言缩写" scheme="https://ioliu.cn/tags/%E8%AF%AD%E8%A8%80%E7%BC%A9%E5%86%99/"/>
    
  </entry>
  
  <entry>
    <title>从删库到跑路 -- MySql 不算初体验的初体验</title>
    <link href="https://ioliu.cn/2017/mysql-tutorial/"/>
    <id>https://ioliu.cn/2017/mysql-tutorial/</id>
    <published>2017-03-24T03:00:25.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://img2.imgtp.com/2024/03/23/JvTStp0N.gif"></p><p>最近准备找时间把<a href="http://bing.ioliu.cn/">bing壁纸</a>项目重构，但由于虚拟主机快要过期了，所以目前的首要任务是将数据库从<a href="/go/aliyun">阿里云</a>的虚拟主机转移到我自己的服务器上。</p><p>因为多年前学过SQLServer、Oracle、MySql等数据库，但许久未用，技艺生疏，所以这里是不算初体验的初体验。</p><p>本文将执行三步走计划：</p><ul><li>安装</li><li>登录</li><li>使用</li></ul><h1 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h1><p>在Debian上安装MySql很简单，运行如下命令就基本OK：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ apt-get install mysql-server mysql-client</span><br></pre></td></tr></table></figure><p>其中mysql-server是服务器程序，mysql-client是客户端程序。安装过程中会有如下提示，需要设置mysql数据库密码；输入要设置的密码后，回车即可继续安装。<br><img src="https://img2.imgtp.com/2024/03/23/Xt3HtrJ1.png"></p><blockquote><p>如果出现<code>Unable to locate package mysql-server</code>等错误，请先执行<code>apt-get update</code>后重试。</p></blockquote><h1 id="登录"><a href="#登录" class="headerlink" title="登录"></a>登录</h1><p>安装成功后，mysql会自动启动，可以通过<code>ps -ef | grep mysql</code>查看mysql是否运行。<br>登陆mysql:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># login</span></span><br><span class="line">$ mysql -u root -p</span><br><span class="line">Enter password: <span class="comment"># 输入密码</span></span><br></pre></td></tr></table></figure><p>其中-u后跟的是用户名，-p要求输入密码，回车后在输入密码处输入密码。</p><p>查看数据库<code>show databases;</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">$ mysql&gt; show databases;</span><br><span class="line">+--------------------+</span><br><span class="line">| Database           |</span><br><span class="line">+--------------------+</span><br><span class="line">| information_schema |</span><br><span class="line">| mysql              |</span><br><span class="line">| performance_schema |</span><br><span class="line">| sys                |</span><br><span class="line">+--------------------+</span><br><span class="line">4 rows in set (0.00 sec)</span><br></pre></td></tr></table></figure><h1 id="使用"><a href="#使用" class="headerlink" title="使用"></a>使用</h1><h2 id="创建数据库"><a href="#创建数据库" class="headerlink" title="创建数据库"></a>创建数据库</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ mysql&gt; create database DB_name;</span><br><span class="line">Query OK, 1 row affected (0.05 sec)</span><br></pre></td></tr></table></figure><h2 id="查看刚刚创建的数据库"><a href="#查看刚刚创建的数据库" class="headerlink" title="查看刚刚创建的数据库"></a>查看刚刚创建的数据库</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">$ mysql&gt; show databases;</span><br><span class="line">+--------------------+</span><br><span class="line">| Database           |</span><br><span class="line">+--------------------+</span><br><span class="line">| information_schema |</span><br><span class="line">| DB_name            |</span><br><span class="line">| mysql              |</span><br><span class="line">| performance_schema |</span><br><span class="line">| sys                |</span><br><span class="line">+--------------------+</span><br><span class="line">5 rows <span class="keyword">in</span> <span class="built_in">set</span> (0.00 sec)</span><br></pre></td></tr></table></figure><h2 id="使用刚刚创建的数据库"><a href="#使用刚刚创建的数据库" class="headerlink" title="使用刚刚创建的数据库"></a>使用刚刚创建的数据库</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ mysql&gt; use DB_name;</span><br><span class="line">Database changed</span><br></pre></td></tr></table></figure><h2 id="创建表"><a href="#创建表" class="headerlink" title="创建表"></a>创建表</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ mysql&gt; CREATE TABLE IF NOT EXISTS person (</span><br><span class="line">        number INT(11),</span><br><span class="line">        name VARCHAR(255),</span><br><span class="line">        birthday DATE</span><br><span class="line">    );</span><br></pre></td></tr></table></figure><h2 id="查看表"><a href="#查看表" class="headerlink" title="查看表"></a>查看表</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">$ mysql&gt; SHOW CREATE table person;</span><br><span class="line"></span><br><span class="line">CREATE TABLE `person` (</span><br><span class="line">  `number` int(11) DEFAULT NULL,</span><br><span class="line">  `name` varchar(255) DEFAULT NULL,</span><br><span class="line">  `birthday` <span class="built_in">date</span> DEFAULT NULL</span><br><span class="line">) ENGINE=MyISAM DEFAULT CHARSET=utf8;</span><br></pre></td></tr></table></figure><h2 id="查看表的所有列"><a href="#查看表的所有列" class="headerlink" title="查看表的所有列"></a>查看表的所有列</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">$ mysql&gt; SHOW FULL COLUMNS from person;</span><br><span class="line">+----------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+</span><br><span class="line">| Field    | Type         | Collation       | Null | Key | Default | Extra | Privileges                      | Comment |</span><br><span class="line">+----------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+</span><br><span class="line">| number   | int(11)      | NULL            | YES  |     | NULL    |       | <span class="keyword">select</span>,insert,update,references |         |</span><br><span class="line">| name     | varchar(255) | utf8_general_ci | YES  |     | NULL    |       | <span class="keyword">select</span>,insert,update,references |         |</span><br><span class="line">| birthday | <span class="built_in">date</span>         | NULL            | YES  |     | NULL    |       | <span class="keyword">select</span>,insert,update,references |         |</span><br><span class="line">+----------+--------------+-----------------+------+-----+---------+-------+---------------------------------+---------+</span><br></pre></td></tr></table></figure><h2 id="创建临时表"><a href="#创建临时表" class="headerlink" title="创建临时表"></a>创建临时表</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ mysql&gt; CREATE TEMPORARY TABLE temp_person (</span><br><span class="line">        number INT(11),</span><br><span class="line">        name VARCHAR(255),</span><br><span class="line">        birthday DATE</span><br><span class="line">    );</span><br></pre></td></tr></table></figure><h2 id="删除表"><a href="#删除表" class="headerlink" title="删除表"></a>删除表</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ mysql&gt; DROP TABLE temp_person;</span><br><span class="line"><span class="comment"># or</span></span><br><span class="line">$ mysql&gt; DROP TABLE IF EXISTS temp_person;</span><br></pre></td></tr></table></figure><h2 id="创建用户"><a href="#创建用户" class="headerlink" title="创建用户"></a>创建用户</h2><p>命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$mysql</span>&gt; CREATE USER <span class="string">&#x27;username&#x27;</span>@<span class="string">&#x27;host&#x27;</span> IDENTIFIED BY <span class="string">&#x27;password&#x27;</span>;</span><br></pre></td></tr></table></figure><p>说明：</p><ul><li><code>username</code>：你将创建的用户名</li><li><code>host</code>：指定该用户在哪个主机上可以登陆，如果是本地用户可用<code>localhost</code>，如果想让该用户可以从任意远程主机登陆，可以使用通配符<code>%</code></li><li><code>password</code>：该用户的登陆密码，密码可以为空，如果为空则该用户可以不需要密码登陆服务器</li></ul><p>例子：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$mysql</span>&gt; CREATE USER <span class="string">&#x27;dog&#x27;</span>@<span class="string">&#x27;localhost&#x27;</span> IDENTIFIED BY <span class="string">&#x27;123456&#x27;</span>;</span><br><span class="line"><span class="variable">$mysql</span>&gt; CREATE USER <span class="string">&#x27;pig&#x27;</span>@<span class="string">&#x27;192.168.1.101_&#x27;</span> IDENDIFIED BY <span class="string">&#x27;123456&#x27;</span>;</span><br><span class="line"><span class="variable">$mysql</span>&gt; CREATE USER <span class="string">&#x27;pig&#x27;</span>@<span class="string">&#x27;%&#x27;</span> IDENTIFIED BY <span class="string">&#x27;123456&#x27;</span>;</span><br><span class="line"><span class="variable">$mysql</span>&gt; CREATE USER <span class="string">&#x27;pig&#x27;</span>@<span class="string">&#x27;%&#x27;</span> IDENTIFIED BY <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"><span class="variable">$mysql</span>&gt; CREATE USER <span class="string">&#x27;pig&#x27;</span>@<span class="string">&#x27;%&#x27;</span>;</span><br></pre></td></tr></table></figure><h2 id="授权"><a href="#授权" class="headerlink" title="授权"></a>授权</h2><p>命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$mysql</span>&gt; GRANT privileges ON databasename.tablename TO <span class="string">&#x27;username&#x27;</span>@<span class="string">&#x27;host&#x27;</span></span><br></pre></td></tr></table></figure><p>说明:</p><ul><li><code>privileges</code>：用户的操作权限，如<code>SELECT</code>，<code>INSERT</code>，<code>UPDATE</code>等，如果要授予所的权限则使用ALL</li><li><code>databasename</code>：数据库名</li><li><code>tablename</code>：表名，如果要授予该用户对所有数据库和表的相应操作权限则可用*表示，如<code>*.*</code><br>例子：<figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$mysql</span>&gt; GRANT SELECT, INSERT ON test.user TO <span class="string">&#x27;pig&#x27;</span>@<span class="string">&#x27;%&#x27;</span>;</span><br><span class="line"><span class="variable">$mysql</span>&gt; GRANT ALL ON *.* TO <span class="string">&#x27;pig&#x27;</span>@<span class="string">&#x27;%&#x27;</span>;</span><br></pre></td></tr></table></figure><blockquote><p><strong>注意</strong><br> 用以上命令授权的用户不能给其它用户授权，如果想让该用户可以授权，用以下命令:<br> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$mysql</span>&gt; GRANT privileges ON databasename.tablename TO <span class="string">&#x27;username&#x27;</span>@<span class="string">&#x27;host&#x27;</span> WITH GRANT OPTION;</span><br></pre></td></tr></table></figure></p></blockquote></li></ul><h2 id="设置与更改用户密码"><a href="#设置与更改用户密码" class="headerlink" title="设置与更改用户密码"></a>设置与更改用户密码</h2><p>命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$mysql</span>&gt; SET PASSWORD FOR <span class="string">&#x27;username&#x27;</span>@<span class="string">&#x27;host&#x27;</span> = PASSWORD(<span class="string">&#x27;newpassword&#x27;</span>);</span><br></pre></td></tr></table></figure><blockquote><p>如果是当前登陆用户用:<br> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&gt;<span class="variable">$mysql</span>&gt; SET PASSWORD = PASSWORD(<span class="string">&quot;newpassword&quot;</span>);</span><br></pre></td></tr></table></figure><br>例子：</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$mysql</span>&gt; SET PASSWORD FOR <span class="string">&#x27;pig&#x27;</span>@<span class="string">&#x27;%&#x27;</span> = PASSWORD(<span class="string">&quot;123456&quot;</span>);</span><br></pre></td></tr></table></figure><h2 id="撤销用户权限"><a href="#撤销用户权限" class="headerlink" title="撤销用户权限"></a>撤销用户权限</h2><p>命令：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$mysql</span>&gt; REVOKE privilege ON databasename.tablename FROM <span class="string">&#x27;username&#x27;</span>@<span class="string">&#x27;host&#x27;</span>;</span><br></pre></td></tr></table></figure><p>说明：<br><code>privilege</code>, <code>databasename</code>, <code>tablename</code>：<a href="#%E6%8E%88%E6%9D%83">同授权部分</a><br>例子：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$mysql</span>&gt; REVOKE SELECT ON *.* FROM <span class="string">&#x27;pig&#x27;</span>@<span class="string">&#x27;%&#x27;</span>;</span><br></pre></td></tr></table></figure><blockquote><p>注意:<br> 假如你在给用户<code>&#39;pig&#39;@&#39;%&#39;</code>授权的时候是这样的（或类似的）：<code>GRANT SELECT ON test.user TO &#39;pig&#39;@&#39;%&#39;</code>，则在使用<code>REVOKE SELECT ON *.* FROM &#39;pig&#39;@&#39;%&#39;</code>;<br> 命令并不能撤销该用户对test数据库中user表的<code>SELECT</code> 操作。<br> 相反，如果授权使用的是<code>GRANT SELECT ON *.* TO &#39;pig&#39;@&#39;%&#39;</code>, 则<code>REVOKE SELECT ON test.user FROM &#39;pig&#39;@&#39;%&#39;</code>;<br> 命令也不能撤销该用户对test数据库中user表的<code>SELECT</code>权限。<br> 具体信息可以用命令<code>SHOW GRANTS FOR &#39;pig&#39;@&#39;%&#39;</code>; 查看。</p></blockquote><h2 id="删除用户"><a href="#删除用户" class="headerlink" title="删除用户"></a>删除用户</h2> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$mysql</span>&gt; DROP USER <span class="string">&#x27;username&#x27;</span>@<span class="string">&#x27;host&#x27;</span>;</span><br></pre></td></tr></table></figure><h1 id="最后"><a href="#最后" class="headerlink" title="最后"></a>最后</h1><p>能看到这里，那就先要恭喜你了，你已经成功达成建库、建表、建用户到删表、删库、删用户等成就。那还等什么？赶紧跑路吧ε&#x3D;ε&#x3D;ε&#x3D;┏(゜ロ゜;)┛</p><hr><p>附：</p><ul><li><a href="https://www.mysql.com/">MySql官网</a></li><li><a href="https://www.tutorialspoint.com/mysql/">MySql Tutorial</a></li><li><a href="https://github.com/cnt1992/cnt1992.github.io/wiki/Mysql%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7%E5%B9%B6%E6%8E%88%E6%9D%83%E5%91%BD%E4%BB%A4">Mysql创建用户并授权命令</a></li></ul>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;img src=&quot;https://img2.imgtp.com/2024/03/23/JvTStp0N.gif&quot;&gt;&lt;/p&gt;
&lt;p&gt;最近准备找时间把&lt;a href=&quot;http://bing.ioliu.cn/&quot;&gt;bing壁纸&lt;/a&gt;项目重构，但由于虚拟主机快要过期了，所以目
      
    
    </summary>
    
    
      <category term="学习笔记" scheme="https://ioliu.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="MySql" scheme="https://ioliu.cn/tags/MySql/"/>
    
      <category term="数据库" scheme="https://ioliu.cn/tags/%E6%95%B0%E6%8D%AE%E5%BA%93/"/>
    
  </entry>
  
  <entry>
    <title>给你的网站加把锁 -- Let&#39;s Encrypt 完全体验</title>
    <link href="https://ioliu.cn/2017/add-a-lock-to-your-website/"/>
    <id>https://ioliu.cn/2017/add-a-lock-to-your-website/</id>
    <published>2017-03-21T10:30:25.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://img2.imgtp.com/2024/03/23/UbnufjtC.png"></p><p>今天抽时间将所有的网站<a href="https://zh.wikipedia.org/wiki/%E5%82%B3%E8%BC%B8%E5%B1%A4%E5%AE%89%E5%85%A8%E5%8D%94%E8%AD%B0">SSL证书</a>都更新了成 <a href="https://letsencrypt.org/">Let’s Encrypt</a> 了。采用了<a href="https://certbot.eff.org/">certbot</a> 这样的自动化工具，配置管理起来非常容易(一本正经的胡说八道)，这里将对整个体验过程做个详细记录。</p><h1 id="了解-Let’s-Encrypt"><a href="#了解-Let’s-Encrypt" class="headerlink" title="了解 Let’s Encrypt"></a>了解 Let’s Encrypt</h1><blockquote><p>The project aims to make encrypted connections in the World Wide Web the default case. By getting rid of payment, web server configuration, validation emails and dealing with expired certificates it is meant to significantly lower the complexity of setting up and maintaining TLS encryption.On a Linux web server, execution of only two commands is sufficient to set up HTTPS encryption, acquire and install certificates within 20 to 30 seconds.</p></blockquote><p><a href="https://letsencrypt.org/">Let’s Encrypt</a> 是一个2015年末推出的数字证书认证机构，将通过旨在消除当前手动创建和安装证书的复杂过程的自动化流程，为安全网站提供免费的SSL&#x2F;TLS证书。</p><h1 id="获取-Let’s-Encrypt"><a href="#获取-Let’s-Encrypt" class="headerlink" title="获取 Let’s Encrypt"></a>获取 Let’s Encrypt</h1><p><img src="https://img2.imgtp.com/2024/03/23/7vIeZclV.png"><br>Let’s Encrypt 证书生成不需要手动进行，官方推荐 <a href="https://certbot.eff.org/">Certbot</a> 这套自动化工具来实现。4步轻松搞定：</p><ul><li>下载安装 certbot (Let’s Encrypt项目的自动化工具)</li><li>获得SSL证书</li><li>修改Nginx配置文件</li><li>续订</li></ul><h2 id="1-安装-Certbot"><a href="#1-安装-Certbot" class="headerlink" title="1. 安装 Certbot"></a>1. 安装 Certbot</h2><p>根据 <a href="https://certbot.eff.org/">Certbot</a> 官网指南，<code>Debian 8</code>上执行如下命令，安装certbot:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">sudo</span> apt-get update</span><br><span class="line">$ <span class="built_in">sudo</span> apt-get install certbot -t jessie-backports</span><br></pre></td></tr></table></figure><p>等安装完成，<code>certbot</code>就可以使用了。</p><h2 id="2-获取SSL证书"><a href="#2-获取SSL证书" class="headerlink" title="2. 获取SSL证书"></a>2. 获取SSL证书</h2><p>Let’s Encrypt提供了通过各种插件获取SSL证书的各种方法。不同的是Apache的插件，大多数的插件只会帮助你得到，你必须手动配置你的Web服务器使用证书。仅获取证书而不安装证书的插件称为“验证器”，因为它们用于验证服务器是否应颁发证书。<br>下面将使用<code>Webroot</code>的插件来获取SSL证书。</p><h3 id="如何使用-Webroot-插件："><a href="#如何使用-Webroot-插件：" class="headerlink" title="如何使用 Webroot 插件："></a>如何使用 Webroot 插件：</h3><p>Webroot 的工作插件放置在一个特殊的文件<code>/.well-known</code>目录文档根目录下，它可以打开（通过Web服务器）内由让我们的加密服务进行验证。 根据配置的不同，你可能需要明确允许访问&#x2F;.well-known目录。</p><p>为了确保该目录可供Let’s Encrypt进行验证，让我们快速更改我们的Nginx配置。编辑<code>/etc/nginx/conf.d/example.com.conf</code>文件，并将下面代码添加进去:</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">location</span> <span class="regexp">~ /.well-known</span> &#123;</span><br><span class="line">    <span class="attribute">allow</span> all;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>使用<code>nginx -t</code>测试配置文件是否正确，在正确的情况下，重新让Nginx重新加载配置文件:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">sudo</span> systemctl reload nginx</span><br></pre></td></tr></table></figure><h3 id="使用certbot命令获取证书："><a href="#使用certbot命令获取证书：" class="headerlink" title="使用certbot命令获取证书："></a>使用certbot命令获取证书：</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">sudo</span> certbot certonly --webroot -w /var/www/example -d example.com -d www.example.com -w /var/www/thing -d thing.is -d m.thing.is</span><br></pre></td></tr></table></figure><ul><li><code>-w</code>:指定网站所在目录</li><li><code>-d</code>:指定要生成证书的域名，如果你想多个域名保存在一个证书里(最多四个)(如<code>example.com</code>、<code>www.example.com</code>、<code>thing.is</code>、<code>m.thing.is</code>)，请确保使用适当的webroot路径和域名替换命令中的相对应部分。</li></ul><p>接下来，同意加密订阅协议：<br><img src="https://img2.imgtp.com/2024/03/23/ScS0a1oG.png"></p><p>如果一切顺利，你应该看到一个类似下面的输出消息：</p><blockquote><p><strong>IMPORTANT NOTES:</strong></p></blockquote><ul><li>Congratulations! Your certificate and chain have been saved at<br><code>/etc/letsencrypt/live/example.com/fullchain.pem</code>. Your cert will expire<br>on <strong><code>2017-06-19</code></strong>. To obtain a new or tweaked version of this<br>certificate in the future, simply run certbot again. To<br>non-interactively renew <em>all</em> of your certificates, run “certbot<br>renew”</li><li>If you like Certbot, please consider supporting our work by:<blockquote></blockquote>Donating to ISRG &#x2F; Let’s Encrypt:   <a href="https://letsencrypt.org/donate">https://letsencrypt.org/donate</a><br>Donating to EFF:                    <a href="https://eff.org/donate-le">https://eff.org/donate-le</a></li></ul><h3 id="证书文件"><a href="#证书文件" class="headerlink" title="证书文件"></a>证书文件</h3><p>如果运行顺利，所有服务器所需要的证书就已经生成好了。他们被放在了 <code>/etc/letsencrypt/live/example.com/</code> 下：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">ls</span> /etc/letsencrypt/live/example.com/</span><br><span class="line">cert.pem <span class="comment">#server cert only  </span></span><br><span class="line">privkey.pem <span class="comment">#private key  </span></span><br><span class="line">chain.pem <span class="comment">#intermediates  </span></span><br><span class="line">fullchain.pem <span class="comment">#server cert + intermediates </span></span><br></pre></td></tr></table></figure><h2 id="3-修改Nginx配置文件"><a href="#3-修改Nginx配置文件" class="headerlink" title="3.修改Nginx配置文件"></a>3.修改Nginx配置文件</h2><p>到这里已经成功一大半了，只需要配置 Nginx 支持刚刚生成的证书。最佳实践可以参考<a href="https://mozilla.github.io/server-side-tls/ssl-config-generator/">Mozilla SSL Configuration Generator</a>。<br><img src="https://img2.imgtp.com/2024/03/23/b7Ex5aRI.png"><br>注意去掉HSTS的勾(勾上会强制https，并且很难消除后续影响)。</p><p>请根据自己的服务配置修改和添加内容，<strong>重点只需要关注6行</strong>：</p><figure class="highlight nginx"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">server</span> &#123;  </span><br><span class="line">    <span class="attribute">listen</span> <span class="number">443</span> ssl http2;</span><br><span class="line">    ....</span><br><span class="line">    <span class="attribute">ssl_certificate</span> /etc/letsencrypt/live/example.com/fullchain.pem;</span><br><span class="line">    <span class="attribute">ssl_certificate_key</span> /etc/letsencrypt/live/example.com/privkey.pem;</span><br><span class="line">    <span class="attribute">ssl_dhparam</span> /etc/nginx/ssl/dhparam.pem;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">ssl_trusted_certificate</span> /etc/letsencrypt/live/example.com/root_ca_cert_plus_intermediates;</span><br><span class="line"></span><br><span class="line">    <span class="attribute">resolver</span> &lt;IP DNS resolver&gt;;</span><br><span class="line">    ....</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><code>dhparam.pem</code>可以通过以下命令生成：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">sudo</span> <span class="built_in">mkdir</span> /etc/nginx/ssl</span><br><span class="line">$ <span class="built_in">sudo</span> openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048</span><br></pre></td></tr></table></figure><p>Nginx 配置完成后重启，用浏览器测试是否一切正常。<br><img src="https://img2.imgtp.com/2024/03/23/u09NJDW9.png"></p><h2 id="4-续订"><a href="#4-续订" class="headerlink" title="4.续订"></a>4.续订</h2><p><code>Let&#39;s Encrypt</code>证书有效期只有3个月，所以，需要定时renew。我将使用<code>corntab</code>来执行renew命令:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">sudo</span> crontab -e</span><br></pre></td></tr></table></figure><p>添加以下行：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">30 2 * * 1 /usr/bin/certbot renew &gt;&gt; /var/log/le-renew.log &amp;&amp; /bin/systemctl reload nginx</span><br></pre></td></tr></table></figure><p>保存，并退出。这个定时任务将在每个星期一的凌晨两点半执行<code>certbot renew</code>命令，并重启Nginx。最后将日志输出到<code>/var/log/le-renewal.log</code>。</p><h1 id="测试你的网站-SSL-安全性"><a href="#测试你的网站-SSL-安全性" class="headerlink" title="测试你的网站 SSL 安全性"></a>测试你的网站 SSL 安全性</h1><p><a href="https://www.ssllabs.com/ssltest/index.html">Qualys SSL Labs</a> 提供了全面的 SSL 安全性测试，填写你的网站域名，给自己的 HTTPS 配置打个分。<br><img src="https://img2.imgtp.com/2024/03/23/IiiWipcX.png"><br>这意味着你网站的HTTPS已经启用成功啦，为自己鼓个掌。 (๑•̀ㅂ•́)و✧。</p><hr><h1 id="附："><a href="#附：" class="headerlink" title="附："></a>附：</h1><p>还有一种方法，不需要访问你的网站目录，但需要临时停止Nginx服务器(需要用到80端口)：</p><ol><li>停止Nginx</li><li>域名解析到你的服务器IP</li><li>执行命令:<code>certbot certonly --standalone -d example.com -d www.example.com</code></li></ol><p>然后的步骤就和上面一样啦~~~</p><p>以上。</p>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;img src=&quot;https://img2.imgtp.com/2024/03/23/UbnufjtC.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;今天抽时间将所有的网站&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%82%B3%E8%BC%B8%E5
      
    
    </summary>
    
    
      <category term="学习笔记" scheme="https://ioliu.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="ssl" scheme="https://ioliu.cn/tags/ssl/"/>
    
      <category term="cerbot" scheme="https://ioliu.cn/tags/cerbot/"/>
    
  </entry>
  
  <entry>
    <title>判断变量类型的一些方法</title>
    <link href="https://ioliu.cn/2016/judgment-variable-type/"/>
    <id>https://ioliu.cn/2016/judgment-variable-type/</id>
    <published>2016-09-13T14:10:01.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p>久了不用，就会发现，以前会的东西都会忘记掉(或者是完全想不起来了)，不知道你们有没有遇到过这个情况  - -!</p><p>这里只是对判断<code>变量类型</code>方法的一些记录，方便以后能够随时查看。</p><h3 id="typeof"><a href="#typeof" class="headerlink" title="typeof"></a>typeof</h3><p>要判断变量类型，首先想到的就是<code>typeof</code>，但用了才知道，其结果完全不是理想中的:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">typeof</span> &#123;&#125;;  <span class="comment">//&quot;object&quot;</span></span><br><span class="line"><span class="keyword">typeof</span> [];  <span class="comment">//&quot;object&quot;</span></span><br><span class="line"><span class="keyword">typeof</span> <span class="string">&quot;&quot;</span>;  <span class="comment">//&quot;string&quot;</span></span><br><span class="line"><span class="keyword">typeof</span> <span class="number">0</span>;   <span class="comment">//&quot;number&quot;</span></span><br><span class="line"><span class="keyword">typeof</span> <span class="keyword">function</span>(<span class="params"></span>)&#123;&#125;;<span class="comment">//&quot;function&quot;</span></span><br><span class="line"><span class="keyword">typeof</span> <span class="literal">true</span>;<span class="comment">//&quot;boolean&quot;</span></span><br></pre></td></tr></table></figure><p>由上面代码可以看出，数组也是对象，所以<code>typeof</code>不是我们理想中的解决方案。</p><p>当然，有的童鞋可能会说，由于<code>length</code>是<code>Array</code>特有的属性(非绝对),那是不是可以用<code>length</code>+<code>typeof</code>来判断。</p><p>当然，这是可以的：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> arr = [<span class="number">1</span>,<span class="number">2</span>];</span><br><span class="line"><span class="keyword">if</span>(<span class="keyword">typeof</span> arr === <span class="string">&#x27;object&#x27;</span>)&#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="keyword">typeof</span> arr.<span class="property">length</span> === <span class="string">&quot;number&quot;</span> ? <span class="string">&quot;array&quot;</span> : <span class="string">&quot;object&quot;</span>);<span class="comment">//这里输出 &quot;array&quot;</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//...其他的就不一一罗列了</span></span><br></pre></td></tr></table></figure><p>不过这个方法不通用，如果<code>&#123;key:value&#125;</code>对象中有 <code>length</code> 字段呢，如：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//这种情况对于上面的代码就不适用了</span></span><br><span class="line"><span class="keyword">var</span> obj = &#123;</span><br><span class="line">    <span class="attr">name</span>:<span class="string">&quot;square&quot;</span>,</span><br><span class="line">    <span class="attr">length</span>:<span class="number">50</span>,</span><br><span class="line">    <span class="attr">width</span>:<span class="number">50</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h3 id="instanceof"><a href="#instanceof" class="headerlink" title="instanceof"></a>instanceof</h3><p>第二种解决方案就是使用<code>instanceof</code>，不过使用<code>instanceof</code>会出现<code>[] instanceof Object === true</code>的情况。这样就需要优先判断<code>Array</code>：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>];</span><br><span class="line"><span class="keyword">var</span> b = &#123;<span class="attr">name</span>:<span class="string">&#x27;zhangsan&#x27;</span>,<span class="attr">sex</span>:<span class="number">123</span>&#125;;</span><br><span class="line"><span class="keyword">var</span> fn = <span class="keyword">function</span>(<span class="params"></span>)&#123;&#125;;</span><br><span class="line"><span class="keyword">var</span> detectType = <span class="keyword">function</span>(<span class="params">o</span>)&#123;</span><br><span class="line">    <span class="keyword">if</span>(o <span class="keyword">instanceof</span> <span class="title class_">Array</span>)&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;Array&#x27;</span></span><br><span class="line">    &#125;<span class="keyword">else</span> <span class="keyword">if</span>( o <span class="keyword">instanceof</span> <span class="title class_">Object</span> )&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;Object&#x27;</span>;</span><br><span class="line">    &#125;<span class="keyword">else</span>&#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&#x27;param is no object type&#x27;</span>;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>( <span class="title function_">detectType</span>(a) );    <span class="comment">// Array</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>( <span class="title function_">detectType</span>(b) );    <span class="comment">// Object</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>( <span class="title function_">detectType</span>(<span class="number">1</span>) );    <span class="comment">// param is no object type</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>( <span class="title function_">detectType</span>(<span class="literal">true</span>) ); <span class="comment">// param is no object type</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>( <span class="title function_">detectType</span>(<span class="string">&#x27;a&#x27;</span>) );  <span class="comment">// param is no object type</span></span><br></pre></td></tr></table></figure><h3 id="Object-prototype-toString-call"><a href="#Object-prototype-toString-call" class="headerlink" title="Object.prototype.toString.call"></a>Object.prototype.toString.call</h3><p>还有一种最靠谱的办法就是<code>Object.prototype.toString.call</code>:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="title class_">Object</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">toString</span>.<span class="title function_">call</span>([])              <span class="comment">//&quot;[object Array]&quot;</span></span><br><span class="line"><span class="title class_">Object</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">toString</span>.<span class="title function_">call</span>(<span class="title class_">Object</span>)          <span class="comment">//&quot;[object Function]&quot;</span></span><br><span class="line"><span class="title class_">Object</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">toString</span>.<span class="title function_">call</span>(<span class="keyword">function</span> <span class="title function_">x</span>(<span class="params"></span>)&#123;&#125;)  <span class="comment">//&quot;[object Function]&quot;</span></span><br><span class="line"><span class="title class_">Object</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">toString</span>.<span class="title function_">call</span>(<span class="string">&quot;&quot;</span>)              <span class="comment">//&quot;[object String]&quot;</span></span><br><span class="line"><span class="title class_">Object</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">toString</span>.<span class="title function_">call</span>(&#123;&#125;)              <span class="comment">//&quot;[object Object]&quot;</span></span><br><span class="line"><span class="title class_">Object</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">toString</span>.<span class="title function_">call</span>(<span class="literal">null</span>)            <span class="comment">//&quot;[object Null]&quot;</span></span><br><span class="line"><span class="title class_">Object</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">toString</span>.<span class="title function_">call</span>(<span class="literal">undefined</span>)       <span class="comment">//&quot;[object Undefined]&quot;</span></span><br><span class="line"><span class="title class_">Object</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">toString</span>.<span class="title function_">call</span>(<span class="regexp">/test/</span>)          <span class="comment">//&quot;[object RegExp]&quot;</span></span><br><span class="line"><span class="title class_">Object</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">toString</span>.<span class="title function_">call</span>(<span class="keyword">new</span> <span class="title class_">Date</span>())      <span class="comment">//&quot;[object Date]&quot;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="参考文档"><a href="#参考文档" class="headerlink" title="参考文档"></a>参考文档</h3><ol><li><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString">Object.prototype.toString()</a></li></ol>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;久了不用，就会发现，以前会的东西都会忘记掉(或者是完全想不起来了)，不知道你们有没有遇到过这个情况  - -!&lt;/p&gt;
&lt;p&gt;这里只是对判断&lt;code&gt;变量类型&lt;/code&gt;方法的一些记录，方便以后能够随时查看。&lt;/p&gt;
&lt;h3 id=&quot;typeof&quot;&gt;&lt;a href=&quot;#
      
    
    </summary>
    
    
      <category term="学习笔记" scheme="https://ioliu.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="JavaScript" scheme="https://ioliu.cn/tags/JavaScript/"/>
    
      <category term="前端" scheme="https://ioliu.cn/tags/%E5%89%8D%E7%AB%AF/"/>
    
      <category term="变量类型" scheme="https://ioliu.cn/tags/%E5%8F%98%E9%87%8F%E7%B1%BB%E5%9E%8B/"/>
    
  </entry>
  
  <entry>
    <title>CSS 内容和特殊字符</title>
    <link href="https://ioliu.cn/2016/css-content-and-special-characters/"/>
    <id>https://ioliu.cn/2016/css-content-and-special-characters/</id>
    <published>2016-09-06T06:10:01.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p>当我写这个主题<code>theme</code>的时候，我想在我的列表元素(<code>list elements</code>)上用CSS内容(<code>CSS content</code>)属性添加一些**向右双角引号(right-pointing double-angle quotation marks)(<code>&lt;&lt;</code>)**。</p><p>所以，我在里面添加了<code>&amp;raquo;</code>，然而，它并不工作！</p><p>我花了一点时间去了解到，你不能使用常规的 HTML 实体内容。相反，你必须使用 Unicode 十六进制格式，它看起来像这样：<code>\bb</code>。</p><p>这是一些你可以轻而易举找到的东西，只因为它出现在了众多课程和参考书里。</p><h2 id="将HTML实体转换成Unicode十六进制代码"><a href="#将HTML实体转换成Unicode十六进制代码" class="headerlink" title="将HTML实体转换成Unicode十六进制代码"></a>将HTML实体转换成Unicode十六进制代码</h2><p>这里有很多的HTML实体对应表，但是没有更多的 Unicode十六进制表，所以很方便的知道二者之间的转换。你需要知道所有的HTML十进制单位(它们看起来像这样<code>&amp;#123;</code>，而不是像这样<code>&amp;quot;</code>)。<br>那数字，你猜到了吧，就是十进制格式。我们需要将其转换成Unicode十六进制(我知道，你震惊了！)。</p><p>如果你不是一个程序员或者数学天才，可能你不熟悉到底该怎么做(具体请<a href="https://google.com/">Google</a>)。OK，其实这并不难，但有一个更快捷的方式:</p><p>打开类似于经典的Windows计算器，切换到“程序员”视图(<code>View &gt; Programmer</code>)。点击<code>Dec(十进制)</code>单选按钮，输入你的数字然后点击<code>Hex(十六进制)</code>按钮，你就会得到你的十六进制数字。</p><p>然后把刚刚得到的数字放到<code>\</code>之后，你就得到了你自己的Unicode十六进制字符。</p><h2 id="更容易的方法-HTML实体-HTML-Entity-和-Unicode-十六进制-对应表"><a href="#更容易的方法-HTML实体-HTML-Entity-和-Unicode-十六进制-对应表" class="headerlink" title="更容易的方法 - HTML实体(HTML Entity)和 Unicode 十六进制 对应表"></a>更容易的方法 - HTML实体(HTML Entity)和 Unicode 十六进制 对应表</h2><p>这个方法不需要你手动的将十进制转成十六进制，这个图表能够给你一些常见的(或者不是那么常见的)符号的参考：</p><iframe width="100%" height="500" src="//jsfiddle.net/LNing/kqq1wnus/embedded/result/" allowfullscreen="allowfullscreen" frameborder="0"></iframe>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;当我写这个主题&lt;code&gt;theme&lt;/code&gt;的时候，我想在我的列表元素(&lt;code&gt;list elements&lt;/code&gt;)上用CSS内容(&lt;code&gt;CSS content&lt;/code&gt;)属性添加一些**向右双角引号(right-pointing double-a
      
    
    </summary>
    
    
    
      <category term="前端" scheme="https://ioliu.cn/tags/%E5%89%8D%E7%AB%AF/"/>
    
      <category term="CSS" scheme="https://ioliu.cn/tags/CSS/"/>
    
      <category term="译文" scheme="https://ioliu.cn/tags/%E8%AF%91%E6%96%87/"/>
    
  </entry>
  
  <entry>
    <title>JavaScript 最佳实践: 提升你代码质量的一些提示&amp;技巧</title>
    <link href="https://ioliu.cn/2016/javascript-best-practices-tips-and-tricks-to-level-up-your-code/"/>
    <id>https://ioliu.cn/2016/javascript-best-practices-tips-and-tricks-to-level-up-your-code/</id>
    <published>2016-09-02T06:10:01.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://img2.imgtp.com/2024/03/23/8VLs8ZYS.jpg"></p><p>每天学习新事物是成为一个伟大的人的一部分。而对开发者而言，持续不断学习新的东西是我们工作中的一部分，无论这些东西是否是你主动想学的。</p><p>在本教程中，我会指出一些重要的 JavaScript 最佳实践，因此你不必觉得学习它是条艰难的路。准备提升你的代码吧！</p><h2 id="避免全局污染-Avoid-polluting-the-global-scope"><a href="#避免全局污染-Avoid-polluting-the-global-scope" class="headerlink" title="避免全局污染(Avoid polluting the global scope)"></a>避免全局污染(Avoid polluting the global scope)</h2><p>声明变量(<code>Declaring variables</code>)是很有趣的。有时候，你可能声明了全局变量，即使你不想声明它。在如今的浏览器中，全局变量存储在<code>window</code>对象中。因此，有很多有趣的东西发生在那里，你可能会重写默认值。<br>让我们假设你有一个HTML文件，其中包含一个<code>&lt;script&gt;</code>标签(或者在加载的 JavaScript 文件中包含):</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> foo = <span class="number">42</span>;</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(foo);</span><br></pre></td></tr></table></figure><p>这很显然会在控制台输出<code>42</code>。但是，因为这段代码没有在函数中执行，上下文将是一个全局的。因此，变量是附加到<code>window</code>对象的。这意味着<code>window.foo</code>的值也是<code>42</code>。</p><p>这是危险的，因为你可以重写已经存在的全局变量:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">print</span>(<span class="params"></span>)&#123;</span><br><span class="line"><span class="comment">//do something...</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title function_">print</span>();</span><br></pre></td></tr></table></figure><p>因为我们重写了原生的打印弹窗(<code>native print popup</code>)，所以当我们执行<code>window.print()</code> (或者只执行<code>print()</code>)的时候不会打开打印弹窗(<code>print popup</code>)。</p><p>这个问题很好解决，我们需要一个立即调用(<code>called immediately</code>) 的包装函数(<code>wrapping function</code>) (译者注:作者这里可能是要表达一个闭包函数<code>closure function</code>或者是匿名函数<code>anonymous function</code>)，像下面的代码:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Declare an anonymous function</span></span><br><span class="line"><span class="comment">// 声明一个匿名函数</span></span><br><span class="line">(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">   <span class="keyword">var</span> foo = <span class="number">42</span>;</span><br><span class="line">   <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="variable language_">window</span>.<span class="property">foo</span>);</span><br><span class="line">   <span class="comment">// → undefined</span></span><br><span class="line">   <span class="variable language_">console</span>.<span class="title function_">log</span>(foo);</span><br><span class="line">   <span class="comment">// → 42</span></span><br><span class="line">&#125;)();</span><br><span class="line"><span class="comment">//^ and call it immediately</span></span><br></pre></td></tr></table></figure><p>另外，你应该选择发送<code>window</code>和其他的全局变量(如:<code>document</code>)作为函数的参数(这可能会提高性能):</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">(<span class="keyword">function</span> (<span class="params"><span class="variable language_">global</span>, doc</span>) &#123;</span><br><span class="line">  <span class="variable language_">global</span>.<span class="built_in">setTimeout</span>(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">     doc.<span class="property">body</span>.<span class="property">innerHTML</span> = <span class="string">&quot;Hello!&quot;</span>;</span><br><span class="line">  &#125;, <span class="number">1000</span>);</span><br><span class="line">&#125;)(<span class="variable language_">window</span>, <span class="variable language_">document</span>);</span><br></pre></td></tr></table></figure><p>因此，使用包装函数来防止创建不必要的全局变量。注意，这不是说我在接下来的代码片段使用包装函数，我们应该把关注点放在代码本身。  </p><blockquote><p>💡小提示: <a href="http://browserify.org/">browserify</a>是另外一种防止创建不必要的全局变量的方式。它和 Node.js 采用的是同样的方式，使用的<code>require function</code>。</p></blockquote><hr><h2 id="学习更多关于浏览器开发者工具请点击-Web-开发指南"><a href="#学习更多关于浏览器开发者工具请点击-Web-开发指南" class="headerlink" title="学习更多关于浏览器开发者工具请点击 Web 开发指南  "></a><em>学习更多关于浏览器开发者工具请点击 <a href="https://www.codementor.io/learn-development/javascript-css-html-tutorial-front-end-development-tools">Web 开发指南</a></em>  </h2><p>顺便说一句，Node.js 会在函数里自动打包你的文件，它们看起来像这样：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">(<span class="keyword">function</span> (<span class="params"><span class="built_in">exports</span>, <span class="built_in">require</span>, <span class="variable language_">module</span>, __filename, __dirname</span>) &#123;</span><br><span class="line"><span class="comment">// ...</span></span><br></pre></td></tr></table></figure><p>因此，如果这让你认为<code>require</code>函数是全局的那就错了。它只不过是一个函数的参数罢了。</p><p><strong>你知道吗？</strong><br>由于<code>window</code>对象本身就是一个包含全局变量的全局变量，因此它的引用是自身:</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable language_">window</span>.<span class="property">window</span>.<span class="property">window</span></span><br><span class="line"><span class="comment">// =&gt; Window &#123;...&#125;</span></span><br></pre></td></tr></table></figure><p>那是因为<code>window</code>对象是一个环路对象(<code>circular object</code>)，下面演示怎么创建一个这样的对象：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// Create an Object</span></span><br><span class="line"><span class="keyword">var</span> foo = &#123;&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// Point a key value to the object itself</span></span><br><span class="line"><span class="comment">// 设置一个key，值为它本身</span></span><br><span class="line">foo.<span class="property">bar</span> = foo;</span><br><span class="line"></span><br><span class="line"><span class="comment">// The `foo` object just became a circular one:</span></span><br><span class="line">foo.<span class="property">bar</span>.<span class="property">bar</span>.<span class="property">bar</span></span><br><span class="line"><span class="comment">// → foo</span></span><br></pre></td></tr></table></figure><p>或者，去展现你对JavaScript 的爱，你可以做得更好：<br><img src="https://tva2.sinaimg.com/large/006qRazegw1f7fbn6xey4j30di0ca409.jpg"><br>Yes，你可以无限的扩展这个对象(大概直到你的浏览器崩溃).</p><h2 id="使用严格模式-use-strict"><a href="#使用严格模式-use-strict" class="headerlink" title="使用严格模式(use strict)"></a>使用严格模式(<code>use strict</code>)</h2><p>严格的使用<code>use strict</code>！这只不过是(译者注:这里原作者可能是想表达<code>不仅仅是</code>)在你的代码脚本中添加字符串而已。<br>举个栗子：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// This is bad, since you do create a global without having anyone to tell you</span></span><br><span class="line">(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">   a = <span class="number">42</span>;</span><br><span class="line">   <span class="variable language_">console</span>.<span class="title function_">log</span>(a);</span><br><span class="line">   <span class="comment">// → 42</span></span><br><span class="line">&#125;)();</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(a);</span><br><span class="line"><span class="comment">// → 42</span></span><br></pre></td></tr></table></figure><p>使用<code>use strict</code>，你可以得到更多的确切的错误：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">(<span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">   <span class="string">&quot;use strict&quot;</span>;</span><br><span class="line">   a = <span class="number">42</span>;</span><br><span class="line">   <span class="comment">// Error: Uncaught ReferenceError: a is not defined</span></span><br><span class="line">&#125;)();</span><br></pre></td></tr></table></figure><p>你可能会奇怪，为什么不能将<code>use strict</code> 写在函数体外。当然，这是可以的，但它将会应用为全局的范围。这仍然是不错的，但如果你的代码中含有来自其他库的代码，这也会受其影响，或者你把所有的东西都绑定在一个文件里。</p><h2 id="严格相等-Strict-equal"><a href="#严格相等-Strict-equal" class="headerlink" title="严格相等(Strict equal)"></a>严格相等(<code>Strict equal</code>)</h2><p>这是短的。如果你使用<code>==</code>对比<code>a</code>和<code>b</code>(像在其他编程语言)，在 JavaScript 中，你可能这种非常奇怪的运行方式：如果你有一个字符串和一个数字，他们是相等的(<code>==</code>):</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;42&quot;</span> == <span class="number">42</span></span><br><span class="line"><span class="comment">// → true</span></span><br></pre></td></tr></table></figure><p>由于显而易见的原因(如 <code>验证(validations)</code>)，最好使用严格相等(<code>===</code>)：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;42&quot;</span> === <span class="number">42</span></span><br><span class="line"><span class="comment">// → false</span></span><br></pre></td></tr></table></figure><h2 id="使用断言"><a href="#使用断言" class="headerlink" title="使用断言(&amp;&amp;&#x2F;||)"></a>使用断言(<code>&amp;&amp;</code>&#x2F;<code>||</code>)</h2><p>根据你的需要，你可以使用逻辑运算符是你的代码更简短。<br><strong>默认值:</strong></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&quot;&quot;</span> || <span class="string">&quot;foo&quot;</span></span><br><span class="line"><span class="comment">// → &quot;foo&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="literal">undefined</span> || <span class="number">42</span></span><br><span class="line"><span class="comment">// → 42</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Note that if you want to handle 0 there, you need</span></span><br><span class="line"><span class="comment">// to check if a number was provided:</span></span><br><span class="line"><span class="keyword">var</span> a = <span class="number">0</span>;</span><br><span class="line">a || <span class="number">42</span></span><br><span class="line"><span class="comment">// → 42</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// This is a ternary operator—works like an inline if-else statement</span></span><br><span class="line"><span class="keyword">var</span> b = <span class="keyword">typeof</span> a === <span class="string">&quot;number&quot;</span> ? a : <span class="number">42</span>;</span><br><span class="line"><span class="comment">// → 0</span></span><br></pre></td></tr></table></figure><p>检查是否是一个真正的<code>if</code>表达式，你可以简单的这么做：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">expr &amp;&amp; <span class="title function_">doSomething</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// Instead of:</span></span><br><span class="line"><span class="keyword">if</span> (expr) &#123;</span><br><span class="line"><span class="title function_">doSomething</span>();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>你可能会不赞同我这里的写法，但是这是比较理想的。如果你不想用这种方式丑化你的代码，但那些 JavaScript 压缩工具实际上会这么做。</p><p>如果你问我，尽管这些代码比较短，但它仍然是人类可读的。</p><h2 id="类型转换"><a href="#类型转换" class="headerlink" title="类型转换"></a>类型转换</h2><p>有几种方式来转换这些东西，这取决于你想怎么做。最常见的方式是：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// From anything to a number</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> foo = <span class="string">&quot;42&quot;</span>;</span><br><span class="line"><span class="keyword">var</span> myNumber = +foo; <span class="comment">// shortcut for Number(foo)</span></span><br><span class="line"><span class="comment">// → 42</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Tip: you can convert it directly into a negative number</span></span><br><span class="line"><span class="keyword">var</span> negativeFoo = -foo; <span class="comment">// or -Number(foo)</span></span><br><span class="line"><span class="comment">// → -42</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// From object to array</span></span><br><span class="line"><span class="comment">// Tip: `arguments` is an object and in general you want to use it as array</span></span><br><span class="line"><span class="keyword">var</span> args = &#123; <span class="number">0</span>: <span class="string">&quot;foo&quot;</span>, <span class="number">1</span>: <span class="string">&quot;bar&quot;</span>, <span class="attr">length</span>: <span class="number">2</span> &#125;;</span><br><span class="line"><span class="title class_">Array</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">slice</span>.<span class="title function_">call</span>(args)</span><br><span class="line"><span class="comment">// → [ &#x27;foo&#x27;, &#x27;bar&#x27; ]</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Anything to boolean</span></span><br><span class="line"><span class="comment">/// Non non p is a boolean p</span></span><br><span class="line"><span class="keyword">var</span> t = <span class="number">1</span>;</span><br><span class="line"><span class="keyword">var</span> f = <span class="number">0</span>;</span><br><span class="line">!!t</span><br><span class="line"><span class="comment">// → true</span></span><br><span class="line">!!f</span><br><span class="line"><span class="comment">// → false</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/// And non-p is a boolean non-p</span></span><br><span class="line">!t</span><br><span class="line"><span class="comment">// → false</span></span><br><span class="line">!f</span><br><span class="line"><span class="comment">// → true</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Anything to string</span></span><br><span class="line"><span class="keyword">var</span> foo = <span class="number">42</span>;</span><br><span class="line"><span class="string">&quot;&quot;</span> + foo <span class="comment">// shortcut for String(foo)</span></span><br><span class="line"><span class="comment">// → &quot;42&quot;</span></span><br><span class="line"></span><br><span class="line">foo = &#123; <span class="attr">hello</span>: <span class="string">&quot;world&quot;</span> &#125;;</span><br><span class="line"><span class="title class_">JSON</span>.<span class="title function_">stringify</span>(foo);</span><br><span class="line"><span class="comment">// → &#x27;&#123; &quot;hello&quot;:&quot;world&quot; &#125;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="title class_">JSON</span>.<span class="title function_">stringify</span>(foo, <span class="literal">null</span>, <span class="number">4</span>); <span class="comment">// beautify the things</span></span><br><span class="line"><span class="comment">// →</span></span><br><span class="line"><span class="comment">// &#x27;&#123;</span></span><br><span class="line"><span class="comment">//    &quot;hello&quot;: &quot;world&quot;</span></span><br><span class="line"><span class="comment">// &#125;&#x27;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// Note you cannot JSON.stringify circular structures</span></span><br><span class="line"><span class="title class_">JSON</span>.<span class="title function_">stringify</span>(<span class="variable language_">window</span>);</span><br><span class="line"><span class="comment">// ⚠ TypeError: JSON.stringify cannot serialize cyclic structures.</span></span><br></pre></td></tr></table></figure><h2 id="代码样式-样式指南"><a href="#代码样式-样式指南" class="headerlink" title="代码样式&#x2F;样式指南"></a>代码样式&#x2F;样式指南</h2><p>在新项目中，遵循整个文件相同的代码风格。对于现有的，采用已经存在的代码风格，除非你只是决定改变它(提示：同你的合作者商讨)。即使你创建并记录你的代码风格，请始终遵循它。</p><p>这里是不同的现有的代码样式：</p><ul><li><a href="https://google.github.io/styleguide/javascriptguide.xml">Google JavaScript Style Guide</a></li><li><a href="https://github.com/airbnb/javascript">airbnb&#x2F;javascript</a></li><li>… there are others too</li><li><a href="https://github.com/IonicaBizau/code-style">my style guide</a></li></ul><h2 id="附加提示"><a href="#附加提示" class="headerlink" title="附加提示"></a>附加提示</h2><p>其他重要的 JavaScript 最佳实践，你应该记住的是使用工具帮助你格式化你的代码。这是其中的一些：</p><ul><li><a href="https://github.com/beautify-web/js-beautify">js-beautify</a>: Beautifies your code</li><li><a href="https://github.com/mishoo/UglifyJS2">UglifyJS(2)</a>: Uglifies&#x2F;minimifies your code</li><li><a href="https://github.com/jshint/jshint">jshint</a>: Detects errors&#x2F;potential problems in your JavaScript code</li><li><a href="http://jscs.info/">jscs</a>: A configurable style guide checker</li></ul><p>最后一件事：<a href="https://www.codementor.io/learn-programming/what-to-do-when-your-website-is-broken">Debug your Code</a> </p><p>Happy programming!</p><hr><p>致谢：<a href="https://www.haomwei.com/">@屠夫</a> 、<a href="https://qistchan.com/">@QistChan</a>、<a href="https://napolin.cn/">@nApolin</a>、<a href="http://www.antzone.cn/">@Ant</a></p><hr>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;img src=&quot;https://img2.imgtp.com/2024/03/23/8VLs8ZYS.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;每天学习新事物是成为一个伟大的人的一部分。而对开发者而言，持续不断学习新的东西是我们工作中的一部分，无论这些东西是否是你主动想学的。&lt;/p&gt;

      
    
    </summary>
    
    
    
      <category term="JavaScript" scheme="https://ioliu.cn/tags/JavaScript/"/>
    
      <category term="前端" scheme="https://ioliu.cn/tags/%E5%89%8D%E7%AB%AF/"/>
    
      <category term="译文" scheme="https://ioliu.cn/tags/%E8%AF%91%E6%96%87/"/>
    
      <category term="技巧" scheme="https://ioliu.cn/tags/%E6%8A%80%E5%B7%A7/"/>
    
  </entry>
  
  <entry>
    <title>MarkDown 不完全指南</title>
    <link href="https://ioliu.cn/2016/MarkDown-incomplete-Guide/"/>
    <id>https://ioliu.cn/2016/MarkDown-incomplete-Guide/</id>
    <published>2016-05-18T06:21:08.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://img2.imgtp.com/2024/03/23/6KjbB2RQ.jpg"></p><h1 id="Markdown"><a href="#Markdown" class="headerlink" title="Markdown"></a>Markdown</h1><p>A markdown example shows how to write a markdown file. This document integrates core syntax and extensions (GMF).</p><h2 id="Block-Elements"><a href="#Block-Elements" class="headerlink" title="Block Elements"></a>Block Elements</h2><h3 id="Paragraphs-and-Line-Breaks"><a href="#Paragraphs-and-Line-Breaks" class="headerlink" title="Paragraphs and Line Breaks"></a>Paragraphs and Line Breaks</h3><h4 id="Paragraphs"><a href="#Paragraphs" class="headerlink" title="Paragraphs"></a>Paragraphs</h4><p>HTML Tag: <code>&lt;p&gt;</code></p><p>One or more blank lines. (A blank line is a line containing nothing but <strong>spaces</strong> or <strong>tabs</strong> is considered blank.)</p><p>Code:</p><figure class="highlight mercury"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">This will be </span><br><span class="line"><span class="meta">inline</span>.</span><br><span class="line"></span><br><span class="line">This <span class="keyword">is</span> second paragraph.</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p>This will be<br>inline.</p><p>This is second paragraph.</p><hr><h4 id="Line-Breaks"><a href="#Line-Breaks" class="headerlink" title="Line Breaks"></a>Line Breaks</h4><p>HTML Tag: <code>&lt;br /&gt;</code></p><p>End a line with <strong>two or more spaces</strong>.</p><p>Code:</p><figure class="highlight mercury"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">This will be <span class="built_in">not</span>  </span><br><span class="line"><span class="meta">inline</span>.</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p>This will be not<br>inline.</p><hr><h3 id="Headers"><a href="#Headers" class="headerlink" title="Headers"></a>Headers</h3><p>Markdown supports two styles of headers, Setext and atx.</p><h4 id="Setext"><a href="#Setext" class="headerlink" title="Setext"></a>Setext</h4><p>HTML Tags: <code>&lt;h1&gt;</code>, <code>&lt;h2&gt;</code></p><p>“Underlined” using <strong>equal signs (&#x3D;)</strong> as <code>&lt;h1&gt;</code> and <strong>dashes (-)</strong> as <code>&lt;h2&gt;</code> in any number.</p><h1 id="Code-Preview-This-is-an-H1"><a href="#Code-Preview-This-is-an-H1" class="headerlink" title="Code:Preview:***This is an H1"></a>Code:<br><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="section">This is an H1</span></span><br><span class="line"><span class="section">=============</span></span><br><span class="line"><span class="section">This is an H2</span></span><br><span class="line"><span class="section">-------------</span></span><br></pre></td></tr></table></figure><br>Preview:<br>***<br>This is an H1</h1><h2 id="This-is-an-H2"><a href="#This-is-an-H2" class="headerlink" title="This is an H2"></a>This is an H2</h2><hr><h4 id="atx"><a href="#atx" class="headerlink" title="atx"></a>atx</h4><p>HTML Tags: <code>&lt;h1&gt;</code>, <code>&lt;h2&gt;</code>, <code>&lt;h3&gt;</code>, <code>&lt;h4&gt;</code>, <code>&lt;h5&gt;</code>, <code>&lt;h6&gt;</code></p><p>Uses 1-6 <strong>hash characters (#)</strong> at the start of the line, corresponding to <code>&lt;h1&gt;</code> - <code>&lt;h6&gt;</code>.</p><p>Code:</p><figure class="highlight clean"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"># This is an H1</span><br><span class="line">## This is an H2</span><br><span class="line">###### This is an H6</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><h1 id="This-is-an-H1"><a href="#This-is-an-H1" class="headerlink" title="This is an H1"></a>This is an H1</h1><h2 id="This-is-an-H2-1"><a href="#This-is-an-H2-1" class="headerlink" title="This is an H2"></a>This is an H2</h2><h6 id="This-is-an-H6"><a href="#This-is-an-H6" class="headerlink" title="This is an H6"></a>This is an H6</h6><hr><p>Optionally, you may “close” atx-style headers. The closing hashes <strong>don’t need to match</strong> the number of hashes used to open the header.</p><p>Code:</p><figure class="highlight clean"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"># This is an H1 #</span><br><span class="line">## This is an H2 ##</span><br><span class="line">### This is an H3 ######</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><h1 id="This-is-an-H1-1"><a href="#This-is-an-H1-1" class="headerlink" title="This is an H1"></a>This is an H1</h1><h2 id="This-is-an-H2-2"><a href="#This-is-an-H2-2" class="headerlink" title="This is an H2"></a>This is an H2</h2><h3 id="This-is-an-H3"><a href="#This-is-an-H3" class="headerlink" title="This is an H3"></a>This is an H3</h3><hr><h3 id="Blockquotes"><a href="#Blockquotes" class="headerlink" title="Blockquotes"></a>Blockquotes</h3><p>HTML Tag: <code>&lt;blockquote&gt;</code></p><p>Markdown uses email-style <strong>&gt;</strong> characters for blockquoting. It looks best if you hard wrap the text and put a &gt; before every line.</p><p>Code:</p><figure class="highlight node-repl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript"><span class="title class_">This</span> is a blockquote <span class="keyword">with</span> two paragraphs. <span class="title class_">Lorem</span> ipsum dolor sit amet,</span></span><br><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript">consectetuer adipiscing elit. <span class="title class_">Aliquam</span> hendrerit mi posuere lectus.</span></span><br><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript"><span class="title class_">Vestibulum</span> enim wisi, viverra nec, fringilla <span class="keyword">in</span>, laoreet vitae, risus.</span></span><br><span class="line"><span class="meta prompt_">&gt;</span> </span><br><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript"><span class="title class_">Donec</span> sit amet nisl. <span class="title class_">Aliquam</span> semper ipsum sit amet velit. <span class="title class_">Suspendisse</span></span></span><br><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript">id sem consectetuer libero luctus adipiscing.</span></span><br></pre></td></tr></table></figure><p>Preview:</p><hr><blockquote><p>This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,<br>consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.<br>Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.</p><p>Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse<br>id sem consectetuer libero luctus adipiscing.</p></blockquote><hr><p>Markdown allows you to be lazy and only put the &gt; before the first line of a hard-wrapped paragraph.</p><p>Code:</p><figure class="highlight node-repl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript"><span class="title class_">This</span> is a blockquote <span class="keyword">with</span> two paragraphs. <span class="title class_">Lorem</span> ipsum dolor sit amet,</span></span><br><span class="line">consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.</span><br><span class="line">Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.</span><br><span class="line"></span><br><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript"><span class="title class_">Donec</span> sit amet nisl. <span class="title class_">Aliquam</span> semper ipsum sit amet velit. <span class="title class_">Suspendisse</span></span></span><br><span class="line">id sem consectetuer libero luctus adipiscing.</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><blockquote><p>This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,<br>consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.<br>Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.</p></blockquote><blockquote><p>Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse<br>id sem consectetuer libero luctus adipiscing.</p></blockquote><hr><p>Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by adding additional levels of &gt;.</p><p>Code:</p><figure class="highlight node-repl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript"><span class="title class_">This</span> is the first level <span class="keyword">of</span> quoting.</span></span><br><span class="line"><span class="meta prompt_">&gt;</span></span><br><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript">&gt; <span class="title class_">This</span> is nested blockquote.</span></span><br><span class="line"><span class="meta prompt_">&gt;</span></span><br><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript"><span class="title class_">Back</span> to the first level.</span></span><br></pre></td></tr></table></figure><p>Preview:</p><hr><blockquote><p>This is the first level of quoting.</p><blockquote><p>This is nested blockquote.</p></blockquote><p>Back to the first level.</p></blockquote><hr><p>Blockquotes can contain other Markdown elements, including headers, lists, and code blocks.</p><p>Code:</p><figure class="highlight node-repl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript">## <span class="title class_">This</span> is a header.</span></span><br><span class="line"><span class="meta prompt_">&gt;</span> </span><br><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript"><span class="number">1.</span>   <span class="title class_">This</span> is the first list item.</span></span><br><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript"><span class="number">2.</span>   <span class="title class_">This</span> is the second list item.</span></span><br><span class="line"><span class="meta prompt_">&gt;</span> </span><br><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript"><span class="title class_">Here</span><span class="string">&#x27;s some example code:</span></span></span><br><span class="line"><span class="meta prompt_">&gt;</span> </span><br><span class="line"><span class="meta prompt_">&gt;</span> <span class="language-javascript"><span class="string">    return shell_exec(&quot;echo $input | $markdown_script&quot;);</span></span></span><br></pre></td></tr></table></figure><p>Preview:</p><hr><blockquote><h2 id="This-is-a-header"><a href="#This-is-a-header" class="headerlink" title="This is a header."></a>This is a header.</h2><ol><li>This is the first list item.</li><li>This is the second list item.</li></ol><p>Here’s some example code:</p><pre><code>return shell_exec(&quot;echo $input | $markdown_script&quot;);</code></pre></blockquote><hr><h3 id="Lists"><a href="#Lists" class="headerlink" title="Lists"></a>Lists</h3><p>Markdown supports ordered (numbered) and unordered (bulleted) lists.</p><h4 id="Unordered"><a href="#Unordered" class="headerlink" title="Unordered"></a>Unordered</h4><p>HTML Tag: <code>&lt;ul&gt;</code></p><p>Unordered lists use <strong>asterisks (*)</strong>, <strong>pluses (+)</strong>, and <strong>hyphens (-)</strong>.</p><p>Code:</p><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">*   </span>Red</span><br><span class="line"><span class="bullet">*   </span>Green</span><br><span class="line"><span class="bullet">*   </span>Blue</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><ul><li>Red</li><li>Green</li><li>Blue</li></ul><hr><p>is equivalent to:</p><p>Code:</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">+</span>   Red</span><br><span class="line"><span class="bullet">+</span>   Green</span><br><span class="line"><span class="bullet">+</span>   Blue</span><br></pre></td></tr></table></figure><p>and:</p><p>Code:</p><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-   </span>Red</span><br><span class="line"><span class="bullet">-   </span>Green</span><br><span class="line"><span class="bullet">-   </span>Blue</span><br></pre></td></tr></table></figure><h4 id="Ordered"><a href="#Ordered" class="headerlink" title="Ordered"></a>Ordered</h4><p>HTML Tag: <code>&lt;ol&gt;</code></p><p>Ordered lists use numbers followed by periods:</p><p>Code:</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">1.</span>  Bird</span><br><span class="line"><span class="bullet">2.</span>  McHale</span><br><span class="line"><span class="bullet">3.</span>  Parish</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><ol><li>Bird</li><li>McHale</li><li>Parish</li></ol><hr><p>It’s possible to trigger an ordered list by accident, by writing something like this:</p><p>Code:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1986</span>. What <span class="selector-tag">a</span> great season.</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><ol start="1986"><li>What a great season.</li></ol><hr><p>You can <strong>backslash-escape (\)</strong> the period:</p><p>Code:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="number">1986</span>\. What <span class="selector-tag">a</span> great season.</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p>1986. What a great season.</p><hr><h4 id="Indented"><a href="#Indented" class="headerlink" title="Indented"></a>Indented</h4><h5 id="Blockquote"><a href="#Blockquote" class="headerlink" title="Blockquote"></a>Blockquote</h5><p>To put a blockquote within a list item, the blockquote’s &gt; delimiters need to be indented:</p><p>Code:</p><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">*   <span class="selector-tag">A</span> <span class="selector-tag">list</span> <span class="selector-tag">item</span> <span class="selector-tag">with</span> <span class="selector-tag">a</span> <span class="selector-tag">blockquote</span>:</span><br><span class="line"></span><br><span class="line">    &gt; <span class="selector-tag">This</span> <span class="selector-tag">is</span> <span class="selector-tag">a</span> <span class="selector-tag">blockquote</span></span><br><span class="line">    &gt; <span class="selector-tag">inside</span> <span class="selector-tag">a</span> <span class="selector-tag">list</span> <span class="selector-tag">item</span>.</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><ul><li><p>A list item with a blockquote:</p><blockquote><p>This is a blockquote<br>inside a list item.</p></blockquote></li></ul><hr><h5 id="Code-Block"><a href="#Code-Block" class="headerlink" title="Code Block"></a>Code Block</h5><p>To put a code block within a list item, the code block needs to be indented twice — <strong>8 spaces</strong> or <strong>two tabs</strong>:</p><p>Code:</p><figure class="highlight clean"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">*   A list item <span class="keyword">with</span> a <span class="keyword">code</span> block:</span><br><span class="line"></span><br><span class="line">        &lt;<span class="keyword">code</span> goes here&gt;</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><ul><li><p>A list item with a code block:</p><pre><code>&lt;code goes here&gt;</code></pre></li></ul><hr><h5 id="Nested-List"><a href="#Nested-List" class="headerlink" title="Nested List"></a>Nested List</h5><p>Code:</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">*</span> A</span><br><span class="line"><span class="bullet">    *</span> A1</span><br><span class="line"><span class="bullet">    *</span> A2</span><br><span class="line"><span class="bullet">*</span> B</span><br><span class="line"><span class="bullet">*</span> C</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><ul><li>A<ul><li>A1</li><li>A2</li></ul></li><li>B</li><li>C</li></ul><hr><h3 id="Code-Blocks"><a href="#Code-Blocks" class="headerlink" title="Code Blocks"></a>Code Blocks</h3><p>HTML Tag: <code>&lt;pre&gt;</code></p><p>Indent every line of the block by at least <strong>4 spaces</strong> or <strong>1 tab</strong>.</p><p>Code:</p><figure class="highlight livecodeserver"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">This is <span class="keyword">a</span> <span class="keyword">normal</span> <span class="keyword">paragraph</span>:</span><br><span class="line"></span><br><span class="line">    This is <span class="keyword">a</span> code block.</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p>This is a normal paragraph:</p><pre><code>This is a code block.</code></pre><hr><p>A code block continues until it reaches a line that is not indented (or the end of the article).</p><p>Within a code block, <em><strong>ampersands (&amp;)</strong></em> and angle <strong>brackets (&lt; and &gt;)</strong> are automatically converted into HTML entities.</p><p>Code:</p><figure class="highlight perl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;div <span class="class"><span class="keyword">class</span>=&quot;<span class="title">thanclass</span>&quot;&gt;</span></span><br><span class="line"><span class="class">    &amp;<span class="title">copy</span></span>; <span class="number">2004</span> Foo Corporation</span><br><span class="line">&lt;/div&gt;</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><div class="thanclass">    &copy; 2004 Foo Corporation</div>***Following sections Fenced Code Blocks and Syntax Highlighting are extensions, you can use the other way to write the code block.#### Fenced Code BlocksJust wrap your code in \`\`\` \`\`\` (as shown below) and you won't need to indent it by four spaces.<p>Code:  </p><blockquote><p>Here’s an example:<br>&#96;&#96;&#96;<br>function test() {<br>    console.log(“notice the blank line before this function?”);<br>}<br>&#96;&#96;&#96;  </p></blockquote><p>Preview:</p><hr><p>Here’s an example:</p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">test</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&quot;notice the blank line before this function?&quot;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><hr><h4 id="Syntax-Highlighting"><a href="#Syntax-Highlighting" class="headerlink" title="Syntax Highlighting"></a>Syntax Highlighting</h4><p>In your fenced block, add an optional language identifier and we’ll run it through syntax highlighting (<a href="https://github.com/github/linguist/blob/master/lib/linguist/languages.yml">Support Languages</a>).</p><p>Code:</p><blockquote><p>&#96;&#96;&#96;ruby<br>require ‘redcarpet’<br>markdown &#x3D; Redcarpet.new(“Hello World!”)<br>puts markdown.to_html<br>&#96;&#96;&#96;    </p></blockquote><p>Preview:</p><hr><figure class="highlight ruby"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">require</span> <span class="string">&#x27;redcarpet&#x27;</span></span><br><span class="line">markdown = <span class="title class_">Redcarpet</span>.new(<span class="string">&quot;Hello World!&quot;</span>)</span><br><span class="line">puts markdown.to_html</span><br></pre></td></tr></table></figure><hr><h3 id="Horizontal-Rules"><a href="#Horizontal-Rules" class="headerlink" title="Horizontal Rules"></a>Horizontal Rules</h3><p>HTML Tag: <code>&lt;hr /&gt;</code><br>Places <strong>three or more hyphens (-), asterisks (*), or underscores (_)</strong> on a line by themselves. You may use spaces between the hyphens or asterisks.</p><p>Code:</p><figure class="highlight gams"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">* * *</span></span><br><span class="line"><span class="comment">***</span></span><br><span class="line"><span class="comment">*****</span></span><br><span class="line">- - -</span><br><span class="line">---------------------------------------</span><br><span class="line">___</span><br></pre></td></tr></table></figure><h3 id="Table"><a href="#Table" class="headerlink" title="Table"></a>Table</h3><p>HTML Tag: <code>&lt;table&gt;</code></p><p>It’s an extension.</p><p>Separates column by <strong>pipe (|)</strong> and header by <strong>dashes (-)</strong>, and uses <strong>colon (:)</strong> for alignment.</p><p>The outer <strong>pipes (|)</strong> and alignment are optional. There are <strong>3 delimiters</strong> each cell at least for separating header.</p><p>Code:</p><figure class="highlight gherkin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">|<span class="string"> Left </span>|<span class="string"> Center </span>|<span class="string"> Right </span>|</span><br><span class="line">|<span class="string">:-----</span>|<span class="string">:------:</span>|<span class="string">------:</span>|</span><br><span class="line">|<span class="string">aaa   </span>|<span class="string">bbb     </span>|<span class="string">ccc    </span>|</span><br><span class="line">|<span class="string">ddd   </span>|<span class="string">eee     </span>|<span class="string">fff    </span>|</span><br><span class="line"></span><br><span class="line"> A |<span class="string"> B </span></span><br><span class="line"><span class="string">---</span>|<span class="string">---</span></span><br><span class="line"><span class="string">123</span>|456</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">A |<span class="string">B </span></span><br><span class="line"><span class="string">--</span>|<span class="string">--</span></span><br><span class="line"><span class="string">12</span>|45</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><table><thead><tr><th align="left">Left</th><th align="center">Center</th><th align="right">Right</th></tr></thead><tbody><tr><td align="left">aaa</td><td align="center">bbb</td><td align="right">ccc</td></tr><tr><td align="left">ddd</td><td align="center">eee</td><td align="right">fff</td></tr></tbody></table><table><thead><tr><th>A</th><th>B</th></tr></thead><tbody><tr><td>123</td><td>456</td></tr></tbody></table><table><thead><tr><th>A</th><th>B</th></tr></thead><tbody><tr><td>12</td><td>45</td></tr></tbody></table><hr><h2 id="Span-Elements"><a href="#Span-Elements" class="headerlink" title="Span Elements"></a>Span Elements</h2><h3 id="Links"><a href="#Links" class="headerlink" title="Links"></a>Links</h3><p>HTML Tag: <code>&lt;a&gt;</code></p><p>Markdown supports two style of links: inline and reference.</p><h4 id="Inline"><a href="#Inline" class="headerlink" title="Inline"></a>Inline</h4><p>Inline link format like this: <code>[Link Text](URL &quot;Title&quot;)</code></p><p>Title is optional.</p><p>Code:</p><figure class="highlight maxima"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">This <span class="built_in">is</span> [an <span class="built_in">example</span>](http://<span class="built_in">example</span>.com/ <span class="string">&quot;Title&quot;</span>) inline link.</span><br><span class="line"></span><br><span class="line">[This link](http://<span class="built_in">example</span>.net/) has no <span class="built_in">title</span> attribute.</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p>This is <a href="http://example.com/" title="Title">an example</a> inline link.</p><p><a href="http://example.net/">This link</a> has no title attribute.</p><hr><p>If you’re referring to a local resource on the same server, you can use relative paths:</p><p>Code:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">See my <span class="selector-attr">[Tags]</span>(/tags/) <span class="attribute">page</span> for <span class="selector-tag">details</span>. </span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p>See my <a href="/tags/">Tags</a> page for details. </p><hr><h4 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h4><p>You could predefine link references. Format like this: <code>[id]: URL &quot;Title&quot;</code></p><p>Title is also optional. And the you refer the link, format like this: <code>[Link Text][id]</code></p><p>Code:</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[<span class="built_in">id</span>]: http://example.com/  <span class="string">&quot;Optional Title Here&quot;</span></span><br><span class="line">This is [an example][<span class="built_in">id</span>] reference-style <span class="built_in">link</span>.</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p>This is <a href="https://baidu.com/" title="这里是百度">点我跳转到百度</a> reference-style link.</p><hr><p>That is:</p><ul><li>Square brackets containing the link identifier (<strong>not case sensitive</strong>, optionally indented from the left margin using up to three spaces);</li><li>followed by a colon;</li><li>followed by one or more spaces (or tabs);</li><li>followed by the URL for the link;</li><li>The link URL may, optionally, be surrounded by angle brackets.</li><li>optionally followed by a title attribute for the link, enclosed in double or single quotes, or enclosed in parentheses.</li></ul><p>The following three link definitions are equivalent:</p><p>Code:</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">[<span class="symbol">foo</span>]: <span class="link">http://example.com/  &quot;Optional Title Here&quot;</span></span><br><span class="line">[<span class="symbol">foo</span>]: <span class="link">http://example.com/  &#x27;Optional Title Here&#x27;</span></span><br><span class="line">[<span class="symbol">foo</span>]: <span class="link">http://example.com/  (Optional Title Here)</span></span><br><span class="line">[<span class="symbol">foo</span>]: <span class="link">&lt;http://example.com/&gt;  &quot;Optional Title Here&quot;</span></span><br></pre></td></tr></table></figure><p>Uses an empty set of square brackets, the link text itself is used as the name.</p><p>Code:</p><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-attr">[Google]</span>: <span class="selector-tag">http</span>:<span class="comment">//google.com/</span></span><br><span class="line"><span class="selector-attr">[Google]</span><span class="selector-attr">[]</span></span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p><a href="http://google.com/">Google</a></p><hr><h3 id="Emphasis"><a href="#Emphasis" class="headerlink" title="Emphasis"></a>Emphasis</h3><p>HTML Tags: <code>&lt;em&gt;</code>, <code>&lt;strong&gt;</code></p><p>Markdown treats <strong>asterisks (*)</strong> and <strong>underscores (_)</strong> as indicators of emphasis. <strong>One delimiter</strong> will be  <code>&lt;em&gt;</code>; *<em>double delimiters</em> will be <code>&lt;strong&gt;</code>.</p><p>Code:</p><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="strong">*single asterisks*</span></span><br><span class="line"></span><br><span class="line"><span class="emphasis">_single underscores_</span></span><br><span class="line"></span><br><span class="line"><span class="strong">**double asterisks**</span></span><br><span class="line"></span><br><span class="line"><span class="emphasis">__double underscores__</span></span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p><em>single asterisks</em></p><p><em>single underscores</em></p><p><strong>double asterisks</strong></p><p><strong>double underscores</strong></p><hr><p>But if you surround an * or _ with spaces, it’ll be treated as a literal asterisk or underscore.</p><p>You can backslash escape it:</p><p>Code:</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">*<span class="keyword">this</span> text <span class="keyword">is</span> surrounded <span class="keyword">by</span> literal asterisks*</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p>*this text is surrounded by literal asterisks*</p><hr><h3 id="Code"><a href="#Code" class="headerlink" title="Code"></a>Code</h3><p>HTML Tag: <code>&lt;code&gt;</code></p><p>Wraps it with <strong>backtick quotes (&#96;)</strong>.</p><p>Code:</p><figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">Use</span> the `printf()` <span class="keyword">function</span>.</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p>Use the <code>printf()</code> function.</p><hr><p>To include a literal backtick character within a code span, you can use <strong>multiple backticks</strong> as the opening and closing delimiters:</p><p>Code:</p><figure class="highlight autohotkey"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">``There is a literal backtick (`) here.``</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p><code>There is a literal backtick (`) here.</code></p><hr><p>The backtick delimiters surrounding a code span may include spaces — one after the opening, one before the closing. This allows you to place literal backtick characters at the beginning or end of a code span:</p><p>Code:</p><figure class="highlight less"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">A</span> <span class="selector-tag">single</span> <span class="selector-tag">backtick</span> <span class="selector-tag">in</span> <span class="selector-tag">a</span> <span class="selector-tag">code</span> <span class="selector-tag">span</span>: `` ` ``</span><br><span class="line"></span><br><span class="line"><span class="selector-tag">A</span> <span class="selector-tag">backtick-delimited</span> <span class="selector-tag">string</span> <span class="selector-tag">in</span> <span class="selector-tag">a</span> <span class="selector-tag">code</span> <span class="selector-tag">span</span>: `` `<span class="selector-tag">foo</span>` ``</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p>A single backtick in a code span: <code>`</code></p><p>A backtick-delimited string in a code span: <code>`foo`</code></p><hr><h3 id="Images"><a href="#Images" class="headerlink" title="Images"></a>Images</h3><p>HTML Tag: <code>&lt;img /&gt;</code></p><p>Markdown uses an image syntax that is intended to resemble the syntax for links, allowing for two styles: inline and reference.</p><h4 id="Inline-1"><a href="#Inline-1" class="headerlink" title="Inline"></a>Inline</h4><p>Inline image syntax looks like this: <code>![Alt text](URL &quot;Title&quot;)</code></p><p>Title is optional.</p><p>Code:</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">!<span class="selector-attr">[Alt text]</span>(/<span class="selector-tag">path</span>/<span class="selector-tag">to</span>/<span class="selector-tag">img</span><span class="selector-class">.jpg</span>)</span><br><span class="line"></span><br><span class="line">!<span class="selector-attr">[Alt text]</span>(/<span class="selector-tag">path</span>/<span class="selector-tag">to</span>/<span class="selector-tag">img</span><span class="selector-class">.jpg</span> &quot;Optional title&quot;)</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p><img src="/images/favicon.png" alt="Alt text"></p><p><img src="/images/favicon.png" alt="Alt text" title="Optional title"></p><hr><p>That is:</p><ul><li>An exclamation mark: !;</li><li>followed by a set of square brackets, containing the alt attribute text for the image;</li><li>followed by a set of parentheses, containing the URL or path to the image, and an optional title attribute enclosed in double or single quotes.</li></ul><h4 id="Reference-1"><a href="#Reference-1" class="headerlink" title="Reference"></a>Reference</h4><p>Reference-style image syntax looks like this: <code>![Alt text][id]</code></p><p>Code:</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[img <span class="built_in">id</span>]: url/<span class="keyword">to</span>/image  <span class="string">&quot;Optional title attribute&quot;</span></span><br><span class="line">![Alt <span class="built_in">text</span>][img <span class="built_in">id</span>]</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p><img src="/images/favicon.png" alt="Alt text" title="Optional title attribute"></p><hr><h3 id="Strikethrough"><a href="#Strikethrough" class="headerlink" title="Strikethrough"></a>Strikethrough</h3><p>HTML Tag: <code>&lt;del&gt;</code></p><p>It’s an extension.</p><p>GFM adds syntax to strikethrough text.</p><p>Code:</p><figure class="highlight applescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">~~Mistaken <span class="built_in">text</span>.~~</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p><del>Mistaken text.</del></p><hr><h2 id="Miscellaneous"><a href="#Miscellaneous" class="headerlink" title="Miscellaneous"></a>Miscellaneous</h2><h3 id="Automatic-Links"><a href="#Automatic-Links" class="headerlink" title="Automatic Links"></a>Automatic Links</h3><p>Markdown supports a shortcut style for creating “automatic” links for URLs and email addresses: simply surround the URL or email address with angle brackets. </p><p>Code:</p><figure class="highlight angelscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;http:<span class="comment">//example.com/&gt;</span></span><br><span class="line"></span><br><span class="line">&lt;<span class="symbol">address@</span>example.com&gt;</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p><a href="http://example.com/">http://example.com/</a></p><p><a href="mailto:&#97;&#x64;&#100;&#x72;&#x65;&#115;&#115;&#64;&#x65;&#120;&#x61;&#x6d;&#x70;&#x6c;&#x65;&#x2e;&#x63;&#x6f;&#109;">&#97;&#x64;&#100;&#x72;&#x65;&#115;&#115;&#64;&#x65;&#120;&#x61;&#x6d;&#x70;&#x6c;&#x65;&#x2e;&#x63;&#x6f;&#109;</a></p><hr><p>GFM will autolink standard URLs.</p><p>Code:</p><figure class="highlight dts"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">https:</span><span class="comment">//github.com/xcss</span></span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p><a href="https://github.com/xcss">https://github.com/xcss</a></p><hr><h3 id="Backslash-Escapes"><a href="#Backslash-Escapes" class="headerlink" title="Backslash Escapes"></a>Backslash Escapes</h3><p>Markdown allows you to use backslash escapes to generate literal characters which would otherwise have special meaning in Markdown’s formatting syntax.</p><p>Code:</p><figure class="highlight asciidoc"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">\*literal asterisks\*</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p>*literal asterisks*</p><hr><p>Markdown provides backslash escapes for the following characters:</p><p>Code:</p><figure class="highlight mipsasm"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">\   <span class="keyword">backslash</span></span><br><span class="line"><span class="keyword"></span>`   <span class="keyword">backtick</span></span><br><span class="line"><span class="keyword"></span>*   asterisk</span><br><span class="line">_   underscore</span><br><span class="line">&#123;&#125;  curly <span class="keyword">braces</span></span><br><span class="line"><span class="keyword"></span>[]  square <span class="keyword">brackets</span></span><br><span class="line"><span class="keyword"></span>()  parentheses</span><br><span class="line"><span class="comment">#   hash mark</span></span><br><span class="line">+   plus sign</span><br><span class="line">-   minus sign (hyphen)</span><br><span class="line">.   dot</span><br><span class="line">!   exclamation mark</span><br></pre></td></tr></table></figure><h2 id="Inline-HTML"><a href="#Inline-HTML" class="headerlink" title="Inline HTML"></a>Inline HTML</h2><p>For any markup that is not covered by Markdown’s syntax, you simply use HTML itself. There’s no need to preface it or delimit it to indicate that you’re switching from Markdown to HTML; you just use the tags.</p><p>Code:</p><figure class="highlight xquery"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">This <span class="literal">is</span> a regular paragraph.</span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">table</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    </span><span class="language-xml"><span class="tag">&lt;<span class="name">tr</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        </span><span class="language-xml"><span class="tag">&lt;<span class="name">td</span>&gt;</span>Foo<span class="tag">&lt;/<span class="name">td</span>&gt;</span></span><span class="language-xml"></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;/<span class="name">tr</span>&gt;</span></span><span class="language-xml"></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;/<span class="name">table</span>&gt;</span></span></span><br><span class="line"></span><br><span class="line">This <span class="literal">is</span> another regular paragraph.</span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p>This is a regular paragraph.</p><table>    <tr>        <td>Foo</td>    </tr></table>This is another regular paragraph.***Note that Markdown formatting syntax is **not processed within block-level HTML tags**. <p>Unlike block-level HTML tags, Markdown syntax is <strong>processed within span-level tags</strong>.</p><p>Code:</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">span</span>&gt;</span>**Work**<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span>&gt;</span></span><br><span class="line">    **No Work**</span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure><p>Preview:</p><hr><p><span><strong>Work</strong></span></p><div>  **No Work**</div>***<blockquote><p>参考文档: <a href="http://www.markdown.cn/">http://www.markdown.cn/</a></p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;img src=&quot;https://img2.imgtp.com/2024/03/23/6KjbB2RQ.jpg&quot;&gt;&lt;/p&gt;
&lt;h1 id=&quot;Markdown&quot;&gt;&lt;a href=&quot;#Markdown&quot; class=&quot;headerlink&quot; title=&quot;Markdown&quot;&gt;
      
    
    </summary>
    
    
      <category term="学习笔记" scheme="https://ioliu.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="MarkDown" scheme="https://ioliu.cn/tags/MarkDown/"/>
    
      <category term="Guide" scheme="https://ioliu.cn/tags/Guide/"/>
    
  </entry>
  
  <entry>
    <title>响应式设计 (Responsive Design) 中常用的媒体查询</title>
    <link href="https://ioliu.cn/2016/commonly-used-media-queries/"/>
    <id>https://ioliu.cn/2016/commonly-used-media-queries/</id>
    <published>2016-05-11T11:21:08.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://img2.imgtp.com/2024/03/23/50Kg2g5x.png"></p><p>现在Web朝着响应式的趋势发展，媒体查询在创建响应式网站中起到了主要作用。</p><p>没有媒体查询几乎不能实现响应式设计，利用媒体查询，我们可以针对特定的设备，如显示器、智能手机和平板，写CSS。</p><blockquote><p>媒体查询是响应式设计的核心</p></blockquote><p>在这篇文章中我将分享一些到目前为止我收集到的常用媒体查询。在一些示例中，我可能是错误的，但是不用担心，因为我针对这个开通了评论功能。我把它们分为<code>显示器媒体查询</code>、<code>智能手机媒体查询</code>和<code>平板媒体查询</code> </p><h1 id="显示器媒体查询"><a href="#显示器媒体查询" class="headerlink" title="显示器媒体查询"></a>显示器媒体查询</h1><p>显示器媒体查询是以屏幕大小为基础划分的 </p><h2 id="640px"><a href="#640px" class="headerlink" title="640px"></a>640px</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">640px</span>)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="800px"><a href="#800px" class="headerlink" title="800px"></a>800px</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">800px</span>)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="1024px"><a href="#1024px" class="headerlink" title="1024px"></a>1024px</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">1024px</span>)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="智能手机媒体查询"><a href="#智能手机媒体查询" class="headerlink" title="智能手机媒体查询"></a>智能手机媒体查询</h1><p>适用于大部分主流智能手机 </p><h2 id="iPhone-2G-4S"><a href="#iPhone-2G-4S" class="headerlink" title="iPhone(2G-4S)"></a>iPhone(2G-4S)</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*Landscape Mode*/</span></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">480px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>:landscape)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Portrait Mode */</span></span><br><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">320px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>:portrait)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="iPhone-4"><a href="#iPhone-4" class="headerlink" title="iPhone 4"></a>iPhone 4</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@media</span> <span class="keyword">only</span> screen <span class="keyword">and</span> (-webkit-min-device-pixel-ratio : <span class="number">1.5</span>),</span><br><span class="line"><span class="keyword">only</span> screen <span class="keyword">and</span> (min-device-pixel-ratio : <span class="number">1.5</span>)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="iPhone-5"><a href="#iPhone-5" class="headerlink" title="iPhone 5"></a>iPhone 5</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@media</span> <span class="keyword">only</span> screen</span><br><span class="line"><span class="keyword">and</span> (min-device-width : <span class="number">320px</span>)</span><br><span class="line"><span class="keyword">and</span> (max-device-width : <span class="number">568px</span>)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="iPhone-6"><a href="#iPhone-6" class="headerlink" title="iPhone 6"></a>iPhone 6</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@media</span> <span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">min-device-width</span>: <span class="number">375px</span>) <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">667px</span>)</span><br><span class="line"><span class="keyword">and</span> (<span class="attribute">orientation</span> : portrait) &#123;</span><br><span class="line">    <span class="comment">/*iPhone 6 Portrait*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@media</span> <span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">min-device-width</span>: <span class="number">375px</span>) <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">667px</span>)</span><br><span class="line"> <span class="keyword">and</span> (<span class="attribute">orientation</span> : landscape) &#123;</span><br><span class="line">    <span class="comment">/*iPhone 6 landscape*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@media</span> <span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">min-device-width</span>: <span class="number">414px</span>) <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">736px</span>)</span><br><span class="line"><span class="keyword">and</span> (<span class="attribute">orientation</span> : portrait) &#123;</span><br><span class="line">    <span class="comment">/*iPhone 6+ Portrait*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@media</span> <span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">min-device-width</span>: <span class="number">414px</span>) <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">736px</span>)</span><br><span class="line"><span class="keyword">and</span> (<span class="attribute">orientation</span> : landscape) &#123;</span><br><span class="line">    <span class="comment">/*iPhone 6+ landscape*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@media</span> <span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">640px</span>),</span><br><span class="line"> <span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">667px</span>),</span><br><span class="line"><span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">480px</span>)&#123;</span><br><span class="line">    <span class="comment">/*iPhone 6 and iPhone 6+ portrait and landscape*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@media</span> <span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">640px</span>),</span><br><span class="line"><span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">667px</span>),</span><br><span class="line"><span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">480px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span> : portrait)&#123;</span><br><span class="line">    <span class="comment">/*iPhone 6 and iPhone 6+ portrait*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">@media</span> <span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">640px</span>),</span><br><span class="line"><span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">667px</span>),</span><br><span class="line"><span class="keyword">only</span> screen <span class="keyword">and</span> (<span class="attribute">max-width</span>: <span class="number">480px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span> : landscape)&#123;</span><br><span class="line">    <span class="comment">/*iPhone 6 and iPhone 6+ landscape*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="HTC-Evo，BlackBerry-Torch，HTC-Thunderbolt，HD2"><a href="#HTC-Evo，BlackBerry-Torch，HTC-Thunderbolt，HD2" class="headerlink" title="HTC Evo，BlackBerry Torch，HTC Thunderbolt，HD2"></a>HTC Evo，BlackBerry Torch，HTC Thunderbolt，HD2</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@media</span> screen <span class="keyword">and</span> (<span class="attribute">max-device-width</span>: <span class="number">480px</span>)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h1 id="平板媒体查询"><a href="#平板媒体查询" class="headerlink" title="平板媒体查询"></a>平板媒体查询</h1><h2 id="iPad-iPad-2-iPad-3"><a href="#iPad-iPad-2-iPad-3" class="headerlink" title="iPad &#x2F; iPad 2 &#x2F; iPad 3"></a>iPad &#x2F; iPad 2 &#x2F; iPad 3</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* Landscape Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">1024px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: landscape)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Portrait Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">768px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: portrait)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="iPad-Mini"><a href="#iPad-Mini" class="headerlink" title="iPad Mini"></a>iPad Mini</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@media</span> <span class="keyword">only</span> screen</span><br><span class="line"><span class="keyword">and</span> (min-device-width : <span class="number">768px</span>)</span><br><span class="line"><span class="keyword">and</span> (max-device-width : <span class="number">1024px</span>)</span><br><span class="line"><span class="keyword">and</span> (<span class="attribute">-webkit-min-device-pixel-ratio</span>: <span class="number">1</span>)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Samsung-Galaxy-Tab-10-1-Motorola-Xoom-Lenovo-Thinkpad-Tablet-Sony-Tablet-S"><a href="#Samsung-Galaxy-Tab-10-1-Motorola-Xoom-Lenovo-Thinkpad-Tablet-Sony-Tablet-S" class="headerlink" title="Samsung Galaxy Tab 10.1 &#x2F; Motorola Xoom &#x2F; Lenovo Thinkpad Tablet &#x2F; Sony Tablet S"></a>Samsung Galaxy Tab 10.1 &#x2F; Motorola Xoom &#x2F; Lenovo Thinkpad Tablet &#x2F; Sony Tablet S</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* Landscape Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">1280px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: landscape)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Portrait Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">800px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: portrait)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="HTC-Flyer-BlackBerry-PlayBook"><a href="#HTC-Flyer-BlackBerry-PlayBook" class="headerlink" title="HTC Flyer &#x2F; BlackBerry PlayBook"></a>HTC Flyer &#x2F; BlackBerry PlayBook</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* Landscape Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">1024px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: landscape)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Portrait Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">600px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: portrait)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="HP-TouchPad"><a href="#HP-TouchPad" class="headerlink" title="HP TouchPad"></a>HP TouchPad</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* Landscape Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">1024px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: landscape)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Portrait Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">768px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: portrait)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="T-Mobile-G-Slate"><a href="#T-Mobile-G-Slate" class="headerlink" title="T-Mobile G-Slate"></a>T-Mobile G-Slate</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* Landscape Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">1280px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: landscape)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Portrait Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">768px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: portrait)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="ViewSonic-ViewPad-10"><a href="#ViewSonic-ViewPad-10" class="headerlink" title="ViewSonic ViewPad 10"></a>ViewSonic ViewPad 10</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* Landscape Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">1024px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: landscape)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Portrait Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">600px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: portrait)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="Dell-Streak-7"><a href="#Dell-Streak-7" class="headerlink" title="Dell Streak 7"></a>Dell Streak 7</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* Landscape Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">800px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: landscape)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Portrait Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">400px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: portrait)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="ASUS-Eee-Pad-Transformer"><a href="#ASUS-Eee-Pad-Transformer" class="headerlink" title="ASUS Eee Pad Transformer"></a>ASUS Eee Pad Transformer</h2><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* Landscape Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">1080px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: landscape)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">/* Portrait Mode */</span></span><br><span class="line"><span class="keyword">@media</span> (<span class="attribute">max-device-width</span>: <span class="number">800px</span>) <span class="keyword">and</span> (<span class="attribute">orientation</span>: portrait)&#123;</span><br><span class="line">    <span class="comment">/*some rules*/</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="其他参考文档"><a href="#其他参考文档" class="headerlink" title="其他参考文档"></a>其他参考文档</h2><ol><li><a href="http://www.w3cplus.com/css3/7-habits-of-highly-effective-media-queries.html">七个高度有效的媒体查询技巧</a> </li><li><a href="http://www.w3cplus.com/css3/css-media-queries-for-iPads-and-iPhones.html">iPads和iPhones的Media Queries</a></li><li><a href="https://css-tricks.com/snippets/css/media-queries-for-standard-devices/">media-queries-for-standard-devices</a></li></ol><hr><blockquote><p>本文转载自<a href="http://www.ido321.com/">淡忘~浅思</a>,略有删改,侵权即删.<br>原文链接: <a href="http://www.xpertdeveloper.com/2012/08/media-queries-for-responsive-design/">Some Media Queries for Responsive Design</a><br>译文链接: <a href="http://www.ido321.com/1540.html">【译】Responsive Design常用的媒体查询</a>   </p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;img src=&quot;https://img2.imgtp.com/2024/03/23/50Kg2g5x.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在Web朝着响应式的趋势发展，媒体查询在创建响应式网站中起到了主要作用。&lt;/p&gt;
&lt;p&gt;没有媒体查询几乎不能实现响应式设计，利用媒体查询，我
      
    
    </summary>
    
    
      <category term="学习笔记" scheme="https://ioliu.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="Media Query" scheme="https://ioliu.cn/tags/Media-Query/"/>
    
      <category term="响应式" scheme="https://ioliu.cn/tags/%E5%93%8D%E5%BA%94%E5%BC%8F/"/>
    
      <category term="媒体查询" scheme="https://ioliu.cn/tags/%E5%AA%92%E4%BD%93%E6%9F%A5%E8%AF%A2/"/>
    
  </entry>
  
  <entry>
    <title>生成 SSH Key 免密码提交 GitHub</title>
    <link href="https://ioliu.cn/2015/generating-ssh-key/"/>
    <id>https://ioliu.cn/2015/generating-ssh-key/</id>
    <published>2015-12-13T02:19:18.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://img2.imgtp.com/2024/03/23/jRgolyAx.jpg"><br>之前上传文件到 GitHub 的时候，一直都是用的账号密码登录，每次提交都弹个窗体出来，感觉烦死了。。。今天有空，就来捣鼓下 <code>SSH Key</code>。</p><h3 id="Step1-检查是否已经存在-SSH-Key"><a href="#Step1-检查是否已经存在-SSH-Key" class="headerlink" title="Step1. 检查是否已经存在 SSH Key"></a>Step1. 检查是否已经存在 SSH Key</h3><p>运行 <code>Git Bush</code> 客户端，执行以下代码： </p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">ls</span> -al ~/.ssh</span> </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果存在，将会列出.ssh 目录下的所有文件</span></span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 如果不存在则会给出如下提示</span></span><br><span class="line"><span class="built_in">ls</span>: cannot open directory /Users/you/.ssh: Permission denied</span><br></pre></td></tr></table></figure><p>检查列出来的目录，看看是否已经有了一个 <code>SSH Key</code>。默认情况下，key 的文件名是下列之一：<br>    &gt; id_dsa.pub<br>    &gt; id_ecdsa.pub<br>    &gt; id_ed25519.pub<br>    &gt; id_rsa.pub </p><blockquote><p>如果已经存在(如 <code>id_rsa</code> 和 <code>id_rsa.pub</code>)而且你想使用已经存在的密钥对直接连接 GitHub ，那么可以跳过 <strong>Step2</strong>，直接进入 <strong>Step3</strong> </p></blockquote><h3 id="Step2-生成-SSH-Key"><a href="#Step2-生成-SSH-Key" class="headerlink" title="Step2. 生成 SSH Key"></a>Step2. 生成 SSH Key</h3><p>复制下面的代码(<code>记得请将email修改成自己的email地址</code>)： </p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ ssh-keygen -t rsa -b <span class="number">4096</span> -C <span class="string">&quot;your_name@example.com&quot;</span> </span><br><span class="line">Generating <span class="keyword">public</span>/<span class="keyword">private</span> rsa key pair.</span><br></pre></td></tr></table></figure><p>这里 GitHub 的建议是保持默认，所以只需要按 <code>Enter</code> 继续： </p><figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Enter <span class="keyword">file</span> in which to save the key (<span class="regexp">/Users/y</span>ou<span class="regexp">/.ssh/i</span>d_rsa): [Press Enter]</span><br></pre></td></tr></table></figure><p>如果存在，将会提示是否覆盖： </p><figure class="highlight awk"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="regexp">/Users/y</span>ou<span class="regexp">/.ssh/i</span>d_rsa already exists.</span><br><span class="line">Overwrite (y/n)?</span><br></pre></td></tr></table></figure><p>继续后会提示输入密码： </p><figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Enter passphrase (empty <span class="keyword">for</span> no passphrase): [<span class="keyword">Type</span> <span class="type">a </span>passphrase]</span><br><span class="line">Enter same passphrase again: [<span class="keyword">Type</span> <span class="type">passphrase </span>again]</span><br></pre></td></tr></table></figure><p>然后你就会得到你的 <code>SSH Key</code> 的指纹，看起来像下面的代码： </p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">Your</span> identification has been saved in /Users/you/.ssh/id_rsa.</span><br><span class="line"><span class="attribute">Your</span> public key has been saved in /Users/you/.ssh/id_rsa.pub.</span><br><span class="line"><span class="attribute">The</span> key fingerprint is:</span><br><span class="line"><span class="attribute">01</span>:<span class="number">0</span>f:f4:<span class="number">3</span>b:ca:<span class="number">85</span>:d6:<span class="number">17</span>:a1:<span class="number">7</span>d:f0:<span class="number">68</span>:<span class="number">9</span>d:f0:a2:db your_email@example.com</span><br></pre></td></tr></table></figure><h3 id="Step3-添加-SSH-Key-到-GitHub"><a href="#Step3-添加-SSH-Key-到-GitHub" class="headerlink" title="Step3. 添加 SSH Key 到 GitHub"></a>Step3. 添加 SSH Key 到 GitHub</h3><p>先拷贝 <code>id_rsa.pub</code> 文件的内容，可以用编辑器打开然后复制，也可以用 git 命令复制： </p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">clip</span> &lt; ~<span class="regexp">/.ssh/i</span>d_rsa.pub</span><br></pre></td></tr></table></figure><p>进入 GitHub <a href="https://github.com/settings">账户设置</a>，点击左边 <a href="https://github.com/settings/ssh">SSH Key</a> ，点击 <code>Add SSH key</code> ，粘贴刚刚复制的内容，然后保存。<br>输入 GitHub 账户的密码就能看到刚刚添加的 SSH Key 了。 </p><h3 id="Step4-测试是否添加成功"><a href="#Step4-测试是否添加成功" class="headerlink" title="Step4. 测试是否添加成功"></a>Step4. 测试是否添加成功</h3><p>在 <code>Git Bush</code> 中输入下面的代码，然后回车 </p><figure class="highlight crystal"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$ </span>ssh -T git<span class="variable">@GitHub</span>.com</span><br><span class="line"><span class="comment"># Attempts to ssh to GitHub</span></span><br></pre></td></tr></table></figure><p>会得到如下的指纹提示：键入<code>yes</code> </p><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">The</span> authenticity of host &#x27;GitHub.com (<span class="number">207.97.227.239</span>)&#x27; can&#x27;t be established.</span><br><span class="line"><span class="attribute">RSA</span> key fingerprint is <span class="number">16</span>:<span class="number">27</span>:ac:a5:<span class="number">76</span>:<span class="number">28</span>:<span class="number">2</span>d:<span class="number">36</span>:<span class="number">63</span>:<span class="number">1</span>b:<span class="number">56</span>:<span class="number">4</span>d:eb:df:a6:<span class="number">48</span>.</span><br><span class="line"><span class="attribute">Are</span> you sure you want to continue connecting (yes/no)?</span><br></pre></td></tr></table></figure><p>如果出现下面的提示，恭喜你，验证成功。 </p><figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Hi username! You<span class="symbol">&#x27;ve</span> successfully authenticated, but GitHub does <span class="keyword">not</span> provide shell <span class="keyword">access</span>.</span><br></pre></td></tr></table></figure><blockquote><p>如果你看到的是 <code>access denied(拒绝访问)</code> ，可以<a href="https://help.github.com/articles/error-permission-denied-publickey">点击这里</a> ，查看解决办法。  </p></blockquote><p>然后将https替换成ssh重新下载下代码，就OK了~~~</p><p><em><strong>Good Luck</strong></em>  </p><p>** 参考文档 **</p><ol><li><a href="https://help.github.com/articles/generating-ssh-keys/">Generating SSH keys</a></li></ol><hr>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;img src=&quot;https://img2.imgtp.com/2024/03/23/jRgolyAx.jpg&quot;&gt;&lt;br&gt;之前上传文件到 GitHub 的时候，一直都是用的账号密码登录，每次提交都弹个窗体出来，感觉烦死了。。。今天有空，就来捣鼓下 &lt;code&gt;SSH Ke
      
    
    </summary>
    
    
      <category term="学习笔记" scheme="https://ioliu.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="GitHub" scheme="https://ioliu.cn/tags/GitHub/"/>
    
      <category term="SSH Key" scheme="https://ioliu.cn/tags/SSH-Key/"/>
    
      <category term="免密码" scheme="https://ioliu.cn/tags/%E5%85%8D%E5%AF%86%E7%A0%81/"/>
    
  </entry>
  
  <entry>
    <title>前端 JavaScript 规范</title>
    <link href="https://ioliu.cn/2015/the-front-end-javascript-specification/"/>
    <id>https://ioliu.cn/2015/the-front-end-javascript-specification/</id>
    <published>2015-05-12T04:53:34.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://img2.imgtp.com/2024/03/23/f95idnmO.jpg"></p><h2 id="类型"><a href="#类型" class="headerlink" title="类型"></a>类型</h2><p><strong>原始值</strong>:相当于传值(JavaScript对象都提供了字面量)，使用字面量创建对象。  </p><ul><li><code>string</code></li><li><code>number</code></li><li><code>boolean</code></li><li><code>null</code></li><li><code>undefined</code></li></ul><figure class="highlight apache"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="attribute">var</span> foo = <span class="number">1</span>,</span><br><span class="line">    <span class="attribute">bar</span> = foo;</span><br><span class="line"><span class="attribute">bar</span> = <span class="number">9</span>;</span><br><span class="line"><span class="attribute">console</span>.log(foo, bar); // =&gt; <span class="number">1</span>, <span class="number">9</span></span><br></pre></td></tr></table></figure><p><strong>复杂类型</strong>:相当于传引用  </p><ul><li><code>object</code></li><li><code>array</code></li><li><code>function</code></li></ul><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> foo = [<span class="number">1</span>, <span class="number">2</span>],</span><br><span class="line">    bar = foo;</span><br><span class="line">bar[<span class="number">0</span>] = <span class="number">9</span>;</span><br><span class="line"><span class="built_in">console</span>.<span class="built_in">log</span>(foo[<span class="number">0</span>], bar[<span class="number">0</span>]); <span class="comment">// =&gt; 9, 9</span></span><br></pre></td></tr></table></figure><h2 id="对象"><a href="#对象" class="headerlink" title="对象"></a>对象</h2><ol><li>使用<code>字面值</code>创建对象  <figure class="highlight dart"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> item = <span class="keyword">new</span> <span class="built_in">Object</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> item = &#123;&#125;;</span><br></pre></td></tr></table></figure></li><li>不要使用保留字 <a href="https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Reserved_Words">reserved words</a> 作为键  <figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> superman = &#123;</span><br><span class="line">  <span class="keyword">class</span>: <span class="string">&#x27;superhero&#x27;</span>,</span><br><span class="line">  <span class="keyword">default</span>: &#123; clark: <span class="string">&#x27;kent&#x27;</span> &#125;,</span><br><span class="line">  <span class="keyword">private</span>: <span class="literal">true</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> superman = &#123;</span><br><span class="line">  klass: <span class="string">&#x27;superhero&#x27;</span>,</span><br><span class="line">  defaults: &#123; clark: <span class="string">&#x27;kent&#x27;</span> &#125;,</span><br><span class="line">  hidden: <span class="literal">true</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li></ol><h2 id="数组"><a href="#数组" class="headerlink" title="数组"></a>数组</h2><ol><li>使用<code>字面值</code>创建数组  <figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> items = <span class="keyword">new</span> <span class="built_in">Array</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> items = [];</span><br></pre></td></tr></table></figure></li><li>如果你不知道数组的长度，使用<code>push</code>  <figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> someStack = [];</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line">someStack[someStack.<span class="built_in">length</span>] = <span class="string">&#x27;abracadabra&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">someStack.<span class="built_in">push</span>(<span class="string">&#x27;abracadabra&#x27;</span>);</span><br></pre></td></tr></table></figure></li><li>当你需要拷贝数组时使用<code>slice</code>  .  <a href="http://jsperf.com/converting-arguments-to-an-array/7">jsPerf</a>  <figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> len = items.<span class="built_in">length</span>,</span><br><span class="line">    itemsCopy = [],</span><br><span class="line">    i;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; len; i++) &#123;</span><br><span class="line">  itemsCopy[i] = items[i];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">itemsCopy = items.<span class="built_in">slice</span>();</span><br></pre></td></tr></table></figure></li><li>使用<code>slice</code>将<code>类数组</code>的对象转成数组.<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">trigger</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">var</span> args = [].<span class="built_in">slice</span>.apply(arguments);</span><br><span class="line">  ...</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h2 id="字符串"><a href="#字符串" class="headerlink" title="字符串"></a>字符串</h2><ol><li>对字符串使用单引号 <code>&#39;&#39;</code>(因为大多时候我们的字符串。特别html会出现<code>&quot;</code>)<figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> name = <span class="string">&quot;Bob Parr&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> name = <span class="string">&#x27;Bob Parr&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> fullName = <span class="string">&quot;Bob &quot;</span> + <span class="keyword">this</span>.lastName;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> fullName = <span class="string">&#x27;Bob &#x27;</span> + <span class="keyword">this</span>.lastName;</span><br></pre></td></tr></table></figure></li><li>超过80(也有规定140的，项目具体可制定)个字符的字符串应该使用字符串连接换行<br><strong><code>!!!</code></strong>: 如果过度使用，长字符串连接可能会对性能有影响. <a href="http://jsperf.com/ya-string-concat">jsPerf</a> &amp; <a href="https://github.com/airbnb/javascript/issues/40">Discussion</a>  <figure class="highlight vhdl"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">// bad</span><br><span class="line">var errorMessage = <span class="symbol">&#x27;This</span> <span class="keyword">is</span> a super long <span class="literal">error</span> that was thrown because <span class="keyword">of</span> Batman. <span class="keyword">When</span> you stop <span class="keyword">to</span> think about how Batman had anything <span class="keyword">to</span> do <span class="keyword">with</span> this, you would get nowhere fast.&#x27;;</span><br><span class="line"></span><br><span class="line">// bad</span><br><span class="line">var errorMessage = <span class="symbol">&#x27;This</span> <span class="keyword">is</span> a super long <span class="literal">error</span> that \</span><br><span class="line">was thrown because <span class="keyword">of</span> Batman. \</span><br><span class="line"><span class="keyword">When</span> you stop <span class="keyword">to</span> think about \</span><br><span class="line">how Batman had anything <span class="keyword">to</span> do \</span><br><span class="line"><span class="keyword">with</span> this, you would get nowhere \</span><br><span class="line">fast.&#x27;;</span><br><span class="line"></span><br><span class="line">// good</span><br><span class="line">var errorMessage = <span class="symbol">&#x27;This</span> <span class="keyword">is</span> a super long <span class="literal">error</span> that &#x27; +</span><br><span class="line">  <span class="symbol">&#x27;was</span> thrown because <span class="keyword">of</span> Batman.&#x27; +</span><br><span class="line">  <span class="symbol">&#x27;When</span> you stop <span class="keyword">to</span> think about &#x27; +</span><br><span class="line">  <span class="symbol">&#x27;how</span> Batman had anything <span class="keyword">to</span> do &#x27; +</span><br><span class="line">  <span class="symbol">&#x27;with</span> this, you would get nowhere &#x27; +</span><br><span class="line">  <span class="symbol">&#x27;fast</span>.&#x27;;</span><br></pre></td></tr></table></figure></li><li>编程时使用<code>join</code>而不是字符串连接来构建字符串，特别是IE: <a href="http://jsperf.com/string-vs-array-concat/2">jsPerf</a>.<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> items,</span><br><span class="line">    messages,</span><br><span class="line">    <span class="built_in">length</span>, i;</span><br><span class="line"></span><br><span class="line">messages = [&#123;</span><br><span class="line">    <span class="attr">state</span>: <span class="string">&#x27;success&#x27;</span>,</span><br><span class="line">    <span class="attr">message</span>: <span class="string">&#x27;This one worked.&#x27;</span></span><br><span class="line">&#125;,&#123;</span><br><span class="line">    <span class="attr">state</span>: <span class="string">&#x27;success&#x27;</span>,</span><br><span class="line">    <span class="attr">message</span>: <span class="string">&#x27;This one worked as well.&#x27;</span></span><br><span class="line">&#125;,&#123;</span><br><span class="line">    <span class="attr">state</span>: <span class="string">&#x27;error&#x27;</span>,</span><br><span class="line">    <span class="attr">message</span>: <span class="string">&#x27;This one did not work.&#x27;</span></span><br><span class="line">&#125;];</span><br><span class="line"></span><br><span class="line"><span class="built_in">length</span> = messages.<span class="built_in">length</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">inbox</span>(<span class="params">messages</span>) &#123;</span><br><span class="line">  items = <span class="string">&#x27;&lt;ul&gt;&#x27;</span>;</span><br><span class="line">  <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; <span class="built_in">length</span>; i++) &#123;</span><br><span class="line">    items += <span class="string">&#x27;&lt;li&gt;&#x27;</span> + messages[i].message + <span class="string">&#x27;&lt;/li&gt;&#x27;</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> items + <span class="string">&#x27;&lt;/ul&gt;&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">inbox</span>(<span class="params">messages</span>) &#123;</span><br><span class="line">  items = [];</span><br><span class="line">  <span class="keyword">for</span> (i = <span class="number">0</span>; i &lt; <span class="built_in">length</span>; i++) &#123;</span><br><span class="line">    items[i] = messages[i].message;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="string">&#x27;&lt;ul&gt;&lt;li&gt;&#x27;</span> + items.join(<span class="string">&#x27;&lt;/li&gt;&lt;li&gt;&#x27;</span>) + <span class="string">&#x27;&lt;/li&gt;&lt;/ul&gt;&#x27;</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h2 id="函数"><a href="#函数" class="headerlink" title="函数"></a>函数</h2><ol><li>函数表达式:<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 匿名函数表达式</span></span><br><span class="line"><span class="keyword">var</span> anonymous = <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 有名函数表达式</span></span><br><span class="line"><span class="keyword">var</span> named = <span class="keyword">function</span> <span class="title function_">named</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 立即调用函数表达式</span></span><br><span class="line">(<span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;Welcome to the Internet. Please follow me.&#x27;</span>);</span><br><span class="line">&#125;)();</span><br></pre></td></tr></table></figure></li><li>绝对不要在一个非函数块里声明一个函数，把那个函数赋给一个变量。浏览器允许你这么做，但是它们解析不同。</li><li><strong><code>注</code></strong>: ECMA-262定义把<code>块</code>定义为一组语句，函数声明不是一个语句。<a href="http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf#page=97">阅读ECMA-262对这个问题的说明</a>.<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">if</span> (currentUser) &#123;</span><br><span class="line">  <span class="keyword">function</span> <span class="title function_">test</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;Nope.&#x27;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">if</span> (currentUser) &#123;</span><br><span class="line">  <span class="keyword">var</span> test = <span class="keyword">function</span> <span class="title function_">test</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;Yup.&#x27;</span>);</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>绝对不要把参数命名为 <code>arguments</code>, 这将会逾越函数作用域内传过来的 <code>arguments</code> 对象.<figure class="highlight wren"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="variable">function</span> <span class="title function_">nope</span>(<span class="params">name</span>, <span class="params">options</span>, <span class="params">arguments</span>) &#123;</span><br><span class="line">  <span class="comment">// ...stuff...</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="variable">function</span> <span class="title function_">yup</span>(<span class="params">name</span>, <span class="params">options</span>, <span class="params">args</span>) &#123;</span><br><span class="line">  <span class="comment">// ...stuff...</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h2 id="属性"><a href="#属性" class="headerlink" title="属性"></a>属性</h2><ol><li>当使用变量和特殊非法变量名时，访问属性时可以使用中括号(<code>.</code> 优先).<figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> luke = &#123;</span><br><span class="line">  jedi: <span class="literal">true</span>,</span><br><span class="line">  age: <span class="number">28</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getProp</span><span class="params">(prop)</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> luke[prop];</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> isJedi = getProp(<span class="string">&#x27;jedi&#x27;</span>);</span><br></pre></td></tr></table></figure></li></ol><h2 id="变量"><a href="#变量" class="headerlink" title="变量"></a>变量</h2><ol><li>总是使用 <code>var</code> 来声明变量，如果不这么做将导致产生全局变量，我们要避免污染全局命名空间。<figure class="highlight abnf"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">// bad</span><br><span class="line"><span class="attribute">superPower</span> <span class="operator">=</span> new SuperPower()<span class="comment">;</span></span><br><span class="line"></span><br><span class="line">// good</span><br><span class="line">var superPower <span class="operator">=</span> new SuperPower()<span class="comment">;</span></span><br></pre></td></tr></table></figure></li><li>使用一个 <code>var</code> 以及新行声明多个变量，缩进4个空格。<figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> items = getItems();</span><br><span class="line"><span class="keyword">var</span> goSportsTeam = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">var</span> dragonball = <span class="string">&#x27;z&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> items = getItems(),</span><br><span class="line">    goSportsTeam = <span class="literal">true</span>,</span><br><span class="line">    dragonball = <span class="string">&#x27;z&#x27;</span>;</span><br></pre></td></tr></table></figure></li><li>最后再声明未赋值的变量，当你想引用之前已赋值变量的时候很有用。<figure class="highlight go"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> i, <span class="built_in">len</span>, dragonball,</span><br><span class="line">    items = getItems(),</span><br><span class="line">    goSportsTeam = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> i, items = getItems(),</span><br><span class="line">    dragonball,</span><br><span class="line">    goSportsTeam = <span class="literal">true</span>,</span><br><span class="line">    <span class="built_in">len</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> items = getItems(),</span><br><span class="line">    goSportsTeam = <span class="literal">true</span>,</span><br><span class="line">    dragonball,</span><br><span class="line">    length,</span><br><span class="line">    i;</span><br></pre></td></tr></table></figure></li><li>在作用域顶部声明变量，避免变量声明和赋值引起的相关问题。<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">  test();</span><br><span class="line">  <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;doing stuff..&#x27;</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">//..other stuff..</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">var</span> name = getName();</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (name === <span class="string">&#x27;test&#x27;</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> name;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">var</span> name = getName();</span><br><span class="line"></span><br><span class="line">  test();</span><br><span class="line">  <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;doing stuff..&#x27;</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">//..other stuff..</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (name === <span class="string">&#x27;test&#x27;</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> name;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">var</span> name = getName();</span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> (!arguments.<span class="built_in">length</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">if</span> (!arguments.<span class="built_in">length</span>) &#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">var</span> name = getName();</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h2 id="条件表达式和等号"><a href="#条件表达式和等号" class="headerlink" title="条件表达式和等号"></a>条件表达式和等号</h2><ol><li>合理使用 <code>===</code> 和 <code>!==</code> 以及 <code>==</code> 和 <code>!=</code>.</li><li>合理使用表达式逻辑操作运算.</li><li>条件表达式的强制类型转换遵循以下规则：</li></ol><ul><li><code>对象</code> 被计算为 <code>true</code></li><li><code>Undefined</code> 被计算为 <code>false</code></li><li><code>Null</code> 被计算为 <code>false</code></li><li><code>布尔值</code> 被计算为 <code>布尔的值</code></li><li><code>数字</code> 如果是 <code>+0</code>, <code>-0</code>, or <code>NaN</code> 被计算为 <code>false</code> , 否则为 <code>true</code></li><li><code>字符串</code> 如果是空字符串 <code>&#39;&#39;</code> 则被计算为 <code>false</code>, 否则为 <code>true</code>  <figure class="highlight smali"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">if ([0]) &#123;</span><br><span class="line">  // true</span><br><span class="line">  // An<span class="built_in"> array </span>is an object, objects evaluate to true</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ul><ol start="4"><li>使用快捷方式.<figure class="highlight jboss-cli"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">//</span> bad</span><br><span class="line"><span class="keyword">if</span> <span class="params">(name !== &#x27;&#x27;)</span> &#123;</span><br><span class="line">  <span class="string">//</span> <span class="string">...stuff...</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="string">//</span> good</span><br><span class="line"><span class="keyword">if</span> <span class="params">(name)</span> &#123;</span><br><span class="line">  <span class="string">//</span> <span class="string">...stuff...</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="string">//</span> bad</span><br><span class="line"><span class="keyword">if</span> <span class="params">(collection.length &gt; 0)</span> &#123;</span><br><span class="line">  <span class="string">//</span> <span class="string">...stuff...</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="string">//</span> good</span><br><span class="line"><span class="keyword">if</span> <span class="params">(collection.length)</span> &#123;</span><br><span class="line">  <span class="string">//</span> <span class="string">...stuff...</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>阅读 <a href="http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/#more-2108">Truth Equality and JavaScript</a> 了解更多</li></ol><h2 id="块"><a href="#块" class="headerlink" title="块"></a>块</h2><ol><li>给所有多行的块使用大括号<figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">if</span> (test)</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">if</span> (test) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">if</span> (test) &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line">function() &#123; <span class="keyword">return</span> <span class="literal">false</span>; &#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">function() &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h2 id="注释"><a href="#注释" class="headerlink" title="注释"></a>注释</h2><ol><li>使用 <code>/** ... */</code> 进行多行注释，包括描述，指定类型以及参数值和返回值<figure class="highlight wren"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="comment">// make() returns a new element</span></span><br><span class="line"><span class="comment">// based on the passed in tag name</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"><span class="comment">// @param &lt;String&gt; tag</span></span><br><span class="line"><span class="comment">// @return &lt;Element&gt; element</span></span><br><span class="line"><span class="variable">function</span> <span class="title function_">make</span>(<span class="params">tag</span>) &#123;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// ...stuff...</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="variable">element</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * make() returns a new element</span></span><br><span class="line"><span class="comment"> * based on the passed in tag name</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> &lt;String&gt; tag</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> &lt;Element&gt; element</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="variable">function</span> <span class="title function_">make</span>(<span class="params">tag</span>) &#123;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// ...stuff...</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="variable">element</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>使用 <code>//</code> 进行单行注释，在评论对象的上面进行单行注释，注释前放一个空行.<figure class="highlight typescript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> active = <span class="literal">true</span>;  <span class="comment">// is current tab</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="comment">// is current tab</span></span><br><span class="line"><span class="keyword">var</span> active = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getType</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;fetching type...&#x27;</span>);</span><br><span class="line">  <span class="comment">// set the default type to &#x27;no type&#x27;</span></span><br><span class="line">  <span class="keyword">var</span> <span class="keyword">type</span> = <span class="variable language_">this</span>.<span class="property">_type</span> || <span class="string">&#x27;no type&#x27;</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">type</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">getType</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;fetching type...&#x27;</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// set the default type to &#x27;no type&#x27;</span></span><br><span class="line">  <span class="keyword">var</span> <span class="keyword">type</span> = <span class="variable language_">this</span>.<span class="property">_type</span> || <span class="string">&#x27;no type&#x27;</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">type</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>如果你有一个问题需要重新来看一下或如果你建议一个需要被实现的解决方法的话需要在你的注释前面加上 <code>FIXME</code> 或 <code>TODO</code> 帮助其他人迅速理解<figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">function Calculator() &#123;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// <span class="doctag">FIXME:</span> shouldn&#x27;t use a global here</span></span><br><span class="line">  total = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">this</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">function Calculator() &#123;</span><br><span class="line"></span><br><span class="line">  <span class="comment">// <span class="doctag">TODO:</span> total should be configurable by an options param</span></span><br><span class="line">  <span class="keyword">this</span>.total = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">this</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>满足规范的文档，在需要文档的时候，可以尝试<a href="http://usejsdoc.org/">jsdoc</a>.</li></ol><h2 id="空白"><a href="#空白" class="headerlink" title="空白"></a>空白</h2><ol><li>缩进、格式化能帮助团队更快得定位修复代码BUG.</li><li>将tab设为4个空格<figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">function</span><span class="params">()</span> &#123;</span><br><span class="line">∙∙<span class="keyword">var</span> name;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">function</span><span class="params">()</span> &#123;</span><br><span class="line">∙<span class="keyword">var</span> name;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">function</span><span class="params">()</span> &#123;</span><br><span class="line">∙∙∙∙<span class="keyword">var</span> name;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>大括号前放一个空格<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">test</span>(<span class="params"></span>)&#123;</span><br><span class="line">  <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;test&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">test</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;test&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line">dog.set(<span class="string">&#x27;attr&#x27;</span>,&#123;</span><br><span class="line">  <span class="attr">age</span>: <span class="string">&#x27;1 year&#x27;</span>,</span><br><span class="line">  <span class="attr">breed</span>: <span class="string">&#x27;Bernese Mountain Dog&#x27;</span></span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">dog.set(<span class="string">&#x27;attr&#x27;</span>, &#123;</span><br><span class="line">  <span class="attr">age</span>: <span class="string">&#x27;1 year&#x27;</span>,</span><br><span class="line">  <span class="attr">breed</span>: <span class="string">&#x27;Bernese Mountain Dog&#x27;</span></span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></li><li>在做长方法链时使用缩进.<figure class="highlight gradle"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line">$(<span class="string">&#x27;#items&#x27;</span>).<span class="keyword">find</span>(<span class="string">&#x27;.selected&#x27;</span>).highlight().end().<span class="keyword">find</span>(<span class="string">&#x27;.open&#x27;</span>).updateCount();</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">$(<span class="string">&#x27;#items&#x27;</span>)</span><br><span class="line">  .<span class="keyword">find</span>(<span class="string">&#x27;.selected&#x27;</span>)</span><br><span class="line">    .highlight()</span><br><span class="line">    .end()</span><br><span class="line">  .<span class="keyword">find</span>(<span class="string">&#x27;.open&#x27;</span>)</span><br><span class="line">    .updateCount();</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line">var leds = stage.selectAll(<span class="string">&#x27;.led&#x27;</span>).data(data).enter().<span class="keyword">append</span>(<span class="string">&#x27;svg:svg&#x27;</span>).<span class="keyword">class</span>(<span class="string">&#x27;led&#x27;</span>, <span class="keyword">true</span>)</span><br><span class="line">    .attr(<span class="string">&#x27;width&#x27;</span>,  (radius + margin) * <span class="number">2</span>).<span class="keyword">append</span>(<span class="string">&#x27;svg:g&#x27;</span>)</span><br><span class="line">    .attr(<span class="string">&#x27;transform&#x27;</span>, <span class="string">&#x27;translate(&#x27;</span> + (radius + margin) + <span class="string">&#x27;,&#x27;</span> + (radius + margin) + <span class="string">&#x27;)&#x27;</span>)</span><br><span class="line">    .<span class="keyword">call</span>(tron.led);</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">var leds = stage.selectAll(<span class="string">&#x27;.led&#x27;</span>)</span><br><span class="line">    .data(data)</span><br><span class="line">  .enter().<span class="keyword">append</span>(<span class="string">&#x27;svg:svg&#x27;</span>)</span><br><span class="line">    .<span class="keyword">class</span>(<span class="string">&#x27;led&#x27;</span>, <span class="keyword">true</span>)</span><br><span class="line">    .attr(<span class="string">&#x27;width&#x27;</span>,  (radius + margin) * <span class="number">2</span>)</span><br><span class="line">  .<span class="keyword">append</span>(<span class="string">&#x27;svg:g&#x27;</span>)</span><br><span class="line">    .attr(<span class="string">&#x27;transform&#x27;</span>, <span class="string">&#x27;translate(&#x27;</span> + (radius + margin) + <span class="string">&#x27;,&#x27;</span> + (radius + margin) + <span class="string">&#x27;)&#x27;</span>)</span><br><span class="line">    .<span class="keyword">call</span>(tron.led);</span><br></pre></td></tr></table></figure></li></ol><h2 id="逗号"><a href="#逗号" class="headerlink" title="逗号"></a>逗号</h2><ol><li>不要将逗号放前面<figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> once</span><br><span class="line">  , upon</span><br><span class="line">  , aTime;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> once,</span><br><span class="line">    upon,</span><br><span class="line">    aTime;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> hero = &#123;</span><br><span class="line">    firstName: <span class="string">&#x27;Bob&#x27;</span></span><br><span class="line">  , lastName: <span class="string">&#x27;Parr&#x27;</span></span><br><span class="line">  , heroName: <span class="string">&#x27;Mr. Incredible&#x27;</span></span><br><span class="line">  , superPower: <span class="string">&#x27;strength&#x27;</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> hero = &#123;</span><br><span class="line">  firstName: <span class="string">&#x27;Bob&#x27;</span>,</span><br><span class="line">  lastName: <span class="string">&#x27;Parr&#x27;</span>,</span><br><span class="line">  heroName: <span class="string">&#x27;Mr. Incredible&#x27;</span>,</span><br><span class="line">  superPower: <span class="string">&#x27;strength&#x27;</span></span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li>不要加多余的逗号，这可能会在IE下引起错误，同时如果多一个逗号某些ES3的实现会计算多数组的长度。<figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> hero = &#123;</span><br><span class="line">  firstName: <span class="string">&#x27;Kevin&#x27;</span>,</span><br><span class="line">  lastName: <span class="string">&#x27;Flynn&#x27;</span>,</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> heroes = [</span><br><span class="line">  <span class="string">&#x27;Batman&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;Superman&#x27;</span>,</span><br><span class="line">];</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> hero = &#123;</span><br><span class="line">  firstName: <span class="string">&#x27;Kevin&#x27;</span>,</span><br><span class="line">  lastName: <span class="string">&#x27;Flynn&#x27;</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> heroes = [</span><br><span class="line">  <span class="string">&#x27;Batman&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;Superman&#x27;</span></span><br><span class="line">];</span><br></pre></td></tr></table></figure></li></ol><h2 id="分号"><a href="#分号" class="headerlink" title="分号"></a>分号</h2><ol><li>语句结束一定要加分号<figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line">(<span class="keyword">function</span><span class="params">()</span> &#123;</span><br><span class="line">  <span class="keyword">var</span> name = <span class="string">&#x27;Skywalker&#x27;</span></span><br><span class="line">  <span class="keyword">return</span> name</span><br><span class="line">&#125;)()</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">(<span class="keyword">function</span><span class="params">()</span> &#123;</span><br><span class="line">  <span class="keyword">var</span> name = <span class="string">&#x27;Skywalker&#x27;</span>;</span><br><span class="line">  <span class="keyword">return</span> name;</span><br><span class="line">&#125;)();</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">;(<span class="keyword">function</span><span class="params">()</span> &#123;</span><br><span class="line">  <span class="keyword">var</span> name = <span class="string">&#x27;Skywalker&#x27;</span>;</span><br><span class="line">  <span class="keyword">return</span> name;</span><br><span class="line">&#125;)();</span><br></pre></td></tr></table></figure></li></ol><h2 id="类型转换"><a href="#类型转换" class="headerlink" title="类型转换"></a>类型转换</h2><ol><li>在语句的开始执行类型转换.</li><li>字符串:<figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//  =&gt; this.reviewScore = 9;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> totalScore = <span class="keyword">this</span>.reviewScore + <span class="string">&#x27;&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> totalScore = <span class="string">&#x27;&#x27;</span> + <span class="keyword">this</span>.reviewScore;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> totalScore = <span class="string">&#x27;&#x27;</span> + <span class="keyword">this</span>.reviewScore + <span class="string">&#x27; total score&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> totalScore = <span class="keyword">this</span>.reviewScore + <span class="string">&#x27; total score&#x27;</span>;</span><br></pre></td></tr></table></figure></li><li>对数字使用 <code>parseInt</code> 并且总是带上类型转换的基数.，如<code>parseInt(value, 10)</code><figure class="highlight pony"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> inputValue = <span class="string">&#x27;4&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> <span class="meta">val</span> = <span class="keyword">new</span> <span class="type">Number</span>(inputValue);</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> <span class="meta">val</span> = +inputValue;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> <span class="meta">val</span> = inputValue &gt;&gt; <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> <span class="meta">val</span> = parseInt(inputValue);</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> <span class="meta">val</span> = <span class="type">Number</span>(inputValue);</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> <span class="meta">val</span> = parseInt(inputValue, <span class="number">10</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * parseInt was the reason my code was slow.</span></span><br><span class="line"><span class="comment"> * Bitshifting the String to coerce it to a</span></span><br><span class="line"><span class="comment"> * Number made it a lot faster.</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">var</span> <span class="meta">val</span> = inputValue &gt;&gt; <span class="number">0</span>;</span><br></pre></td></tr></table></figure></li><li>布尔值:<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> age = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> hasAge = <span class="keyword">new</span> <span class="built_in">Boolean</span>(age);</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> hasAge = <span class="built_in">Boolean</span>(age);</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> hasAge = !!age;</span><br></pre></td></tr></table></figure></li></ol><h2 id="命名约定"><a href="#命名约定" class="headerlink" title="命名约定"></a>命名约定</h2><ol><li>避免单个字符名，让你的变量名有描述意义。<figure class="highlight actionscript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">q</span><span class="params">()</span> &#123;</span><br><span class="line">  <span class="comment">// ...stuff...</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">query</span><span class="params">()</span> &#123;</span><br><span class="line">  <span class="comment">// ..stuff..</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>当命名对象、函数和实例时使用驼峰命名规则<figure class="highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> OBJEcttsssss = &#123;&#125;;</span><br><span class="line"><span class="keyword">var</span> this_is_my_object = &#123;&#125;;</span><br><span class="line"><span class="keyword">var</span> <span class="keyword">this</span>-<span class="keyword">is</span>-my-<span class="built_in">object</span> = &#123;&#125;;</span><br><span class="line"><span class="function">function <span class="title">c</span>()</span> &#123;&#125;;</span><br><span class="line"><span class="keyword">var</span> u = <span class="keyword">new</span> user(&#123;</span><br><span class="line">  name: <span class="string">&#x27;Bob Parr&#x27;</span></span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> thisIsMyObject = &#123;&#125;;</span><br><span class="line"><span class="function">function <span class="title">thisIsMyFunction</span>()</span> &#123;&#125;;</span><br><span class="line"><span class="keyword">var</span> user = <span class="keyword">new</span> User(&#123;</span><br><span class="line">  name: <span class="string">&#x27;Bob Parr&#x27;</span></span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></li><li>当命名构造函数或类时使用驼峰式大写<figure class="highlight pgsql"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">// bad</span><br><span class="line"><span class="keyword">function</span> <span class="keyword">user</span>(<span class="keyword">options</span>) &#123;</span><br><span class="line">  this.name = <span class="keyword">options</span>.name;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">var bad = <span class="built_in">new</span> <span class="keyword">user</span>(&#123;</span><br><span class="line">  <span class="type">name</span>: <span class="string">&#x27;nope&#x27;</span></span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line">// good</span><br><span class="line"><span class="keyword">function</span> <span class="keyword">User</span>(<span class="keyword">options</span>) &#123;</span><br><span class="line">  this.name = <span class="keyword">options</span>.name;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">var good = <span class="built_in">new</span> <span class="keyword">User</span>(&#123;</span><br><span class="line">  <span class="type">name</span>: <span class="string">&#x27;yup&#x27;</span></span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></li><li>命名私有属性时前面加个下划线 <code>_</code><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">this</span>.__firstName__ = <span class="string">&#x27;Panda&#x27;</span>;</span><br><span class="line"><span class="keyword">this</span>.firstName_ = <span class="string">&#x27;Panda&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">this</span>._firstName = <span class="string">&#x27;Panda&#x27;</span>;</span><br></pre></td></tr></table></figure></li><li>当保存对 <code>this</code> 的引用时使用 <code>self(python 风格)</code>,避免<code>this issue</code> . Angular建议使用<code>vm(MVVM模式中view-model)</code><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">var</span> self = this;</span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="built_in">console</span>.<span class="built_in">log</span>(self);</span><br><span class="line">  &#125;;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li></ol><h2 id="存取器"><a href="#存取器" class="headerlink" title="存取器"></a>存取器</h2><ol><li>属性的存取器函数不是必需的</li><li>如果你确实有存取器函数的话使用<code>getVal()</code> 和 <code>setVal(‘hello’)</code>,<code>java getter、setter风格</code>或者<code>jQuery风格</code></li><li>如果属性是布尔值，使用<code>isVal()</code> 或 <code>hasVal()</code><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">if</span> (!dragon.age()) &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">if</span> (!dragon.hasAge()) &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>可以创建<code>get()</code>和<code>set()</code>函数，但是要保持一致<figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">function Jedi(options) &#123;</span><br><span class="line">  options || (options = &#123;&#125;);</span><br><span class="line">  <span class="keyword">var</span> lightsaber = options.lightsaber || <span class="string">&#x27;blue&#x27;</span>;</span><br><span class="line">  <span class="keyword">this</span>.<span class="keyword">set</span>(<span class="string">&#x27;lightsaber&#x27;</span>, lightsaber);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">Jedi.prototype.<span class="keyword">set</span> = function(key, <span class="keyword">val</span>) &#123;</span><br><span class="line">  <span class="keyword">this</span>[key] = <span class="keyword">val</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">Jedi.prototype.<span class="keyword">get</span> = function(key) &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="keyword">this</span>[key];</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li></ol><h2 id="构造器"><a href="#构造器" class="headerlink" title="构造器"></a>构造器</h2><ol><li>给对象原型分配方法，而不是用一个新的对象覆盖原型，覆盖原型会使继承出现问题。<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">Jedi</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;new jedi&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line">Jedi.prototype = &#123;</span><br><span class="line">  <span class="attr">fight</span>: <span class="keyword">function</span> <span class="title function_">fight</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;fighting&#x27;</span>);</span><br><span class="line">  &#125;,</span><br><span class="line"></span><br><span class="line">  <span class="attr">block</span>: <span class="keyword">function</span> <span class="title function_">block</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;blocking&#x27;</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">Jedi.prototype.fight = <span class="keyword">function</span> <span class="title function_">fight</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;fighting&#x27;</span>);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">Jedi.prototype.block = <span class="keyword">function</span> <span class="title function_">block</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&#x27;blocking&#x27;</span>);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li>方法可以返回 <code>this</code> 帮助方法可链。<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="title class_">Jedi</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">jump</span> = <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="variable language_">this</span>.<span class="property">jumping</span> = <span class="literal">true</span>;</span><br><span class="line">  <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="title class_">Jedi</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">setHeight</span> = <span class="keyword">function</span>(<span class="params">height</span>) &#123;</span><br><span class="line">  <span class="variable language_">this</span>.<span class="property">height</span> = height;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> luke = <span class="keyword">new</span> <span class="title class_">Jedi</span>();</span><br><span class="line">luke.<span class="title function_">jump</span>(); <span class="comment">// =&gt; true</span></span><br><span class="line">luke.<span class="title function_">setHeight</span>(<span class="number">20</span>) <span class="comment">// =&gt; undefined</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="title class_">Jedi</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">jump</span> = <span class="keyword">function</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="variable language_">this</span>.<span class="property">jumping</span> = <span class="literal">true</span>;</span><br><span class="line">  <span class="keyword">return</span> <span class="variable language_">this</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="title class_">Jedi</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">setHeight</span> = <span class="keyword">function</span>(<span class="params">height</span>) &#123;</span><br><span class="line">  <span class="variable language_">this</span>.<span class="property">height</span> = height;</span><br><span class="line">  <span class="keyword">return</span> <span class="variable language_">this</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> luke = <span class="keyword">new</span> <span class="title class_">Jedi</span>();</span><br><span class="line"></span><br><span class="line">luke.<span class="title function_">jump</span>()</span><br><span class="line">  .<span class="title function_">setHeight</span>(<span class="number">20</span>);</span><br></pre></td></tr></table></figure></li><li>可以写一个自定义的<code>toString()</code>方法，但是确保它工作正常并且不会有副作用。<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">Jedi</span>(<span class="params">options</span>) &#123;</span><br><span class="line">  options || (options = &#123;&#125;);</span><br><span class="line">  <span class="variable language_">this</span>.<span class="property">name</span> = options.<span class="property">name</span> || <span class="string">&#x27;no name&#x27;</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="title class_">Jedi</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">getName</span> = <span class="keyword">function</span> <span class="title function_">getName</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="property">name</span>;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="title class_">Jedi</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">toString</span> = <span class="keyword">function</span> <span class="title function_">toString</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> <span class="string">&#x27;Jedi - &#x27;</span> + <span class="variable language_">this</span>.<span class="title function_">getName</span>();</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li></ol><h2 id="事件"><a href="#事件" class="headerlink" title="事件"></a>事件</h2><ol><li>当给事件附加数据时，传入一个哈希而不是原始值，这可以让后面的贡献者加入更多数据到事件数据里而不用找出并更新那个事件的事件处理器<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line">$(<span class="variable language_">this</span>).<span class="title function_">trigger</span>(<span class="string">&#x27;listingUpdated&#x27;</span>, listing.<span class="property">id</span>);</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">$(<span class="variable language_">this</span>).<span class="title function_">on</span>(<span class="string">&#x27;listingUpdated&#x27;</span>, <span class="keyword">function</span>(<span class="params">e, listingId</span>) &#123;</span><br><span class="line">  <span class="comment">// do something with listingId</span></span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">$(<span class="variable language_">this</span>).<span class="title function_">trigger</span>(<span class="string">&#x27;listingUpdated&#x27;</span>, &#123; listingId : listing.<span class="property">id</span> &#125;);</span><br><span class="line"></span><br><span class="line">...</span><br><span class="line"></span><br><span class="line">$(<span class="variable language_">this</span>).<span class="title function_">on</span>(<span class="string">&#x27;listingUpdated&#x27;</span>, <span class="keyword">function</span>(<span class="params">e, data</span>) &#123;</span><br><span class="line">  <span class="comment">// do something with data.listingId</span></span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></li></ol><h2 id="模块"><a href="#模块" class="headerlink" title="模块"></a>模块</h2><ol><li>这个文件应该以驼峰命名，并在同名文件夹下，同时导出的时候名字一致</li><li>对于公开API库可以考虑加入一个名为noConflict()的方法来设置导出的模块为之前的版本并返回它</li><li>总是在模块顶部声明 <code>&#39;use strict&#39;;</code>，引入<a href="http://jshint.com/">JSHint规范</a><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// fancyInput/fancyInput.js</span></span><br><span class="line"></span><br><span class="line">（<span class="keyword">function</span>(<span class="params"><span class="variable language_">global</span></span>) &#123;</span><br><span class="line">  <span class="string">&#x27;use strict&#x27;</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">var</span> previousFancyInput = <span class="variable language_">global</span>.<span class="property">FancyInput</span>;</span><br><span class="line"></span><br><span class="line">  <span class="keyword">function</span> <span class="title function_">FancyInput</span>(<span class="params">options</span>) &#123;</span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">options</span> = options || &#123;&#125;;</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  <span class="title class_">FancyInput</span>.<span class="property">noConflict</span> = <span class="keyword">function</span> <span class="title function_">noConflict</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">global</span>.<span class="property">FancyInput</span> = previousFancyInput;</span><br><span class="line">    <span class="keyword">return</span> <span class="title class_">FancyInput</span>;</span><br><span class="line">  &#125;;</span><br><span class="line"></span><br><span class="line">  <span class="variable language_">global</span>.<span class="property">FancyInput</span> = <span class="title class_">FancyInput</span>;</span><br><span class="line">&#125;)(<span class="variable language_">this</span>);</span><br></pre></td></tr></table></figure></li></ol><h2 id="jQuery"><a href="#jQuery" class="headerlink" title="jQuery"></a>jQuery</h2><ol><li>对于jQuery对象以<code>$</code>开头，以和原生DOM节点区分。<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">var</span> menu = $(<span class="string">&quot;.menu&quot;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">var</span> $menu = $(<span class="string">&quot;.menu&quot;</span>);</span><br></pre></td></tr></table></figure></li><li>缓存jQuery查询<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setSidebar</span>(<span class="params"></span>) &#123;</span><br><span class="line">  $(<span class="string">&#x27;.sidebar&#x27;</span>).hide();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// ...stuff...</span></span><br><span class="line"></span><br><span class="line">  $(<span class="string">&#x27;.sidebar&#x27;</span>).css(&#123;</span><br><span class="line">    <span class="string">&#x27;background-color&#x27;</span>: <span class="string">&#x27;pink&#x27;</span></span><br><span class="line">  &#125;);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">setSidebar</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">var</span> $sidebar = $(<span class="string">&#x27;.sidebar&#x27;</span>);</span><br><span class="line">  $sidebar.hide();</span><br><span class="line"></span><br><span class="line">  <span class="comment">// ...stuff...</span></span><br><span class="line"></span><br><span class="line">  $sidebar.css(&#123;</span><br><span class="line">    <span class="string">&#x27;background-color&#x27;</span>: <span class="string">&#x27;pink&#x27;</span></span><br><span class="line">  &#125;);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></li><li>对DOM查询使用级联的 <code>$(&#39;.sidebar ul&#39;)</code> 或 <code>$(&#39;.sidebar ul&#39;)</code>，<a href="http://jsperf.com/jquery-find-vs-context-sel/16">jsPerf</a> </li><li>对有作用域的jQuery对象查询使用 <code>find</code><figure class="highlight mel"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line">$(<span class="string">&#x27;.sidebar&#x27;</span>, <span class="string">&#x27;ul&#x27;</span>).<span class="keyword">hide</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// bad</span></span><br><span class="line">$(<span class="string">&#x27;.sidebar&#x27;</span>).find(<span class="string">&#x27;ul&#x27;</span>).<span class="keyword">hide</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">$(<span class="string">&#x27;.sidebar ul&#x27;</span>).<span class="keyword">hide</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">$(<span class="string">&#x27;.sidebar &gt; ul&#x27;</span>).<span class="keyword">hide</span>();</span><br><span class="line"></span><br><span class="line"><span class="comment">// good (slower)</span></span><br><span class="line">$sidebar.find(<span class="string">&#x27;ul&#x27;</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// good (faster)</span></span><br><span class="line">$($sidebar[<span class="number">0</span>]).find(<span class="string">&#x27;ul&#x27;</span>);</span><br></pre></td></tr></table></figure></li><li>每个页面只使用一次document的ready事件，这样便于调试与行为流跟踪。<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$(<span class="keyword">function</span>(<span class="params"></span>)&#123;</span><br><span class="line">   <span class="comment">//do your page init.  </span></span><br><span class="line">&#125;);</span><br></pre></td></tr></table></figure></li><li>事件利用<code>jQuery.on</code>从页面分离到JavaScript文件。<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line">&lt;a id=<span class="string">&quot;myLink&quot;</span> href=<span class="string">&quot;#&quot;</span> onclick=<span class="string">&quot;myEventHandler();&quot;</span>&gt;&lt;/a&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">a</span> <span class="attr">id</span>=<span class="string">&quot;myLink&quot;</span> <span class="attr">href</span>=<span class="string">&quot;#&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">a</span>&gt;</span></span></span><br><span class="line"></span><br><span class="line">$(<span class="string">&quot;#myLink&quot;</span>).<span class="title function_">on</span>(<span class="string">&quot;click&quot;</span>, myEventHandler);</span><br></pre></td></tr></table></figure></li><li>对于Ajax使用<code>promise</code>方式。<figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// bad</span></span><br><span class="line">$.ajax(&#123;</span><br><span class="line">    ...</span><br><span class="line">    success : <span class="keyword">function</span>(<span class="params"></span>)&#123;</span><br><span class="line">    &#125;,</span><br><span class="line">    <span class="attr">error</span> : <span class="keyword">function</span>(<span class="params"></span>)&#123;</span><br><span class="line">    &#125; </span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line"><span class="comment">// good</span></span><br><span class="line">$.ajax(&#123;.</span><br><span class="line">    ..</span><br><span class="line">&#125;).then( <span class="keyword">function</span>(<span class="params"> </span>)&#123;</span><br><span class="line">    <span class="comment">// success</span></span><br><span class="line">&#125;, <span class="keyword">function</span>(<span class="params"> </span>)&#123;</span><br><span class="line">    <span class="comment">// error</span></span><br><span class="line">&#125;)</span><br></pre></td></tr></table></figure></li><li>利用<code>promise</code>的<code>deferred对象</code>解决延迟注册问题。<figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> dtd = $.<span class="title class_">Deferred</span>(); <span class="comment">// 新建一个deferred对象</span></span><br><span class="line"><span class="keyword">var</span> wait = <span class="keyword">function</span>(<span class="params">dtd</span>)&#123;</span><br><span class="line">    <span class="keyword">var</span> tasks = <span class="keyword">function</span>(<span class="params"></span>)&#123;</span><br><span class="line">        <span class="title function_">alert</span>(<span class="string">&quot;执行完毕！&quot;</span>);</span><br><span class="line">        dtd.<span class="title function_">resolve</span>(); <span class="comment">// 改变deferred对象的执行状态</span></span><br><span class="line">    &#125;;</span><br><span class="line">    <span class="built_in">setTimeout</span>(tasks,<span class="number">5000</span>);</span><br><span class="line">　　<span class="keyword">return</span> dtd;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure></li><li>HTML中Style、以及JavaScript中style移到CSS中class，在HTML、JavaScript中引入class，而不是直接style。</li></ol><h2 id="ECMAScript-5兼容性"><a href="#ECMAScript-5兼容性" class="headerlink" title="ECMAScript 5兼容性"></a>ECMAScript 5兼容性</h2><p>尽量采用ES5方法，特别数组<code>map</code>、<code>filter</code>、<code>forEach</code>方法简化日常开发。在老式IE浏览器中引入<code>ES5-shim</code>。或者也可以考虑引入<code>underscore</code>、<code>lodash</code> 常用辅助库. </p><ul><li>参考<a href="https://twitter.com/kangax/">Kangax</a>的 <a href="http://kangax.github.com/es5-compat-table/">ES5 compatibility table</a></li></ul><h2 id="HTML、CSS、JavaScript分离"><a href="#HTML、CSS、JavaScript分离" class="headerlink" title="HTML、CSS、JavaScript分离"></a>HTML、CSS、JavaScript分离</h2><ol><li>页面DOM结构使用HTML，样式则采用CSS，动态DOM操作JavaScript。不要混用在HTML中<br>分离在不同类型文件，文件link。</li><li>HTML、CSS、JavaScript变量名都需要有业务价值。CSS以中划线分割的全小写命名，JavaScript则首字母小写的驼峰命名。</li><li>CSS可引入Bootstrap、Foundation等出名响应式设计框架。以及SASS、LESS工具书写CSS。</li><li>对于CSS、JavaScript建议合并为单文件，减少Ajax的连接数。也可以引入AMD(Require.js)加载方式。</li><li>对于内部大部分企业管理系统，可以尝试采用前端 MVC框架组织代码。如Angular、React + flux架构、Knockout等。</li><li>对于兼容性可用<a href="http://modernizr.com/">Modernizr</a>规范库辅助。</li></ol><h2 id="使用jsHint"><a href="#使用jsHint" class="headerlink" title="使用jsHint"></a>使用jsHint</h2><ol><li>前端项目中推荐引入 <a href="http://jshint.com/">jshint</a>插件来规范项目编码规范。以及一套完善的IDE配置。</li><li>注意：jshint需要引入nodejs 工具grunt或gulp插件，建议企业级nodejs npm私服。</li></ol><h2 id="前端工具"><a href="#前端工具" class="headerlink" title="前端工具"></a>前端工具</h2><ol><li>前端第三方JavaScript包管理工具bower(<code>bower install jQuery</code>)，bower可以实现第三方库的依赖解析、下载、升级管理等。建议建立企业级bower私服。</li><li>前端构建工具，可以采用grunt或者gulp工具，可以实现html、css、js压缩、验证、测试，文件合并、watch和liveload等所有前端任务。建议企业级nodejs npm私服。</li><li>前端开发IDE： WebStorm( Idea )、Sublime为最佳 。项目组统一IDE。IDE统一配置很重要。</li></ol><blockquote><p>本文转载自<a href="http://greengerong.github.io/blog/2015/05/09/qian-duan-javascriptgui-fan/">破狼</a>,原文略有修改,侵权即删.<br>原文链接：<a href="http://greengerong.github.io/blog/2015/05/09/qian-duan-javascriptgui-fan/">前端javascript规范</a><br>原文作者：<a href="http://greengerong.github.io/">破狼</a> </p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;img src=&quot;https://img2.imgtp.com/2024/03/23/f95idnmO.jpg&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;类型&quot;&gt;&lt;a href=&quot;#类型&quot; class=&quot;headerlink&quot; title=&quot;类型&quot;&gt;&lt;/a&gt;类型&lt;/h2&gt;&lt;p&gt;&lt;str
      
    
    </summary>
    
    
      <category term="学习笔记" scheme="https://ioliu.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="JavaScript" scheme="https://ioliu.cn/tags/JavaScript/"/>
    
      <category term="前端" scheme="https://ioliu.cn/tags/%E5%89%8D%E7%AB%AF/"/>
    
      <category term="规范" scheme="https://ioliu.cn/tags/%E8%A7%84%E8%8C%83/"/>
    
  </entry>
  
  <entry>
    <title>你可能不知道的一些JavaScript 奇技淫巧</title>
    <link href="https://ioliu.cn/2015/about-javascript-spcial-technique/"/>
    <id>https://ioliu.cn/2015/about-javascript-spcial-technique/</id>
    <published>2015-05-07T02:21:08.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://img2.imgtp.com/2024/03/23/f95idnmO.jpg"></p><blockquote class="blockquote-center">这里记录一下以前学习各种书籍和文章里边出现的JS的小技巧，分享给大家，也供自己查阅，同时感谢那些发现创造和分享这些技巧的前辈和大牛们。</blockquote>## 遍历一个obj的属性到数组  <figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">getAttr</span>(<span class="params">obj</span>)&#123;</span><br><span class="line">     <span class="keyword">var</span> a=[];</span><br><span class="line">     <span class="keyword">for</span>(a[a.<span class="built_in">length</span>] <span class="keyword">in</span> obj);</span><br><span class="line">     <span class="keyword">return</span> a;</span><br><span class="line">&#125;</span><br><span class="line"><span class="built_in">console</span>.<span class="built_in">log</span>(getAttr(&#123;<span class="string">&#x27;name&#x27;</span>:<span class="string">&#x27;zhangsan&#x27;</span>,<span class="string">&#x27;age&#x27;</span>:<span class="string">&#x27;20&#x27;</span>&#125;));<span class="comment">//输出:[&#x27;name&#x27;,&#x27;age&#x27;]</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>乍一看可能比较蒙，不过仔细分析还是不难理解的。常见用法是`for(var key in obj)`，这里`key`初始也是`undefined`的，`a[a.length]`整体也是`undefined`，所以二者其实是等价的。  在`for`循环中，`obj`的属性会依次赋值给`key`，同样，也依次赋值给`a[a.length]`，这里`length`一直在变，就巧妙地挨个赋值给数组的每一个元素了。<h2 id="重复字符串-如abc-abcabc"><a href="#重复字符串-如abc-abcabc" class="headerlink" title="重复字符串(如abc=&gt;abcabc)"></a>重复字符串(如<code>abc=&gt;abcabc</code>)</h2><figure class="highlight ada"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title">repeat</span>(target,n)&#123;</span><br><span class="line">    <span class="keyword">return</span> <span class="type">(new</span> <span class="keyword">Array</span>(n+<span class="number">1</span>).join(target));</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>改进版本:  </p><figure class="highlight sas"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">function <span class="meta">repeat</span>(target,n)&#123;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">Array</span>.prototype.join.<span class="keyword">call</span>(&#123;<span class="keyword">length</span>:n+1&#125;,target);</span><br><span class="line">//之所以要创建带<span class="keyword">length</span>属性的对象，是因为调用数组原型方法时，必须是一个类数组对象，而类数组对象的条件就是<span class="keyword">length</span>为非负整数</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>不新建数组，而是用拥有<code>length</code>属性的对象替代，然后调用数组的<code>join</code>方法,性能提升很大.<br>再改进：</p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> repeat=(<span class="keyword">function</span>(<span class="params"></span>)&#123;</span><br><span class="line"><span class="keyword">var</span> join=<span class="built_in">Array</span>.prototype.join,obj=&#123;&#125;;</span><br><span class="line"><span class="keyword">return</span> <span class="keyword">function</span>(<span class="params">target,n</span>)&#123;</span><br><span class="line">obj.<span class="built_in">length</span>=n+<span class="number">1</span>;</span><br><span class="line"><span class="keyword">return</span> join.call(obj,target);</span><br><span class="line">&#125;</span><br><span class="line">&#125;)();</span><br></pre></td></tr></table></figure><p>利用闭包将<code>对象</code>和<code>join</code>方法缓存起来，不用每次都新建对象和寻找方法  </p><h2 id="for循环"><a href="#for循环" class="headerlink" title="for循环"></a>for循环</h2><p>for循环中，当第二项为false时会终止循环，这里并不一定存在比较，可以直接赋值，如果赋值为undefined之类的值时，转成bool值也为假，因此也会终止，比如遍历数组可以写成：  </p><figure class="highlight stylus"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="title">for</span><span class="params">(var i=arr.length,element;element=arr[—-i];)</span></span>&#123;…&#125;</span><br></pre></td></tr></table></figure><p>这里，第二项一定是<code>arr[--i]</code>而非<code>arr[i--]</code>,如果是后者的话，上来就是<code>undefined</code>，就不会执行循环体，或者<code>for(var i=0,element;element=arr[i++];)&#123;…&#125;</code></p><h2 id="NaN"><a href="#NaN" class="headerlink" title="NaN"></a>NaN</h2><p><code>NaN</code>是JS中唯一不等于自己的值，因此可以用来判断一个变量是否真的为<code>NaN</code>:<code>a!==a</code></p><h2 id="、-等算术运算符"><a href="#、-等算术运算符" class="headerlink" title="/、+等算术运算符"></a><code>/</code>、<code>+</code>等算术运算符</h2><p><code>&lt;</code>&#x2F;<code>+</code>等运算符会强制符号两边的表达式执行valueOf然后比较，所以如果两边是函数或者对象，而又重写了该对象的valueOf方法，就会自动执行两边的方法。如：</p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> a=&#123;<span class="attr">valueOf</span>:<span class="keyword">function</span>(<span class="params"></span>)&#123;<span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&quot;aaa&quot;</span>);&#125;&#125;,b=&#123;<span class="attr">valueOf</span>:<span class="keyword">function</span>(<span class="params"></span>)&#123;<span class="built_in">console</span>.<span class="built_in">log</span>(<span class="string">&quot;bbb&quot;</span>);&#125;&#125;;</span><br><span class="line">    a &lt; b;<span class="comment">//会输出:aaa;bbb;false </span></span><br></pre></td></tr></table></figure><h2 id="闭包"><a href="#闭包" class="headerlink" title="闭包"></a>闭包</h2><p>理解闭包需学会三个基本事实：  </p><ol><li>JS允许你引用在当前函数意外定义的变量  </li><li>即使外部函数已经返回，当前函数仍然可以引用在外部函数所定义的变量。这是因为JS的函数值包含里比调用它们时执行所需要的代码更多的信息  </li><li>闭包可以更新外部变量的值。这是因为闭包存储的是外部变量的引用而非值副本。如：<figure class="highlight fsharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="built_in">box</span>()&#123;</span><br><span class="line">var <span class="keyword">val</span><span class="operator">=</span>undefined;</span><br><span class="line"><span class="keyword">return</span> &#123;</span><br><span class="line"><span class="built_in">set</span><span class="operator">:</span><span class="keyword">function</span>(x)&#123;<span class="keyword">val</span><span class="operator">=</span>x;&#125;,</span><br><span class="line"><span class="built_in">get</span><span class="operator">:</span><span class="keyword">function</span>()&#123;<span class="keyword">return</span> <span class="keyword">val</span>;&#125;</span><br><span class="line">&#125;;</span><br><span class="line">&#125;</span><br><span class="line">var b<span class="operator">=</span><span class="built_in">box</span>();</span><br><span class="line">b.<span class="built_in">get</span>();<span class="comment">//“undefined”</span></span><br><span class="line">b.<span class="built_in">set</span>(<span class="number">5</span>);</span><br><span class="line">b.<span class="built_in">get</span>();<span class="comment">//5</span></span><br></pre></td></tr></table></figure>这一点很重要，比如在函数的for循环体内返回闭包或者有闭包取for循环的计数器值，那么这个闭包取到的永远是for循环结束时i的最终值，因为闭包存储的是它的引用而非当时的值副本。</li></ol><h2 id="块级作用域"><a href="#块级作用域" class="headerlink" title="块级作用域"></a>块级作用域</h2><p>JS没有块级作用域，因此通常情况下函数内部的所有变量都是绑定到函数作用域的，也就是说相当于都在函数一开始就声明了的，一个例外就是<code>try/catch</code>中的变量是块级的，只属于<code>try/catch</code>块。</p><h2 id="嵌套函数"><a href="#嵌套函数" class="headerlink" title="嵌套函数"></a>嵌套函数</h2><p>众所周知，在函数内部声明函数是可以的，但是在在函数内的局部块里声明，可能会出现问题：  </p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">f</span>(<span class="params"></span>)&#123;<span class="keyword">return</span> “global”;&#125;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">test</span>(<span class="params">x</span>)&#123;</span><br><span class="line">     <span class="keyword">function</span> <span class="title function_">f</span>(<span class="params"></span>)&#123;<span class="keyword">return</span> “local”&#125;</span><br><span class="line">     <span class="keyword">var</span> result=[];</span><br><span class="line">     <span class="keyword">if</span>(x)&#123;</span><br><span class="line">          result.<span class="built_in">push</span>(f());</span><br><span class="line">     &#125;</span><br><span class="line">     result.<span class="built_in">push</span>(f());</span><br><span class="line">     <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br><span class="line">test(<span class="literal">true</span>);<span class="comment">//[“local”,”local”]</span></span><br><span class="line">test(<span class="literal">false</span>);<span class="comment">//[“local”]</span></span><br></pre></td></tr></table></figure><p>将函数声明到if块中：</p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">f</span>(<span class="params"></span>)&#123;<span class="keyword">return</span> “global”;&#125;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">test</span>(<span class="params">x</span>)&#123;</span><br><span class="line">     <span class="keyword">var</span> result=[];</span><br><span class="line">     <span class="keyword">if</span>(x)&#123;</span><br><span class="line">          <span class="keyword">function</span> <span class="title function_">f</span>(<span class="params"></span>)&#123;<span class="keyword">return</span> “local”&#125;</span><br><span class="line">          result.<span class="built_in">push</span>(f());</span><br><span class="line">     &#125;</span><br><span class="line">     result.<span class="built_in">push</span>(f());</span><br><span class="line">     <span class="keyword">return</span> result;</span><br><span class="line">&#125; </span><br><span class="line">test(<span class="literal">true</span>);<span class="comment">//?</span></span><br><span class="line">test(<span class="literal">false</span>);<span class="comment">//?</span></span><br></pre></td></tr></table></figure><p>结果会如何呢？理论上讲，JS没有块级作用域，因此f()的作用域是整个test函数，因此合理猜测应该是与上一次输出相同，全部为”local”，可是并不是所有的JS执行环境都如此行事，有的会根据是否执行包含f的代码块来有条件地绑定函数f（绑定即意味着将该变量绑定到其最近的作用域，而赋值是发生在代码实际执行到赋值那一步的时候进行的）。<br>因此最好的办法是如果要声明嵌套函数，都在其富函数的最外层声明，要么就不要声明函数，而是使用var声明和函数表达式来实现：</p><figure class="highlight arcade"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">function</span> <span class="title function_">f</span>(<span class="params"></span>)&#123;<span class="keyword">return</span> “global”;&#125;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">test</span>(<span class="params">x</span>)&#123;</span><br><span class="line">     <span class="keyword">var</span> result=[];</span><br><span class="line">     <span class="keyword">if</span>(x)&#123;</span><br><span class="line">          <span class="keyword">var</span> g=<span class="keyword">function</span>(<span class="params"></span>)&#123;<span class="keyword">return</span> “local”&#125;</span><br><span class="line">          result.<span class="built_in">push</span>(g());</span><br><span class="line">     &#125;</span><br><span class="line">     result.<span class="built_in">push</span>(f());</span><br><span class="line">     <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="hasOwnProperty-NaN"><a href="#hasOwnProperty-NaN" class="headerlink" title="hasOwnProperty"></a>hasOwnProperty</h2><p>用js创建字典的时候，如果是利用对象的方式（因为JS对象的核心是一个字符串属性名称和属性值的映射表），会遇到一个问题就是原型污染，因为获取字典属性值的时候用<code>hasOwnProperty</code>还好，如果用<code>for in</code>遍历的话，不仅会遍历对象本身，包括它的原型，因此如果在其他地方污染了Object的原型，那么<code>for in</code>就会产生非预期的结果，这时可能会用<code>hasOwnProperty</code>来先检测该对象本身是否含有属性来避免原型污染，然而更极端的情况是连<code>hasOwnProperty</code>这个原型方法都有可能被污染。<br>避免原型污染的方法是在创建字典对象的时候用<code>Object.create(null)</code>来创建一个完全空对象，这个对象没有原型，这个方法是<code>ES5</code>的,在没有这个方法可用的时候，最好是创建字典类，然后在字典类里用数组来存储有序集合，自己维护这个集合。  </p><h2 id="类数组对象"><a href="#类数组对象" class="headerlink" title="类数组对象"></a>类数组对象</h2><p>JS中的类数组对象可以享用数组的大部分原型方法如<code>map</code>等<br>类数组对象是指满足两个条件的对象：<br>    一是具备合理范围值内的length属性<br>    二是length属性大于该对象的最大索引，索引是一个合理范围的证书，它的字符串表示的是对象的一个key；<br>但是数组的一个原型方法<code>contact</code>是不能被类数组对象调用的，因此需要先用<code>[].slice.call</code>把类数组对象转换为真正的数组比如<code>[].slice.call(arguments)</code>。  </p><h2 id="结构类型"><a href="#结构类型" class="headerlink" title="结构类型"></a>结构类型</h2><p>并不是所有时候都需要继承，继承也不是完美的，有时候会创造比他能解决的更多的问题，特别是当层次关系没那么明显的时候，这时候应该多用<code>结构类型</code>(又叫<code>鸭子类型</code>，如果它看起来像鸭子、游泳像鸭子并且叫声像鸭子，那么它就是鸭子)，用结构类型设计灵活的对象接口的时候，不需要创建类工厂来返回类的实例，而是直接返回对象，对象具备预期的方法和属性，比如：</p><figure class="highlight nim"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">SomeObj</span>.someWidget=function(opts)&#123;</span><br><span class="line">     <span class="keyword">return</span> &#123;</span><br><span class="line">          a:blabla,</span><br><span class="line">          b:function()<span class="meta">&#123;...&#125;</span>,</span><br><span class="line">          c:blabla</span><br><span class="line">     &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="JavaScript-自动插入分号"><a href="#JavaScript-自动插入分号" class="headerlink" title="JavaScript 自动插入分号"></a>JavaScript 自动插入分号</h2><p>JavaScript 具备自动插入分号的能力，但是自动插入分号并不是万能的，其有三条规则：</p><ol><li><h4 id="只在-标记之前、一个或多个换行之后以及程序输入的结尾被插入"><a href="#只在-标记之前、一个或多个换行之后以及程序输入的结尾被插入" class="headerlink" title="只在}标记之前、一个或多个换行之后以及程序输入的结尾被插入"></a>只在<code>&#125;</code>标记之前、一个或多个换行之后以及程序输入的结尾被插入</h4></li><li><h4 id="分号只在随后的输入标记不能被解析时插入"><a href="#分号只在随后的输入标记不能被解析时插入" class="headerlink" title="分号只在随后的输入标记不能被解析时插入"></a>分号只在随后的输入标记不能被解析时插入</h4><blockquote><p>!!这一点很重要,比如:<br> a &#x3D; b<br> (fn());<br> 是不会在<code>a=b</code>之后自动插入分号的，因为<code>a=b(f())</code>是可以被解析的，因此像<code>(</code>,<code>[</code>,<code>+</code>,<code>-</code>,<code>/</code>开头的时候，需要特别注意上一行可能不会自动插入。<br> 还有一些情况，尽管不会出现解析错误，JS仍然会强制插入分号，这就是所谓的JS语法限制产生式。它不允许在两个字符间出现换行，最危险的就是<code>return</code>语句，如<br> return<br>{};<br>  会被强制插入而成为<br>  return;<br>{};<br>  类似的还有：<code>throw语句</code>、带有显示标签的<code>break</code>或着<code>continue</code>语句、后置自增或自减运算符</p></blockquote></li><li><h4 id="分号不会作为分隔符在for循环空语句的头部被自动插入"><a href="#分号不会作为分隔符在for循环空语句的头部被自动插入" class="headerlink" title="分号不会作为分隔符在for循环空语句的头部被自动插入"></a>分号不会作为分隔符在for循环空语句的头部被自动插入</h4></li></ol><p>因此，最好的办法是在自己的js文件的最开始防御性地插入<code>;</code>，这样在合并js文件的时候就不会出问题了。  </p><blockquote><p>本文转载自博客园,原文略有删减,侵权即删.<br>原文链接：<a href="http://www.cnblogs.com/dson/p/4415278.html">你可能不知道的一些JavaScript 奇技淫巧</a><br>原文作者：<a href="http://www.cnblogs.com/dson/">FirstLovt</a> </p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;img src=&quot;https://img2.imgtp.com/2024/03/23/f95idnmO.jpg&quot;&gt;&lt;/p&gt;
&lt;blockquote class=&quot;blockquote-center&quot;&gt;这里记录一下以前学习各种书籍和文章里边出现的JS的小技巧，分享给大家，也
      
    
    </summary>
    
    
      <category term="学习笔记" scheme="https://ioliu.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="JavaScript" scheme="https://ioliu.cn/tags/JavaScript/"/>
    
      <category term="JavaScript技巧" scheme="https://ioliu.cn/tags/JavaScript%E6%8A%80%E5%B7%A7/"/>
    
      <category term="结构类型" scheme="https://ioliu.cn/tags/%E7%BB%93%E6%9E%84%E7%B1%BB%E5%9E%8B/"/>
    
      <category term="数组遍历" scheme="https://ioliu.cn/tags/%E6%95%B0%E7%BB%84%E9%81%8D%E5%8E%86/"/>
    
      <category term="前端" scheme="https://ioliu.cn/tags/%E5%89%8D%E7%AB%AF/"/>
    
  </entry>
  
  <entry>
    <title>Hello World for Hexo</title>
    <link href="https://ioliu.cn/2015/hexo-your-blog/"/>
    <id>https://ioliu.cn/2015/hexo-your-blog/</id>
    <published>2015-05-06T02:21:08.000Z</published>
    <updated>2026-04-01T11:17:24.570Z</updated>
    
    <content type="html"><![CDATA[<p><img src="https://img2.imgtp.com/2024/03/23/ihWy1gdP.jpg"></p><p>今天把博客移到了<code>Hexo</code>,感觉蛮不错的 ^_^ .</p><h2 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h2><p><a href="https://github.com/hexojs/hexo">hexo</a> 是一款基于Node.js的静态博客框架。目前在GitHub上已有4k+ star 和 700+ fork (<a href="http://hexo.io/">官网</a>)。<br>是一个快速、简洁且高效的博客框架。<code>Hexo</code> 使用 <code>Markdown</code>（或其他渲染引擎）解析文章，在几秒内，即可利用靓丽的主题生成静态网页。</p><h2 id="特性"><a href="#特性" class="headerlink" title="特性"></a>特性</h2><ul><li>风一般的速度:<br>  <code>Hexo</code>基于<code>Node.js</code>，支持多进程，几百篇文章也可以秒生成。</li><li>流畅的撰写:<br>  支持<code>GitHub Flavored Markdown</code>和所有<code>Octopress</code>的<a href="http://hexo.io/plugins/">插件</a>。</li><li>扩展性:<br>  <code>Hexo</code>支持<code>EJS</code>、<code>Swig</code>和<code>Stylus</code>。通过插件支持<code>Haml</code>、<code>Jade</code>和<code>Less</code>.</li></ul><h2 id="快速入门"><a href="#快速入门" class="headerlink" title="快速入门"></a>快速入门</h2><h2 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h2><p>安装 <code>Hexo</code> 相当简单。然而在安装前，您必须检查电脑中是否已安装下列应用程序：  </p><ul><li><a href="http://nodejs.org/">Node.js</a></li><li><a href="http://git-scm.com/">Git</a></li></ul><p>如果您的电脑中已经安装上述必备程序，那么恭喜您！接下来只需要使用 npm 即可完成 Hexo 的安装。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install -g hexo-cli </span><br></pre></td></tr></table></figure><p>仅需一步就把 Hexo 本体和所有相依套件安装完毕，很简单吧？</p><h2 id="升级"><a href="#升级" class="headerlink" title="升级"></a>升级</h2><p>更新hexo到最新版</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm update hexo -g  </span><br></pre></td></tr></table></figure><h2 id="初始化"><a href="#初始化" class="headerlink" title="初始化"></a>初始化</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hexo init &lt;folder&gt;</span><br><span class="line"><span class="built_in">cd</span> &lt;floder&gt;</span><br><span class="line">npm install</span><br></pre></td></tr></table></figure><p>如果指定 <code>&lt;folder&gt;</code>，便会在目前的资料夹建立一个名为 <code>&lt;folder&gt;</code> 的新文件夹；否则会在目前文件夹初始化。</p><h2 id="新建"><a href="#新建" class="headerlink" title="新建"></a>新建</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo new [layout] &lt;title&gt;</span><br></pre></td></tr></table></figure><p>新建一篇文章。如果没有设置 <code>layout</code> 的话，默认使用 <code>_config.yml</code> 中的 <code>default_layout</code> 参数代替。如果标题包含空格的话，请使用引号括起来。  </p><h2 id="生成静态文件"><a href="#生成静态文件" class="headerlink" title="生成静态文件"></a>生成静态文件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo g</span><br><span class="line">//或者 hexo generate</span><br></pre></td></tr></table></figure><h2 id="启动服务"><a href="#启动服务" class="headerlink" title="启动服务"></a>启动服务</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo s</span><br><span class="line">//或者 hexo server</span><br></pre></td></tr></table></figure><p>启动服务后,打开浏览器输入 <code>http://localhost:4000</code> 回车,即可看到效果.</p><h2 id="部署"><a href="#部署" class="headerlink" title="部署"></a>部署</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hexo d</span><br><span class="line">//可以通过hexo d -g 命令完成生成和部署</span><br></pre></td></tr></table></figure><p>如果出现错误，可能是没有安装<code>部署</code>插件，请执行下面的命令安装插件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo-deploy-git --save-dev</span><br></pre></td></tr></table></figure><blockquote><p>Hexo官网：[<a href="http://hexo.io/">http://Hexo.io</a>]<br><a href="https://hexo.io/zh-cn/docs/deployment.html">部署Hexo</a> </p></blockquote>]]></content>
    
    <summary type="html">
    
      
      
        &lt;p&gt;&lt;img src=&quot;https://img2.imgtp.com/2024/03/23/ihWy1gdP.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;今天把博客移到了&lt;code&gt;Hexo&lt;/code&gt;,感觉蛮不错的 ^_^ .&lt;/p&gt;
&lt;h2 id=&quot;简介&quot;&gt;&lt;a href=&quot;#简介&quot; cl
      
    
    </summary>
    
    
      <category term="学习笔记" scheme="https://ioliu.cn/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
      <category term="Hexo" scheme="https://ioliu.cn/tags/Hexo/"/>
    
      <category term="免费博客" scheme="https://ioliu.cn/tags/%E5%85%8D%E8%B4%B9%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
</feed>
