<?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="http://lucylc.com/"/>
  <updated>2018-04-26T08:22:54.198Z</updated>
  <id>http://lucylc.com/</id>
  
  <author>
    <name>rossilc,露西&amp;罗西</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>实用型JavaScript方法总结--持续更新中</title>
    <link href="http://lucylc.com/JavaScript/2018/04/22/%E5%AE%9E%E7%94%A8%E5%9E%8BJavaScript%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93.html"/>
    <id>http://lucylc.com/JavaScript/2018/04/22/实用型JavaScript方法总结.html</id>
    <published>2018-04-22T09:11:25.000Z</published>
    <updated>2018-04-26T08:22:54.198Z</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>收集一些比较有趣且实（装）用（X）的JavaScript方法实现，学习并提供总结，欢迎大家提提意见一起探讨。
<a id="more"></a></p>
</blockquote>
<h2 id="去抖动函数"><a href="#去抖动函数" class="headerlink" title="去抖动函数"></a>去抖动函数</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//在一段连续时间内，传入的fn只执行一次</span></div><div class="line"><span class="comment">//去抖动函数</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">debouce</span>(<span class="params">fn,time,immediate</span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> firstCall = <span class="literal">false</span>,<span class="comment">//没有执行过</span></div><div class="line">        timer = <span class="literal">null</span>;</div><div class="line">    <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        <span class="keyword">var</span> delayFn,</div><div class="line">            ctx = <span class="keyword">this</span>,</div><div class="line">            args = <span class="built_in">arguments</span>;</div><div class="line"></div><div class="line">        <span class="keyword">var</span> callNow = immediate &amp;&amp; !firstCall;</div><div class="line">        <span class="keyword">if</span>(callNow)&#123;</div><div class="line">            firstCall = <span class="literal">true</span>;<span class="comment">//执行过</span></div><div class="line">            <span class="keyword">return</span> fn.apply(ctx, args);</div><div class="line">        &#125;</div><div class="line"></div><div class="line">        delayFn = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">            timer = <span class="literal">null</span>;</div><div class="line">            fn.apply(cxt,args);</div><div class="line">        &#125;</div><div class="line">        clearTimeout(timer);</div><div class="line">        timer = setTimeout(delayFn, time);</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h2 id="节流函数"><a href="#节流函数" class="headerlink" title="节流函数"></a>节流函数</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//节流函数</span></div><div class="line"><span class="comment">//在一段连续时间内，减少这段时间内fn的执行频率</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">throttle</span>(<span class="params">fn, delay</span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> last = <span class="number">0</span>,</div><div class="line">        timer;</div><div class="line">    <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        <span class="keyword">var</span> ctx = <span class="keyword">this</span>,</div><div class="line">            res = <span class="literal">null</span>,</div><div class="line">            now = <span class="built_in">Date</span>.now(),</div><div class="line">            args = <span class="built_in">arguments</span>,</div><div class="line">            remainTime = delay - (now - last);<span class="comment">//距离上一次执行的剩余时间</span></div><div class="line">        <span class="comment">//last为0：代表第一次执行。remainTime&lt;=0：剩余时间为0立刻执行fn。</span></div><div class="line">        <span class="comment">//remainTime&gt;delay：代表 remainTime - delay = -(now-last) = last-now &gt;0,表示客户端时间调为了过去时间</span></div><div class="line">        <span class="keyword">if</span>(last == <span class="number">0</span> || remainTime &lt;=<span class="number">0</span> || remainTime &gt; delay)&#123;</div><div class="line">            <span class="comment">//立刻执行</span></div><div class="line">            <span class="keyword">if</span>(timer)&#123;</div><div class="line">                clearTimeout(timer);</div><div class="line">                timer = <span class="literal">null</span>;</div><div class="line">            &#125;</div><div class="line">            now = <span class="built_in">Date</span>.now();</div><div class="line">            <span class="keyword">return</span> fn.apply(ctx, args);</div><div class="line">        &#125;<span class="keyword">else</span>&#123;</div><div class="line">            clearTimeout(timer);</div><div class="line">            timer = setTimeout(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">                now = <span class="built_in">Date</span>.now();</div><div class="line">                res = fn.apply(ctx, args);</div><div class="line">                ctx = <span class="literal">null</span>;</div><div class="line">                args = <span class="literal">null</span>;</div><div class="line">                timer = <span class="literal">null</span>;</div><div class="line">            &#125;, remainTime);</div><div class="line">            <span class="keyword">return</span> res;</div><div class="line">        &#125;</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h2 id="类型判断"><a href="#类型判断" class="headerlink" title="类型判断"></a>类型判断</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//类型判断</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">isType</span>(<span class="params">type</span>) </span>&#123;</div><div class="line">    <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params">obj</span>) </span>&#123;</div><div class="line">        <span class="keyword">return</span> <span class="built_in">Object</span>.prototype.toString.call(obj) === <span class="string">'[object '</span> + type + <span class="string">']'</span>;</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h2 id="分批执行"><a href="#分批执行" class="headerlink" title="分批执行"></a>分批执行</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//集合内元素单位时间内按fn分批执行</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">timeChunk</span> (<span class="params">ary, fn, count</span>) </span>&#123;</div><div class="line">    <span class="keyword">var</span> obj,t,len = ary.length,trunks = <span class="number">0</span>,out = <span class="literal">false</span>;</div><div class="line">    <span class="keyword">var</span> start = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">        <span class="keyword">for</span> (<span class="keyword">var</span> i = trunks * (count || <span class="number">1</span>); i &lt; len; i++) &#123;</div><div class="line">            <span class="keyword">var</span> min = (trunks + <span class="number">1</span>) * count;</div><div class="line">            <span class="keyword">if</span>(i == len <span class="number">-1</span>)&#123;</div><div class="line">                out = <span class="literal">true</span>;</div><div class="line">            &#125;</div><div class="line">            <span class="keyword">if</span> (i - min &gt;= <span class="number">0</span>) &#123;</div><div class="line">                trunks += <span class="number">1</span>;</div><div class="line">                <span class="keyword">break</span>;</div><div class="line">            &#125;</div><div class="line">            fn(ary[i]);</div><div class="line">        &#125;</div><div class="line">    &#125;</div><div class="line">    <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">        t = setInterval(<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">            <span class="keyword">if</span> (out) &#123; <span class="comment">// 如果全部节点都已经被创建好</span></div><div class="line">                <span class="keyword">return</span> clearInterval(t);</div><div class="line">            &#125;</div><div class="line">            start();</div><div class="line">        &#125;, <span class="number">2000</span>); <span class="comment">// 分批执行的时间间隔，也可以用参数的形式传入</span></div><div class="line">    &#125;;</div><div class="line">&#125;;</div><div class="line"><span class="keyword">var</span> a = [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">7</span>,<span class="number">8</span>,<span class="number">9</span>];</div><div class="line"><span class="keyword">var</span> xfn = <span class="function"><span class="keyword">function</span>(<span class="params">i</span>)</span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(i);</div><div class="line">&#125;</div><div class="line"><span class="keyword">var</span> count = <span class="number">5</span>;</div><div class="line"><span class="keyword">var</span> test = timeChunk(a, xfn,count);</div></pre></td></tr></table></figure>
<h2 id="装饰器-aop面向切面编程"><a href="#装饰器-aop面向切面编程" class="headerlink" title="装饰器 aop面向切面编程"></a>装饰器 aop面向切面编程</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//aop面向切面编程</span></div><div class="line"><span class="built_in">Function</span>.prototype.before = <span class="function"><span class="keyword">function</span>(<span class="params">fn</span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> selfFn = <span class="keyword">this</span>;</div><div class="line">    <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        fn.apply(<span class="keyword">this</span>,<span class="built_in">arguments</span>);<span class="comment">// 执行新函数，修正this</span></div><div class="line">        <span class="keyword">return</span> selfFn.apply(<span class="keyword">this</span>,<span class="built_in">arguments</span>);<span class="comment">// 执行原函数</span></div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line"><span class="built_in">Function</span>.prototype.after = <span class="function"><span class="keyword">function</span>(<span class="params">fn</span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> selfFn = <span class="keyword">this</span>;<span class="comment">//保存当前函数的引用</span></div><div class="line">    <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        <span class="keyword">var</span> res = selfFn.apply(<span class="keyword">this</span>, <span class="built_in">arguments</span>)</div><div class="line">        fn.apply(<span class="keyword">this</span>, <span class="built_in">arguments</span>);</div><div class="line">        <span class="keyword">return</span> res;</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h2 id="Object-create的实现原理、new对象的步骤"><a href="#Object-create的实现原理、new对象的步骤" class="headerlink" title="Object.create的实现原理、new对象的步骤"></a>Object.create的实现原理、new对象的步骤</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//Object.create的实现原理</span></div><div class="line"><span class="comment">//object.create一般用来创建obj,其实质就是将源对象的引用指向到实例的__proto__上，var a = &#123;a:1&#125;; var b = Object.create(a); b的结构：&#123;__proto__:&#123;a:1,__proto__&#123;...&#125;&#125;&#125;,&#123;a:1,__proto__&#123;...&#125;&#125;就是a</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">ObjectCreate</span>(<span class="params">o</span>)</span>&#123;</div><div class="line">    <span class="function"><span class="keyword">function</span> <span class="title">F</span>(<span class="params"></span>)</span>&#123;&#125;;</div><div class="line">    F.prototype = o;</div><div class="line">    <span class="keyword">return</span> <span class="keyword">new</span> F();</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">//new对象的步骤</span></div><div class="line"><span class="keyword">var</span> objectFactory = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="keyword">var</span> obj = <span class="keyword">new</span> <span class="built_in">Object</span>(); <span class="comment">// 从Object.prototype 上克隆一个空的对象</span></div><div class="line">    <span class="keyword">var</span> Constructor = [].shift.call(<span class="built_in">arguments</span>); <span class="comment">// 取得外部传入的构造器，此例是Person</span></div><div class="line">    obj.__proto__ = Constructor.prototype; <span class="comment">// 指向正确的原型</span></div><div class="line">    <span class="keyword">var</span> ret = Constructor.apply(obj, <span class="built_in">arguments</span>); <span class="comment">// 借用外部传入的构造器给obj 设置属性</span></div><div class="line">    <span class="keyword">return</span> <span class="keyword">typeof</span> ret === <span class="string">'object'</span> ? ret : obj; <span class="comment">// 确保构造器总是会返回一个对象</span></div><div class="line">&#125;;</div></pre></td></tr></table></figure>
<h2 id="instanceof的实现原理"><a href="#instanceof的实现原理" class="headerlink" title="instanceof的实现原理"></a>instanceof的实现原理</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">instaceof_</span>(<span class="params">A, B</span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> ao = A.__proto__;</div><div class="line">    <span class="keyword">var</span> bo = B.prototype;</div><div class="line">    <span class="keyword">while</span>(<span class="literal">true</span>)&#123;</div><div class="line">        <span class="keyword">if</span>(ao === <span class="literal">null</span>) <span class="keyword">return</span> <span class="literal">false</span>;<span class="comment">// 因为Object.prototype.__proto__ 为null</span></div><div class="line">        <span class="keyword">if</span>(ao === bo) <span class="keyword">return</span> <span class="literal">true</span>;</div><div class="line">        A = A.__proto__;</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h2 id="判断对象是否为空"><a href="#判断对象是否为空" class="headerlink" title="判断对象是否为空"></a>判断对象是否为空</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">isEmptyObj</span>(<span class="params">obj</span>)</span>&#123;</div><div class="line">    <span class="keyword">for</span>(<span class="keyword">var</span> i <span class="keyword">in</span> obj)&#123;</div><div class="line">        <span class="keyword">if</span>(obj.hasOwnproperty(i))&#123;<span class="comment">//只针对对象自身属性，而非继承属性</span></div><div class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</div><div class="line">        &#125;</div><div class="line">    &#125;</div><div class="line">    <span class="keyword">return</span> <span class="literal">true</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h2 id="蹦床函数"><a href="#蹦床函数" class="headerlink" title="蹦床函数"></a>蹦床函数</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//递归方法优化，防止函数调用栈溢出最大值</span></div><div class="line"><span class="comment">//当在函数作用域下 调用另外一个函数 循环往复 会超出函数调用最大值</span></div><div class="line"><span class="comment">//这种情况可以采用递归调用来优化,可以用到蹦床函数：接收一个参数，当参数类型为函数时，执行并返回。</span></div><div class="line"><span class="comment">//场景：一个方法需要在方法内循环调用，体量很大，则需要使用蹦床函数递归优化。</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">trampoline</span>(<span class="params">fn</span>)</span>&#123;</div><div class="line">    <span class="keyword">while</span>(<span class="literal">true</span>)&#123;</div><div class="line">        <span class="keyword">if</span>(fn &amp;&amp; fn <span class="keyword">instanceof</span> <span class="built_in">Function</span>)&#123;</div><div class="line">            fn = fn();</div><div class="line">        &#125;</div><div class="line">        <span class="keyword">return</span> fn;</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h2 id="事件监听的装饰模式"><a href="#事件监听的装饰模式" class="headerlink" title="事件监听的装饰模式"></a>事件监听的装饰模式</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//事件监听的装饰模式</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">addEvent</span>(<span class="params">dom, handle, type</span>)</span>&#123;</div><div class="line">    <span class="keyword">try</span>&#123;</div><div class="line">        <span class="keyword">if</span>(<span class="string">"addEventListener"</span> <span class="keyword">in</span> <span class="built_in">document</span>)&#123;</div><div class="line">            dom.addEventListener(type,handle);</div><div class="line">        &#125;<span class="keyword">else</span>&#123;</div><div class="line">            dom.attachEvent(<span class="string">"on"</span>+type,handle);</div><div class="line">        &#125;</div><div class="line">    &#125;<span class="keyword">catch</span>(e)&#123;</div><div class="line">        dom[<span class="string">"on"</span>+type] = handle;</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h2 id="需求实现-add-1-2-3-6"><a href="#需求实现-add-1-2-3-6" class="headerlink" title="需求实现 add(1)(2)(3) - 6"></a>需求实现 add(1)(2)(3) - 6</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//需求实现 add(1)(2)(3) - 6</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">add</span>(<span class="params">n</span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> arr = [];</div><div class="line">    <span class="function"><span class="keyword">function</span> <span class="title">fn</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        [].push.apply(arr, [].slice.apply(<span class="built_in">arguments</span>));</div><div class="line">        <span class="keyword">return</span> fn;</div><div class="line">    &#125;</div><div class="line">    fn.toString = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        <span class="keyword">var</span> res = <span class="number">0</span>;</div><div class="line">        arr.map(<span class="function"><span class="keyword">function</span>(<span class="params">item, i</span>) </span>&#123;</div><div class="line">            res+=item;</div><div class="line">        &#125;)</div><div class="line">        <span class="keyword">return</span> res;</div><div class="line">    &#125;</div><div class="line">    <span class="keyword">return</span> fn(n)</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h2 id="require和define的原理"><a href="#require和define的原理" class="headerlink" title="require和define的原理"></a>require和define的原理</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//require和define的模拟</span></div><div class="line">(<span class="function"><span class="keyword">function</span>(<span class="params">w</span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> <span class="built_in">require</span>,</div><div class="line">        define;</div><div class="line">    <span class="comment">// factory只调用一次，初始化后下次require的时候不再调用factory方法，</span></div><div class="line">    <span class="comment">//而是直接返回modules[id].exports这里调用factory是隐式赋值，</span></div><div class="line">    <span class="comment">//利用对象在函数中作为参数传递时，只是传递的对象的引用，</span></div><div class="line">    <span class="comment">//那么只要在define方法的factory中module.exports进行属性赋值，</span></div><div class="line">    <span class="comment">//就相当于直接在modules中修改属性</span></div><div class="line">    (<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        <span class="keyword">var</span> <span class="built_in">module</span> = &#123;&#125;;</div><div class="line">        <span class="comment">//id只是命名空间，factory在require时执行，export是命名空间的输出</span></div><div class="line">        <span class="comment">//factory的执行目的就是将这个空间内需要存储的对象放入export中</span></div><div class="line">        <span class="comment">//在require该命名空间时返回export</span></div><div class="line">        define = <span class="function"><span class="keyword">function</span>(<span class="params">id, factory</span>)</span>&#123;</div><div class="line">            <span class="keyword">if</span>(!<span class="built_in">module</span>[id])&#123;</div><div class="line">                <span class="built_in">module</span>[id] = &#123;</div><div class="line">                    id: id,</div><div class="line">                    factory: factory,</div><div class="line">                    <span class="keyword">export</span>: &#123;&#125;</div><div class="line">                &#125;</div><div class="line">            &#125;<span class="keyword">else</span>&#123;</div><div class="line">                <span class="built_in">console</span>.log(id+<span class="string">" the module has been define"</span>)</div><div class="line">            &#125;</div><div class="line">        &#125;</div><div class="line">        <span class="comment">//接收一个id 并返回在define中factory生成的对象</span></div><div class="line">        <span class="built_in">require</span> = <span class="function"><span class="keyword">function</span>(<span class="params">id</span>)</span>&#123;</div><div class="line">            <span class="keyword">if</span>(!<span class="built_in">module</span>[id])&#123;</div><div class="line">                <span class="built_in">console</span>.log(id+<span class="string">" the module is not defined"</span>);</div><div class="line">            &#125;<span class="keyword">else</span>&#123;</div><div class="line">                <span class="keyword">if</span>(<span class="built_in">module</span>[id].factory)&#123;</div><div class="line">                    <span class="keyword">var</span> factory = <span class="built_in">module</span>[id].factory;</div><div class="line">                    factory(<span class="built_in">require</span>, <span class="built_in">module</span>[id].export, <span class="built_in">module</span>[id]);</div><div class="line">                    <span class="keyword">delete</span> <span class="built_in">module</span>[id].factory;</div><div class="line">                &#125;</div><div class="line">                <span class="keyword">return</span> <span class="built_in">module</span>[id].export;</div><div class="line">            &#125;</div><div class="line">        &#125;</div><div class="line">        define.remove = <span class="function"><span class="keyword">function</span>(<span class="params">id</span>)</span>&#123;</div><div class="line">            <span class="keyword">delete</span> <span class="built_in">module</span>[id];</div><div class="line">        &#125;</div><div class="line">    &#125;)();</div><div class="line">&#125;)(<span class="built_in">window</span>)</div></pre></td></tr></table></figure>
<h2 id="继承实现方法"><a href="#继承实现方法" class="headerlink" title="继承实现方法"></a>继承实现方法</h2><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">extend</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params">child, parent</span>)</span>&#123;</div><div class="line">        <span class="function"><span class="keyword">function</span> <span class="title">F</span>(<span class="params"></span>)</span>&#123;&#125;;</div><div class="line">        F.prototype = parent.prototype;</div><div class="line">        child.prototype = <span class="keyword">new</span> F;</div><div class="line">        child.prototype.constructor = child;</div><div class="line">        child.subperproto = parent.prototype;</div><div class="line">        <span class="keyword">return</span> child;</div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line"><span class="keyword">var</span> inherit = (<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">F</span>(<span class="params"></span>) </span>&#123;&#125;</div><div class="line">  <span class="keyword">return</span> <span class="function"><span class="keyword">function</span> (<span class="params">child, parent</span>) </span>&#123;</div><div class="line">    F.prototype = parent.prototype;</div><div class="line">    child.prototype = <span class="keyword">new</span> F;</div><div class="line">    child.prototype.constructor = child;</div><div class="line">    child.superproto = parent.prototype;</div><div class="line">    <span class="keyword">return</span> child;</div><div class="line">  &#125;;</div><div class="line">&#125;)();</div></pre></td></tr></table></figure>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/JavaScript/2018/04/22/实用型JavaScript方法总结.html">http://lucylc.com/JavaScript/2018/04/22/实用型JavaScript方法总结.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;收集一些比较有趣且实（装）用（X）的JavaScript方法实现，学习并提供总结，欢迎大家提提意见一起探讨。
    
    </summary>
    
      <category term="JavaScript" scheme="http://lucylc.com/categories/JavaScript/"/>
    
    
      <category term="JavaScript" scheme="http://lucylc.com/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>JavaScript常用设计模式总结</title>
    <link href="http://lucylc.com/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/2018/04/16/JavaScript%E5%B8%B8%E7%94%A8%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E6%80%BB%E7%BB%93.html"/>
    <id>http://lucylc.com/设计模式/2018/04/16/JavaScript常用设计模式总结.html</id>
    <published>2018-04-16T09:11:25.000Z</published>
    <updated>2018-04-26T07:51:43.298Z</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>一万个人心中，有一万哈姆雷特。JavaScript虽然是弱类型语言，但正因于此造就了JavaScript的灵活性和创造型。不同的人写实现同一个需求，可能实现方式都不相同，可以写的很简单，也可以很复杂，甚至可以使用设计模式来构建你的代码。
<a id="more"></a></p>
</blockquote>
<p>  写在前面，关于这篇文档的目的在于总结梳理，易于后期温故知新。</p>
<h2 id="JavaScript中使用设计模式的原因"><a href="#JavaScript中使用设计模式的原因" class="headerlink" title="JavaScript中使用设计模式的原因"></a>JavaScript中使用设计模式的原因</h2><p>关于在JavaScript中使用设计模式的原因有三点：</p>
<ul>
<li><strong>可维护性、复用性</strong>：适当的使用设计模式有助于降低代码的耦合度，使代码的复用和项目后期代码的重构变得更加容易，以及对”喜闻乐见”的需求变更更好的实现。</li>
<li><strong>团队协作</strong>：设计模式可以更好的组织项目代码结构，使得团队成员之间的工作任务依赖性降低。</li>
<li><strong>性能</strong>：合理使用设计模式，可以大幅度减少代码量，提高程序的运行速度。</li>
<li><strong>备注</strong>：实现设计模式容易，但是对于应该在什么时候使用什么模式却比较困难，盲目的套用设计模式，反而会使得项目复杂度提高，性能较低，造成过度设计。</li>
</ul>
<h2 id="单体模式-单例模式"><a href="#单体模式-单例模式" class="headerlink" title="单体模式/单例模式"></a>单体模式/单例模式</h2><p><strong>描述</strong>：单例模式属于创建型模式，用来限制对象的初始化，并且产生一个唯一实例，可以确保所有代码使用的是都是同一份资源。</p>
<p><strong>优点</strong>：可以用来划分命名空间，减少全局变量数目。</p>
<p><strong>场景</strong>：全局遮罩层。loading等全局组件。全局配置信息或者应用中比较唯一的信息。</p>
<p>案例代码：创建div</p>
<ul>
<li><p>实现方式一：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> createDiv = (<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">  <span class="keyword">var</span> div;</div><div class="line">  <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">if</span>(!div)&#123;</div><div class="line">      div = <span class="built_in">document</span>.createElement(<span class="string">"div"</span>);</div><div class="line">      div.innerHTML = <span class="string">"弹出框内容"</span>;</div><div class="line">      div.style.display = <span class="string">"none"</span>;</div><div class="line">      <span class="built_in">document</span>.body.appendChild(div);</div><div class="line">    &#125;</div><div class="line">    <span class="keyword">return</span> div;</div><div class="line">  &#125;</div><div class="line">&#125;);</div><div class="line"><span class="built_in">document</span>.body.onclick = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">  <span class="keyword">var</span> div = createDiv();</div><div class="line">  div.style.display = <span class="string">'block'</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p>实现方式二：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> createDiv = (<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">  <span class="keyword">var</span> div = <span class="built_in">document</span>.createElement(<span class="string">"div"</span>);</div><div class="line">  div.innerHTML = <span class="string">"弹出框内容"</span>;</div><div class="line">  div.style.display = <span class="string">"none"</span>;</div><div class="line">  <span class="built_in">document</span>.body.appendChild(div);</div><div class="line">  <span class="keyword">return</span> div;</div><div class="line">&#125;</div><div class="line"><span class="comment">//通用单例模式</span></div><div class="line"><span class="keyword">var</span> getInstance = <span class="function"><span class="keyword">function</span>(<span class="params">fn</span>)</span>&#123;</div><div class="line">  <span class="keyword">var</span> ret;</div><div class="line">  <span class="keyword">return</span> <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">return</span> ret || (ret = fn.call(<span class="keyword">this</span>,<span class="built_in">arguments</span>));</div><div class="line">  &#125;</div><div class="line">&#125;</div><div class="line"><span class="keyword">var</span> divInstance = getInstance(createDiv);</div><div class="line"></div><div class="line"><span class="built_in">document</span>.body.onclick = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">  <span class="keyword">var</span> div = divInstance();</div><div class="line">  div.style.display = <span class="string">'block'</span>;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
</ul>
<h2 id="代理模式"><a href="#代理模式" class="headerlink" title="代理模式"></a>代理模式</h2><p><strong>描述</strong>：代理模式是为一个对象提供一个代用品或占位符，以便控制对它的访问。
  代理模式的关键是，当客户不方便直接访问一个对象或者不满足需要的时候，提供一个替身
  对象来控制对这个对象的访问，客户实际上访问的是替身对象。替身对象对请求做出一些处理之
  后，再把请求转交给本体对象。可以提前过滤一些请求，对情况预先处理。</p>
<p><strong>优点</strong>：安全代理：用于控制不同权限的对象对目标对象的访问。但是js无法判断谁访问了某个对象，实现困难。</p>
<p><strong>场景</strong>：1.虚拟代理实现图片预加载：
    常见的做法是先用一张loading 图片占位，然后用异步的方式加载图片，等图片加载好了再把它填充到img节点里。
    2.虚拟代理合并HTTP请求：
    我们可以通过一个代理函数proxySynchronousFile 来收集一段时间之内的请求，
    最后一次性发送给服务器。比如我们等待2 秒之后才把这2 秒之内需要同步的文件ID 打包发给
    服务器，如果不是对实时性要求非常高的系统，2 秒的延迟不会带来太大副作用，却能大大减轻
    服务器的压力。
    3.虚拟代理在惰性加载中的应用：
    首先创建一个虚拟代理对象，接口和本体对象一致，缓存所有用户的操作，当用户需要使用的时候，加载
    本地对象，遍历缓存队列实现操作。
    4.缓存代理可以为一些开销大的运算结果提供暂时的存储，在下次运算时，如果传递进来的参
    数跟之前一致，则可以直接返回前面存储的运算结
    缓存代理的例子——计算乘积
    5.缓存代理用于ajax异步请求数据：分页缓存已经请求过的数据</p>
<p>案例代码： 图片的预加载一个默认图片
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div></pre></td><td class="code"><pre><div class="line">(<span class="function"><span class="keyword">function</span>(<span class="params">w</span>)</span>&#123;</div><div class="line">  <span class="comment">//傻瓜实现模式</span></div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">imgLoad</span>(<span class="params">src</span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> imgDom = <span class="built_in">document</span>.createElement(<span class="string">'img'</span>);</div><div class="line">    imgDom.src = <span class="string">'chrome-search://local-ntp/images/google_logo.png@2x'</span>;</div><div class="line">    <span class="built_in">document</span>.body.appendChild(imgDom);</div><div class="line">    <span class="keyword">var</span> img = <span class="keyword">new</span> Image();</div><div class="line">    img.src = src;</div><div class="line">    img.onload = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">      setTimeout(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        imgDom.src = src;</div><div class="line">      &#125;,<span class="number">2000</span>)</div><div class="line">    &#125;</div><div class="line">  &#125;</div><div class="line">  imgLoad(<span class="string">'chrome-search://local-ntp/images/close_3_mask.png'</span>);</div><div class="line"></div><div class="line">  <span class="comment">//单例实现模式</span></div><div class="line">  <span class="keyword">var</span> imgLoad1 = (<span class="function"><span class="keyword">function</span> (<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> imgDom = <span class="built_in">document</span>.createElement(<span class="string">'img'</span>);</div><div class="line">    <span class="built_in">document</span>.body.appendChild(imgDom);</div><div class="line">    <span class="keyword">var</span> img = <span class="keyword">new</span> Image();</div><div class="line">    img.onload = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">      setTimeout(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        imgDom.src = img.src;</div><div class="line">      &#125;,<span class="number">2000</span>)</div><div class="line">    &#125;</div><div class="line">    <span class="keyword">return</span> &#123;</div><div class="line">      setSrc : <span class="function"><span class="keyword">function</span>(<span class="params">src</span>)</span>&#123;</div><div class="line">        imgDom.src = <span class="string">'chrome-search://local-ntp/images/google_logo.png@2x'</span>;</div><div class="line">        img.src = src;</div><div class="line">      &#125;</div><div class="line">    &#125;</div><div class="line">  &#125;)();</div><div class="line">  imgLoad1.setSrc(<span class="string">"chrome-search://local-ntp/images/close_3_mask.png"</span>);</div><div class="line"></div><div class="line">  <span class="comment">//代理实现模式</span></div><div class="line">  <span class="keyword">var</span> imgLoad2 = (<span class="function"><span class="keyword">function</span> (<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> imgDom = <span class="built_in">document</span>.createElement(<span class="string">'img'</span>);</div><div class="line">    <span class="built_in">document</span>.body.appendChild(imgDom);</div><div class="line">    <span class="keyword">var</span> img = <span class="keyword">new</span> Image();</div><div class="line">    img.onload = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">      setTimeout(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        imgDom.src = img.src;</div><div class="line">      &#125;,<span class="number">2000</span>)</div><div class="line">    &#125;</div><div class="line">    <span class="keyword">return</span> &#123;</div><div class="line">      setSrc : <span class="function"><span class="keyword">function</span>(<span class="params">src</span>)</span>&#123;</div><div class="line">        imgDom.src = <span class="string">'chrome-search://local-ntp/images/google_logo.png@2x'</span>;</div><div class="line">        img.src = src;</div><div class="line">      &#125;</div><div class="line">    &#125;</div><div class="line">  &#125;)();</div><div class="line">  <span class="keyword">var</span> proxySetSrc = (<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">return</span> &#123;</div><div class="line">      setSrc : <span class="function"><span class="keyword">function</span>(<span class="params">src</span>)</span>&#123;</div><div class="line">        imgLoad2.setSrc(src);</div><div class="line">      &#125;</div><div class="line">    &#125;</div><div class="line">  &#125;)()</div><div class="line">  proxySetSrc.setSrc(<span class="string">'chrome-search://local-ntp/images/close_3_mask.png'</span>);</div><div class="line"></div><div class="line">  <span class="comment">//上面代理模式原理是这样，但是责任分离的不够单一，为了单一职责，如下：</span></div><div class="line">  <span class="keyword">var</span> imgLoad3 = (<span class="function"><span class="keyword">function</span> (<span class="params"></span>)</span>&#123;<span class="comment">//这里只创建一张图片，并对外开发一个设置src的接口</span></div><div class="line">    <span class="keyword">var</span> imgDom = <span class="built_in">document</span>.createElement(<span class="string">'img'</span>);</div><div class="line">    <span class="built_in">document</span>.body.appendChild(imgDom);</div><div class="line">    <span class="keyword">return</span> &#123;</div><div class="line">      setSrc : <span class="function"><span class="keyword">function</span>(<span class="params">src</span>)</span>&#123;</div><div class="line">        imgDom.src = src;</div><div class="line">      &#125;</div><div class="line">    &#125;</div><div class="line">  &#125;)();</div><div class="line">  <span class="comment">//在代理器中添加额外逻辑，这样创建图片和设置图片就单一职责了</span></div><div class="line">  <span class="keyword">var</span> proxySetSrc1 = (<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> img = <span class="keyword">new</span> Image();</div><div class="line">    img.onload = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">      setTimeout(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        imgLoad3.setSrc(img.src);</div><div class="line">      &#125;,<span class="number">2000</span>)</div><div class="line">    &#125;</div><div class="line">    <span class="keyword">return</span> &#123;</div><div class="line">      setSrc : <span class="function"><span class="keyword">function</span>(<span class="params">src</span>)</span>&#123;</div><div class="line">        imgLoad3.setSrc(<span class="string">'chrome-search://local-ntp/images/google_logo.png@2x'</span>);</div><div class="line">        img.src = src;</div><div class="line">      &#125;</div><div class="line">    &#125;</div><div class="line">  &#125;)();</div><div class="line">  proxySetSrc1.setSrc(<span class="string">'chrome-search://local-ntp/images/close_3_mask.png'</span>);</div><div class="line">&#125;)(<span class="built_in">window</span>)</div></pre></td></tr></table></figure></p>
<h2 id="组合模式"><a href="#组合模式" class="headerlink" title="组合模式"></a>组合模式</h2><p><strong>描述</strong>：组合模式（Composite）将对象组合成树形结构以表示“部分-整体”的层次结构，
  组合模式使得用户对单个对象和组合对象的使用具有一致性。也可以理解位用多个小对象组成一个大对象，成树形结构，树的叶对象和整个组合对象具有一致接口。</p>
<p><strong>优点</strong>：组合模式解耦了客户程序与复杂元素内部结构，从而使客户程序可以像处理简单元素一样来处理复杂元素。</p>
<p><strong>场景</strong>：你想表示对象的部分整体层次结构，希望用户忽略组合对象与单个对象的不同，用户将统一地使用组合结构中的所有对象。</p>
<p>案例代码：遥控器的宏
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div></pre></td><td class="code"><pre><div class="line">(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">  <span class="comment">//先用面向对象的方式实现</span></div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">command</span>(<span class="params"></span>)</span>&#123;&#125;</div><div class="line">  command.prototype.execute = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">throw</span> <span class="keyword">new</span> <span class="built_in">Error</span>(<span class="string">'不能实例化，在子类中重载'</span>);</div><div class="line">  &#125;</div><div class="line"></div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">openCommand</span>(<span class="params"></span>)</span>&#123;&#125;</div><div class="line">  openCommand.prototype = <span class="keyword">new</span> command();</div><div class="line">  openCommand.prototype.execute = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'开机'</span>);</div><div class="line">  &#125;</div><div class="line"></div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">closeCommand</span>(<span class="params"></span>)</span>&#123;&#125;</div><div class="line">  closeCommand.prototype = <span class="keyword">new</span> command();</div><div class="line">  closeCommand.prototype.execute = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'关机'</span>);</div><div class="line">  &#125;</div><div class="line"></div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">stopCommand</span>(<span class="params"></span>)</span>&#123;&#125;</div><div class="line">  stopCommand.prototype = <span class="keyword">new</span> command();</div><div class="line">  stopCommand.prototype.execute = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'暂停'</span>);</div><div class="line">  &#125;</div><div class="line"></div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">nextCommand</span>(<span class="params"></span>)</span>&#123;&#125;</div><div class="line">  nextCommand.prototype = <span class="keyword">new</span> command();</div><div class="line">  nextCommand.prototype.execute = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'下一个'</span>);</div><div class="line">  &#125;</div><div class="line"></div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">unionCommand</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.commands = [];</div><div class="line">  &#125;</div><div class="line">  unionCommand.prototype = <span class="keyword">new</span> command();</div><div class="line">  unionCommand.prototype.add = <span class="function"><span class="keyword">function</span>(<span class="params">command</span>)</span>&#123;</div><div class="line">    <span class="keyword">if</span>(<span class="keyword">this</span>.commands.indexOf(command) == <span class="number">-1</span>)&#123;</div><div class="line">      <span class="keyword">this</span>.commands.push(command);</div><div class="line">    &#125;</div><div class="line">  &#125;</div><div class="line">  unionCommand.prototype.execute = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.commands.map(<span class="function"><span class="keyword">function</span>(<span class="params">command,i</span>)</span>&#123;</div><div class="line">      command.execute();</div><div class="line">    &#125;);</div><div class="line">  &#125;</div><div class="line">  <span class="keyword">var</span> open = <span class="keyword">new</span> openCommand();</div><div class="line">  <span class="keyword">var</span> close = <span class="keyword">new</span> closeCommand()</div><div class="line">  <span class="keyword">var</span> stop = <span class="keyword">new</span> stopCommand();</div><div class="line">  <span class="keyword">var</span> next = <span class="keyword">new</span> nextCommand();</div><div class="line">  <span class="keyword">var</span> union = <span class="keyword">new</span> unionCommand();</div><div class="line">  union.add(open);</div><div class="line">  union.add(close);</div><div class="line">  union.add(stop);</div><div class="line">  union.add(next);</div><div class="line">  union.execute();</div><div class="line"></div><div class="line">  <span class="comment">//下面用js函数式方式实现</span></div><div class="line">  <span class="keyword">var</span> unionCommand1 = &#123;</div><div class="line">    commands : [],</div><div class="line">    add : <span class="function"><span class="keyword">function</span>(<span class="params">obj</span>)</span>&#123;</div><div class="line">      <span class="keyword">for</span> (<span class="keyword">var</span> i <span class="keyword">in</span> obj) &#123;</div><div class="line">        <span class="keyword">this</span>.commands.push(obj[i]);</div><div class="line">      &#125;</div><div class="line">    &#125;,</div><div class="line">    execute : <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">      <span class="keyword">this</span>.commands.map(<span class="function"><span class="keyword">function</span>(<span class="params">command,i</span>)</span>&#123;</div><div class="line">        command.execute();</div><div class="line">      &#125;);</div><div class="line">    &#125;</div><div class="line">  &#125;</div><div class="line">  <span class="keyword">var</span> commands1 = &#123;</div><div class="line">    openCommand : &#123;</div><div class="line">      execute : <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        <span class="built_in">console</span>.log(<span class="string">'开机'</span>);</div><div class="line">      &#125;</div><div class="line">    &#125;,</div><div class="line">    closeCommand : &#123;</div><div class="line">      execute : <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        <span class="built_in">console</span>.log(<span class="string">'关机'</span>);</div><div class="line">      &#125;</div><div class="line">    &#125;,</div><div class="line">    stopCommand : &#123;</div><div class="line">      execute : <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        <span class="built_in">console</span>.log(<span class="string">'暂停'</span>);</div><div class="line">      &#125;</div><div class="line">    &#125;,</div><div class="line">    nextCommand : &#123;</div><div class="line">      execute : <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">        <span class="built_in">console</span>.log(<span class="string">'下一个'</span>);</div><div class="line">      &#125;</div><div class="line">    &#125;,</div><div class="line">  &#125;</div><div class="line">  unionCommand1.add(commands1);</div><div class="line">  unionCommand1.execute();</div><div class="line">&#125;)()</div></pre></td></tr></table></figure></p>
<h2 id="建造者模式"><a href="#建造者模式" class="headerlink" title="建造者模式"></a>建造者模式</h2><p><strong>描述</strong>：将一个复杂对象的构造和形态分离，使用同样的创建过程，不同的表示方法，即建造者模式。
  建造者作为director必须拥有创建技能所有方法，而具体的建造技能由builder去完成，建造者指挥
  不同的builder去完成建造，最终得出结果。</p>
<p><strong>优点</strong>：拆分复杂的流程，易于扩展，指导者类可以随时变为一个新的业务指挥者。</p>
<p><strong>场景</strong>：产品和建造类比较稳定，业务逻辑主要封装在指挥者类中。</p>
<p>案例代码：
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div></pre></td><td class="code"><pre><div class="line">(<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">step1</span>(<span class="params">msg</span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.builder = msg;</div><div class="line">  &#125;</div><div class="line">  step1.prototype.do = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="keyword">this</span>.builder);</div><div class="line">  &#125;</div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">step2</span>(<span class="params">msg</span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.builder = msg;</div><div class="line">  &#125;</div><div class="line">  step2.prototype.some = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="keyword">this</span>.builder);</div><div class="line">  &#125;</div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">step3</span>(<span class="params">msg</span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.builder = msg;</div><div class="line">  &#125;</div><div class="line">  step3.prototype.sth = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="keyword">this</span>.builder);</div><div class="line">  &#125;</div><div class="line"></div><div class="line">  <span class="function"><span class="keyword">function</span> <span class="title">dosomesth</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.s1 = <span class="keyword">new</span> step1(<span class="string">"先打地基"</span>);</div><div class="line">    <span class="keyword">this</span>.s2 = <span class="keyword">new</span> step2(<span class="string">"再建骨架"</span>);</div><div class="line">    <span class="keyword">this</span>.s3 = <span class="keyword">new</span> step3(<span class="string">"最后封顶"</span>);</div><div class="line"></div><div class="line">  &#125;</div><div class="line">  dosomesth.prototype.do =<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.s1.do();</div><div class="line">  &#125;</div><div class="line">  dosomesth.prototype.some =<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.s2.some();</div><div class="line">  &#125;</div><div class="line">  dosomesth.prototype.sth =<span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.s3.sth();</div><div class="line">  &#125;</div><div class="line">  dosomesth.prototype.start = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">this</span>.do();</div><div class="line">    <span class="keyword">this</span>.some();</div><div class="line">    <span class="keyword">this</span>.sth();</div><div class="line">  &#125;</div><div class="line">  <span class="keyword">var</span> director = <span class="keyword">new</span> dosomesth();</div><div class="line">  director.start();</div><div class="line"></div><div class="line">&#125;)()</div></pre></td></tr></table></figure></p>
<p><strong>先这样，待续</strong></p>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/设计模式/2018/04/16/JavaScript常用设计模式总结.html">http://lucylc.com/设计模式/2018/04/16/JavaScript常用设计模式总结.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;一万个人心中，有一万哈姆雷特。JavaScript虽然是弱类型语言，但正因于此造就了JavaScript的灵活性和创造型。不同的人写实现同一个需求，可能实现方式都不相同，可以写的很简单，也可以很复杂，甚至可以使用设计模式来构建你的代码。
    
    </summary>
    
      <category term="设计模式" scheme="http://lucylc.com/categories/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"/>
    
    
      <category term="JavaScript" scheme="http://lucylc.com/tags/JavaScript/"/>
    
      <category term="设计模式" scheme="http://lucylc.com/tags/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/"/>
    
  </entry>
  
  <entry>
    <title>JavaScript中Object原生方法总结</title>
    <link href="http://lucylc.com/JavaScript/2018/04/16/JavaScript%E4%B8%ADObject%E5%8E%9F%E7%94%9F%E6%96%B9%E6%B3%95%E6%80%BB%E7%BB%93.html"/>
    <id>http://lucylc.com/JavaScript/2018/04/16/JavaScript中Object原生方法总结.html</id>
    <published>2018-04-16T04:11:25.000Z</published>
    <updated>2018-04-26T08:57:05.267Z</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>关于ES5和ES6 Object中经常看到的方法的总结和梳理。虽然在日常开发中不经常使用，但是理解这些方法的含义对理解js有很大帮助。仅代表个人意见，有更好看法欢迎交流探讨。有些总结并不详细，只是把文章结构写出来，后续逐步更新，实在是有时候写着写着不知道怎么写，就先把想写列出来，以后慢慢写了。
<a id="more"></a></p>
</blockquote>
<h2 id="prototype"><a href="#prototype" class="headerlink" title="prototype"></a>prototype</h2><p>js的原型对象：js中每个数据类型都是对象（除了null和undefined），而每个对象都继承自另外一个对象，后者称为“原型”（prototype）对象，只有null除外，它没有自己的原型对象。
原型对象上的所有属性和方法，都会被对象实例所共享。
通过构造函数生成对象实例时，会将对象实例的原型指向构造函数的prototype属性。每一个构造函数都有一个prototype属性，这个属性就是对象实例的原型对象。</p>
<h2 id="isPrototypeOf-NaN"><a href="#isPrototypeOf-NaN" class="headerlink" title="isPrototypeOf"></a>isPrototypeOf</h2><p>isPrototypeOf()函数用于指示对象是否存在于另一个对象的原型链中。如果存在，返回true，否则返回false。
该方法属于Object对象，由于所有的对象都”继承”了Object的对象实例，因此几乎所有的实例对象都可以使用该方法。</p>
<h2 id="defineProperty和defineProperties"><a href="#defineProperty和defineProperties" class="headerlink" title="defineProperty和defineProperties"></a>defineProperty和defineProperties</h2><p>Object的defineProperty和defineProperties这两个方法在js中的重要性十分重要，主要功能就是用来定义或修改这些内部属性,与之相对应的getOwnPropertyDescriptor和getOwnPropertyDescriptors就是获取这行内部属性的描述。</p>
<ul>
<li><p>数据(数据描述符)属性
数据属性有4个描述内部属性的特性
[[Configurable]]
表示能否通过delete删除此属性，能否修改属性的特性，或能否修改把属性修改为访问器属性，如果直接使用字面量定义对象，默认值为true
[[Enumerable]]
表示该属性是否可枚举，即是否通过for-in循环或Object.keys()返回属性，如果直接使用字面量定义对象，默认值为true
[[Writable]]
能否修改属性的值，如果直接使用字面量定义对象，默认值为true
[[Value]]
该属性对应的值，默认为undefined</p>
</li>
<li><p>访问器(存取描述符)属性
访问器属性也有4个描述内部属性的特性
[[Configurable]]
和数据属性的[[Configurable]]一样，表示能否通过delete删除此属性，能否修改属性的特性，或能否修改把属性修改为访问器属性，如果直接使用字面量定义对象，默认值为true
[[Enumerable]]
和数据属性的[[Configurable]]一样，表示该属性是否可枚举，即是否通过for-in循环或Object.keys()返回属性，如果直接使用字面量定义对象，默认值为true
[[Get]]
一个给属性提供 getter 的方法(访问对象属性时调用的函数,返回值就是当前属性的值)，如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined
[[Set]]
一个给属性提供 setter 的方法(给对象属性设置值时调用的函数)，如果没有 setter 则为 undefined。该方法将接受唯一参数，并将该参数的新值分配给该属性。默认为 undefined</p>
</li>
<li><p>Object.defineProperty()
功能:
方法会直接在一个对象上定义一个新属性，或者修改一个对象的现有属性， 并返回这个对象。如果不指定configurable, writable, enumerable ，则这些属性默认值为false，如果不指定value, get, set，则这些属性默认值为undefined。
语法: Object.defineProperty(obj, prop, descriptor)
obj: 需要被操作的目标对象
prop: 目标对象需要定义或修改的属性的名称
descriptor: 将被定义或修改的属性的描述符</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> obj = <span class="keyword">new</span> <span class="built_in">Object</span>();</div><div class="line"><span class="built_in">Object</span>.defineProperty(obj, <span class="string">'name'</span>, &#123;</div><div class="line">    configurable: <span class="literal">false</span>,</div><div class="line">    writable: <span class="literal">true</span>,</div><div class="line">    enumerable: <span class="literal">true</span>,</div><div class="line">    value: <span class="string">'张三'</span></div><div class="line">&#125;)</div><div class="line"><span class="built_in">console</span>.log(obj.name)  <span class="comment">//张三</span></div></pre></td></tr></table></figure>
</li>
<li><p>Object.defineProperties()
功能:
方法直接在一个对象上定义一个或多个新的属性或修改现有属性，并返回该对象。</p>
</li>
</ul>
<p>语法: Object.defineProperties(obj, props)
obj: 将要被添加属性或修改属性的对象
props: 该对象的一个或多个键值对定义了将要为对象添加或修改的属性的具体配置
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> obj = <span class="keyword">new</span> <span class="built_in">Object</span>();</div><div class="line"><span class="built_in">Object</span>.defineProperties(obj, &#123;</div><div class="line">    name: &#123;</div><div class="line">        value: <span class="string">'张三'</span>,</div><div class="line">        configurable: <span class="literal">false</span>,</div><div class="line">        writable: <span class="literal">true</span>,</div><div class="line">        enumerable: <span class="literal">true</span></div><div class="line">    &#125;,</div><div class="line">    age: &#123;</div><div class="line">        value: <span class="number">18</span>,</div><div class="line">        configurable: <span class="literal">true</span></div><div class="line">    &#125;</div><div class="line">&#125;)</div><div class="line"><span class="built_in">console</span>.log(obj.name, obj.age) <span class="comment">// 张三, 18</span></div></pre></td></tr></table></figure></p>
<h2 id="简单的双向数据绑定"><a href="#简单的双向数据绑定" class="headerlink" title="简单的双向数据绑定"></a>简单的双向数据绑定</h2><p>html代码:
<figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></div><div class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span></div><div class="line">        input1=&gt;<span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">id</span>=<span class="string">"input1"</span>&gt;</span></div><div class="line">    <span class="tag">&lt;/<span class="name">p</span>&gt;</span></div><div class="line">    <span class="tag">&lt;<span class="name">p</span>&gt;</span></div><div class="line">        input2=&gt;</div><div class="line">        <span class="tag">&lt;<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">id</span>=<span class="string">"input2"</span>&gt;</span></div><div class="line">    <span class="tag">&lt;/<span class="name">p</span>&gt;</span></div><div class="line">    <span class="tag">&lt;<span class="name">div</span>&gt;</span></div><div class="line">        我每次比input1的值加1=&gt;</div><div class="line">        <span class="tag">&lt;<span class="name">span</span> <span class="attr">id</span>=<span class="string">"span"</span>&gt;</span><span class="tag">&lt;/<span class="name">span</span>&gt;</span></div><div class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></div><div class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></div></pre></td></tr></table></figure></p>
<p>js代码:
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> oInput1 = <span class="built_in">document</span>.getElementById(<span class="string">'input1'</span>);</div><div class="line"><span class="keyword">var</span> oInput2 = <span class="built_in">document</span>.getElementById(<span class="string">'input2'</span>);</div><div class="line"><span class="keyword">var</span> oSpan = <span class="built_in">document</span>.getElementById(<span class="string">'span'</span>);</div><div class="line"><span class="keyword">var</span> obj = &#123;&#125;;</div><div class="line"><span class="built_in">Object</span>.defineProperties(obj, &#123;</div><div class="line">    val1: &#123;</div><div class="line">        configurable: <span class="literal">true</span>,</div><div class="line">        get: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">            oInput1.value = <span class="number">0</span>;</div><div class="line">            oInput2.value = <span class="number">0</span>;</div><div class="line">            oSpan.innerHTML = <span class="number">0</span>;</div><div class="line">            <span class="keyword">return</span> <span class="number">0</span></div><div class="line">        &#125;,</div><div class="line">        set: <span class="function"><span class="keyword">function</span>(<span class="params">newValue</span>) </span>&#123;</div><div class="line">            oInput2.value = newValue;</div><div class="line">            oSpan.innerHTML = <span class="built_in">Number</span>(newValue) ? <span class="built_in">Number</span>(newValue) : <span class="number">0</span></div><div class="line">        &#125;</div><div class="line">    &#125;,</div><div class="line">    val2: &#123;</div><div class="line">        configurable: <span class="literal">true</span>,</div><div class="line">        get: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">            oInput1.value = <span class="number">0</span>;</div><div class="line">            oInput2.value = <span class="number">0</span>;</div><div class="line">            oSpan.innerHTML = <span class="number">0</span>;</div><div class="line">            <span class="keyword">return</span> <span class="number">0</span></div><div class="line">        &#125;,</div><div class="line">        set: <span class="function"><span class="keyword">function</span>(<span class="params">newValue</span>) </span>&#123;</div><div class="line">            oInput1.value = newValue;</div><div class="line">            oSpan.innerHTML = <span class="built_in">Number</span>(newValue)+<span class="number">1</span>;</div><div class="line">        &#125;</div><div class="line">    &#125;</div><div class="line">&#125;)</div><div class="line">oInput1.value = obj.val1;</div><div class="line">oInput1.addEventListener(<span class="string">'keyup'</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    obj.val1 = oInput1.value;</div><div class="line">&#125;, <span class="literal">false</span>)</div><div class="line">oInput2.addEventListener(<span class="string">'keyup'</span>, <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    obj.val2 = oInput2.value;</div><div class="line">&#125;, <span class="literal">false</span>)</div></pre></td></tr></table></figure></p>
<h2 id="hasOwnProperty-NaN"><a href="#hasOwnProperty-NaN" class="headerlink" title="hasOwnProperty"></a>hasOwnProperty</h2><p>判断一个属性是定义在对象本身而不是继承自原型链，我们需要使用从 Object.prototype 继承而来的 hasOwnProperty 方法。
hasOwnProperty 方法是 Javascript 中唯一一个处理对象属性而不会往上遍历原型链的。
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// Poisoning Object.prototype</span></div><div class="line"><span class="built_in">Object</span>.prototype.bar = <span class="number">1</span>;</div><div class="line"><span class="keyword">var</span> foo = &#123;<span class="attr">goo</span>: <span class="literal">undefined</span>&#125;;</div><div class="line"></div><div class="line">foo.bar; <span class="comment">// 1</span></div><div class="line"><span class="string">'bar'</span> <span class="keyword">in</span> foo; <span class="comment">// true</span></div><div class="line"></div><div class="line">foo.hasOwnProperty(<span class="string">'bar'</span>); <span class="comment">// false</span></div><div class="line">foo.hasOwnProperty(<span class="string">'goo'</span>); <span class="comment">// true：类型不等，true</span></div></pre></td></tr></table></figure></p>
<h2 id="getOwnPropertyNames"><a href="#getOwnPropertyNames" class="headerlink" title="getOwnPropertyNames"></a>getOwnPropertyNames</h2><p>Object.getOwnPropertyNames()方法返回对象的所有自身属性的属性名（包括不可枚举的属性）组成的数组，但不会获取原型链上的属性。
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">A</span>(<span class="params">a,aa</span>) </span>&#123;</div><div class="line">  <span class="keyword">this</span>.a = a;</div><div class="line">  <span class="keyword">this</span>.aa = aa;</div><div class="line">  <span class="keyword">this</span>.getA = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="keyword">return</span> <span class="keyword">this</span>.a;</div><div class="line">  &#125;</div><div class="line">&#125;</div><div class="line"><span class="comment">// 原型方法</span></div><div class="line">A.prototype.aaa = <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;&#125;;</div><div class="line"></div><div class="line"><span class="keyword">var</span> B = <span class="keyword">new</span> A(<span class="string">'b'</span>, <span class="string">'bb'</span>);</div><div class="line">B.myMethodA = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;&#125;;</div><div class="line"><span class="comment">// 不可枚举方法</span></div><div class="line"><span class="built_in">Object</span>.defineProperty(B, <span class="string">'myMethodB'</span>, &#123;</div><div class="line">  enumerable: <span class="literal">false</span>,</div><div class="line">  value: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;&#125;</div><div class="line">&#125;);</div><div class="line"></div><div class="line"><span class="built_in">Object</span>.getOwnPropertyNames(B); <span class="comment">// ["a", "aa", "getA", "myMethodA", "myMethodB"]</span></div></pre></td></tr></table></figure></p>
<h3 id="关于ES6中Objec-keys和ES5中Object-getOwnPropertyNames"><a href="#关于ES6中Objec-keys和ES5中Object-getOwnPropertyNames" class="headerlink" title="关于ES6中Objec.keys和ES5中Object.getOwnPropertyNames"></a>关于ES6中Objec.keys和ES5中Object.getOwnPropertyNames</h3><p>Object.keys()用于获取对象自身所有的可枚举的属性值，但不包括原型中的属性，然后返回一个由属性名组成的数组。注意它同for..in一样不能保证属性按对象原来的顺序输出。
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 遍历数组</span></div><div class="line"><span class="keyword">var</span> colors = [<span class="string">'red'</span>, <span class="string">'green'</span>, <span class="string">'blue'</span>];</div><div class="line">colors.length = <span class="number">10</span>;</div><div class="line">colors.push(<span class="string">'yellow'</span>);</div><div class="line"><span class="built_in">Array</span>.prototype.demo = <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;&#125;;</div><div class="line"></div><div class="line"><span class="built_in">Object</span>.keys(colors); <span class="comment">// 0 1 2 10</span></div><div class="line"></div><div class="line"><span class="comment">// 遍历对象</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">Person</span>(<span class="params">name, age</span>) </span>&#123;</div><div class="line">  <span class="keyword">this</span>.name = name;</div><div class="line">  <span class="keyword">this</span>.age = age;</div><div class="line">&#125;</div><div class="line"></div><div class="line">Person.prototype.demo = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;&#125;;</div><div class="line"></div><div class="line"><span class="keyword">var</span> jenemy = <span class="keyword">new</span> Person(<span class="string">'jenemy'</span>, <span class="number">25</span>);</div><div class="line"></div><div class="line"><span class="built_in">Object</span>.keys(jenemy); <span class="comment">// name age</span></div></pre></td></tr></table></figure></p>
<p>其实这几个方法之间的差异主要在属性是否可可枚举，是来自原型，还是实例。
|方法|  |适用范围|    |描述|
|for..in| |数组，对象|   |获取可枚举的实例和原型属性名|
|Object.keys()|   |数组，对象|   |返回可枚举的实例属性名组成的数组|
|Object.getPropertyNames()|   |数组，对象|   |返回除原型属性以外的所有属性（包括不可枚举的属性）名组成的数组|
|for..of| |可迭代对象(Array, Map, Set, arguments等)|  |返回属性值|</p>
<h2 id="getOwnPropertyDescriptor"><a href="#getOwnPropertyDescriptor" class="headerlink" title="getOwnPropertyDescriptor"></a>getOwnPropertyDescriptor</h2><p>功能:
该方法返回指定对象上一个自有属性对应的属性描述符。（自有属性指的是直接赋予该对象的属性，不需要从原型链上进行查找的属性）</p>
<p>语法: Object.getOwnPropertyDescriptor(obj, prop)
obj: 需要查找的目标对象
prop: 目标对象内属性名称
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> person = &#123;</div><div class="line">    name: <span class="string">'张三'</span>,</div><div class="line">    age: <span class="number">18</span></div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="keyword">var</span> desc = <span class="built_in">Object</span>.getOwnPropertyDescriptor(person, <span class="string">'name'</span>);</div><div class="line"><span class="built_in">console</span>.log(desc)  结果如下</div><div class="line"><span class="comment">// &#123;</span></div><div class="line"><span class="comment">//     configurable: true,</span></div><div class="line"><span class="comment">//     enumerable: true,</span></div><div class="line"><span class="comment">//     writable: true,</span></div><div class="line"><span class="comment">//     value: "张三"</span></div><div class="line"><span class="comment">// &#125;</span></div></pre></td></tr></table></figure></p>
<h2 id="getOwnPropertySymbols"><a href="#getOwnPropertySymbols" class="headerlink" title="getOwnPropertySymbols"></a>getOwnPropertySymbols</h2><p><strong>描述：</strong>ES6中新增语法，返回对象的自有符号属性。对象的自有符号属性是指直接在此对象上定义、而非从对象的原型继承的属性。</p>
<p><strong>语法：</strong>Object.getOwnPropertySymbols(object);</p>
<p><strong>例子：</strong></p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> obj = &#123;&#125;;</div><div class="line"><span class="keyword">var</span> key = <span class="built_in">Symbol</span>(<span class="string">'description'</span>);</div><div class="line">obj[key] = <span class="string">'data'</span>;</div><div class="line"><span class="keyword">var</span> symbols = <span class="built_in">Object</span>.getOwnPropertySymbols(obj);</div><div class="line"><span class="comment">// Symbol(description)</span></div></pre></td></tr></table></figure>
<h2 id="getPrototypeOf"><a href="#getPrototypeOf" class="headerlink" title="getPrototypeOf"></a>getPrototypeOf</h2><blockquote>
<p>关于ES5中getPrototypeOf方法的理解可以与__proto__、prototype一起探讨。</p>
</blockquote>
<ul>
<li>prototype: 一般用来为一个类型建立它的原型继承对象。用于继承、实例的方法或者属性共享。</li>
<li><strong>getPrototypeOf: Object.getPrototypeOf(obj)是ES5中用来得到obj对象的原型对象的标准方法。</strong></li>
<li>__proto__: obj.__proto__是一个非标准的用来得到obj对象的原型对象的方法。<em>下文提到的__proto__都是在chrom浏览器环境下的测试结果。</em></li>
</ul>
<p>说到getPrototypeOf，就必须提及原型、原型链、prototype、__proto__了。下面用一张图来说明它们之间千丝万缕的关系：
<img src="../../../../images/prototype.jpg" alt=""></p>
<ol>
<li><p>在JS中，万物皆对象。除了null以外所有对象都含有__proto__属性。而子类实例的__proto__指向父类构造函数的原型对象：child.__proto__ == parents.prototype。这也保证了子类实例对象能够访问父类的原型中方法和属性。</p>
</li>
<li><p>任何Function类型对象都拥有prototype、__proto__这两个重要属性，也包含了其他的属性：arguments、caller、length、name、自定义的静态属性和方法以及方法的执行上下文。假如有一个方法test，在test方法的原型对象prototype中包含了3大块：</p>
<ol>
<li>constructor：这是一个指针，指向构造函数本身,test.prototype.constructor=test。</li>
<li>__proto__：继承test父类的prototype属性，test.prototype.__proto__ = Object.prototype。</li>
<li>自定义的原型方法或者属性：这些属性都可以被test的实例继承，例如：</li>
</ol>
</li>
</ol>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">test</span>(<span class="params"></span>)</span>&#123;&#125;</div><div class="line">test.prototype.a = <span class="number">1</span>;</div><div class="line"><span class="keyword">var</span> b = <span class="keyword">new</span> test();</div><div class="line"><span class="comment">//那么 b.\_\_proto\_\_ == test.prototype</span></div><div class="line"><span class="comment">//那么b.a =&gt; 1;这个a就是从test的prototyp上继承过来的。</span></div></pre></td></tr></table></figure>
<p><strong>备注：</strong>顺带提一下静态属性和方法：就是不能被子类继承只能通过自身来访问的属性和方法,例如：
 <figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">test</span>(<span class="params"></span>)</span>&#123;&#125;;</div><div class="line">test.x = <span class="number">1</span>;</div><div class="line">test.y = <span class="function"><span class="keyword">function</span>(<span class="params"></span>)</span>&#123;&#125;;</div><div class="line"><span class="comment">//这里x、y就只能通过test来访问，不会被子类实例继承。</span></div></pre></td></tr></table></figure></p>
<p><strong>关于Function和Object的联系：</strong>上面提到 child.__proto__ == parents.prototype。</p>
<ul>
<li>对象Object的构造函数也是方法类型，Object.__proto__的打印结果是一个空方法：function Empty(){};那么代表了Object.__proto__ == Function.prototype。</li>
<li>而Function.__proto__的打印结果也是一个空方法：function Empty(){};(这里是是一个特例)，这说明：Function.__proto__ == Function.prototype。</li>
<li>所以Object和Function之间关系可以这样认为：<strong>Function.__proto__ == Object.__proto__ == Function.prototype ==&gt;function Empty(){}</strong>。</li>
<li>然而还没完，在js里万物皆对象，这里的Empty方法也是对象类型，说明Empty.__proto__ == Object.prototype。(这里Empty代表Function.__proto__)。貌似还没完：Empty.__proto__.__proto__ ==&gt;null，我们发现这一切都归于了虚无(null)，而在js中null也是一个特殊的对象，在初始化变量都会初始化为null，仿佛这不是结束而是新的开始。研究到这里，不禁感叹啊，真是生于此，终于此，As the end, so the start。</li>
</ul>
<h2 id="create"><a href="#create" class="headerlink" title="create"></a>create</h2><ul>
<li>关于Object.create和new Object两者的区别和实现猜想：
Object.create()方法是ECMAScript5中新增的，用来规范化原型式继承的。object.create一般用来创建obj,其实质就是将源对象的原型引用指向到实例的<strong>proto</strong>上，var a = {a:1}; var b = Object.create(a); b的结构：{<strong>proto</strong>:{a:1,<strong>proto</strong>{…}}},{a:1,<strong>proto</strong>{…}}就是a。<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line"><span class="comment">//Object.create的实现原理</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">ObjectCreate</span>(<span class="params">o</span>)</span>&#123;</div><div class="line">    <span class="function"><span class="keyword">function</span> <span class="title">F</span>(<span class="params"></span>)</span>&#123;&#125;;</div><div class="line">    F.prototype = o;</div><div class="line">    <span class="keyword">return</span> <span class="keyword">new</span> F();</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">//new Object的实现原理</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">newObject</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> obj = <span class="keyword">new</span> <span class="built_in">Object</span>(); <span class="comment">// 从Object.prototype 上克隆一个空的对象</span></div><div class="line">    <span class="keyword">var</span> Constructor = [].shift.call(<span class="built_in">arguments</span>); <span class="comment">// 取得外部传入的构造器，此例是Person</span></div><div class="line">    obj.__proto__ = Constructor.prototype; <span class="comment">// 指向正确的原型</span></div><div class="line">    <span class="keyword">var</span> ret = Constructor.apply(obj, <span class="built_in">arguments</span>); <span class="comment">// 借用外部传入的构造器给obj 设置属性</span></div><div class="line">    <span class="keyword">return</span> <span class="keyword">typeof</span> ret === <span class="string">'object'</span> ? ret : obj; <span class="comment">// 确保构造器总是会返回一个对象</span></div><div class="line">&#125;;</div></pre></td></tr></table></figure>
</li>
</ul>
<h2 id="is"><a href="#is" class="headerlink" title="is"></a>is</h2><ul>
<li>==：等同，比较运算符，两边值类型不同的时候，先进行类型转换，再比较；</li>
<li>===：恒等，严格比较运算符，不做类型转换，类型不同就是不等；</li>
<li>Object.is()是ES6新增的用来比较两个值是否严格相等的方法，与===的行为基本一致。</li>
</ul>
<h3 id=""><a href="#" class="headerlink" title="==="></a>===</h3><p>这个比较简单，只需要利用下面的规则来判断两个值是否恒等就行了：
如果类型不同，就不相等
如果两个都是数值，并且是同一个值，那么相等；
值得注意的是，如果两个值中至少一个是NaN，那么不相等（判断一个值是否是NaN，可以用isNaN()或Object.is()来判断）。
如果两个都是字符串，每个位置的字符都一样，那么相等；否则不相等。
如果两个值都是同样的Boolean值，那么相等。
如果两个值都引用同一个对象或函数，那么相等，即两个对象的物理地址也必须保持一致；否则不相等。
如果两个值都是null，或者都是undefined，那么相等。</p>
<h3 id="Object-is-，"><a href="#Object-is-，" class="headerlink" title="Object.is()，"></a>Object.is()，</h3><blockquote>
<p>其行为与===基本一致，不过有两处不同：+0不等于-0。NaN等于自身。举个栗子☺：</p>
</blockquote>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">+<span class="number">0</span> === <span class="number">-0</span> <span class="comment">//true</span></div><div class="line"><span class="literal">NaN</span> === <span class="literal">NaN</span> <span class="comment">// false</span></div><div class="line"></div><div class="line"><span class="built_in">Object</span>.is(+<span class="number">0</span>, <span class="number">-0</span>) <span class="comment">// false</span></div><div class="line"><span class="built_in">Object</span>.is(<span class="literal">NaN</span>, <span class="literal">NaN</span>) <span class="comment">// true</span></div></pre></td></tr></table></figure>
<h3 id="-1"><a href="#-1" class="headerlink" title="=="></a>==</h3><p>如果两个值类型相同，进行===比较。
如果两个值类型不同，那么他们可能相等。根据下面规则进行类型转换，然后再比较：
如果一个是null、一个是undefined，那么相等。
如果一个是字符串，一个是数值，把字符串转换成数值再进行比较。
如果任一值是true，把它转换成 1 再比较；如果任一值是false，把它转换成 0 再比较。
如果一个是对象，另一个是数值或字符串，把对象转换成基础类型的值再比较。对象转换成基础类型，利用它的toString或者valueOf方法。
JS的核心内置类，会尝试valueOf先于toString；但有一个是例外——Date，Date利用的是toString转换。
非JS核心的对象，令说（比较麻烦，我也不大懂）。
任何其他组合，都不相等。
举个栗子☺：
“1” == true：类型不等，true 会先转换成数值 1 ，现在变成 “1” == 1 ，再把 “1” 转换成 1 ，比较 1 == 1 ， 相等。</p>
<p>举个全局的栗子☺：</p>
<p>=：赋值运算符。
==：等于。
===：严格等于。
Object.is()：加强版严格等于。
例：
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> a = <span class="number">3</span>;</div><div class="line"><span class="keyword">var</span> b = <span class="string">"3"</span>;</div><div class="line"></div><div class="line">a==b;    <span class="comment">// true</span></div><div class="line">a===b;   <span class="comment">// false，因为*a*，*b*的类型不一样</span></div><div class="line"><span class="built_in">Object</span>.is( a, b );  <span class="comment">//false，因为*a*，*b*的类型不一样</span></div></pre></td></tr></table></figure></p>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/JavaScript/2018/04/16/JavaScript中Object原生方法总结.html">http://lucylc.com/JavaScript/2018/04/16/JavaScript中Object原生方法总结.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;关于ES5和ES6 Object中经常看到的方法的总结和梳理。虽然在日常开发中不经常使用，但是理解这些方法的含义对理解js有很大帮助。仅代表个人意见，有更好看法欢迎交流探讨。有些总结并不详细，只是把文章结构写出来，后续逐步更新，实在是有时候写着写着不知道怎么写，就先把想写列出来，以后慢慢写了。
    
    </summary>
    
      <category term="JavaScript" scheme="http://lucylc.com/categories/JavaScript/"/>
    
    
      <category term="JavaScript" scheme="http://lucylc.com/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>JavaScript中位运算符的基本常识</title>
    <link href="http://lucylc.com/JavaScript/2018/04/10/JavaScript%E4%B8%AD%E4%BD%8D%E8%BF%90%E7%AE%97%E7%AC%A6%E7%9A%84%E5%9F%BA%E6%9C%AC%E5%B8%B8%E8%AF%86.html"/>
    <id>http://lucylc.com/JavaScript/2018/04/10/JavaScript中位运算符的基本常识.html</id>
    <published>2018-04-10T09:11:25.000Z</published>
    <updated>2018-04-26T07:30:13.056Z</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>在JavaScript中虽然使用位运算不多，但是也有必要对位运算有所了解，这里就是收集了一些位运算符的基本知识以作学习。
<a id="more"></a></p>
</blockquote>
<h2 id="基础常识"><a href="#基础常识" class="headerlink" title="基础常识"></a>基础常识</h2><ul>
<li>8位二进制数：最高位sf=1，则数位负；最高位sf=0，则数位正。</li>
<li><p>在计算机中可以将一个数看做是有符号数，亦或者看成无符号数，例如：
00000001:可以看做无符号数1，也可以看成有符号数 +1（正1）
10000001：可以看做无符号数129，也可以看成有符号数-127.</p>
</li>
<li><p>左移运算符 &lt;&lt;
左移运算符：将一个数的各二进制位全部左移若干位。<strong>因为位运算符比乘法运算快</strong>，所以可用位运算符进行优化代码。
左移右侧补0，高位溢出舍弃。高位溢出且溢出的部分不包含1的话，左移一位相当于<em>2。 15&lt;<2 ==""> 15</2></em>4=60
例如：15&lt;<2; 00001111="">(1+2+4+8=15) &gt;&gt; 00111100=&gt;(4+8+16+32=60)</2;></p>
</li>
<li><p>右移运算符 &gt;&gt;
按二进制把所有的数字右移对应的位数，规则：低位舍弃，高位的空位补符号位，即正数补0，负数补1.
右移的数学意义：右移一位相当于除以2，但是是取商，余数舍弃。
位运算的巧用：因为位运算比普通运算快，所以可以进行代码优化，例如：
a = b*2; ==&gt; a = b&lt;&lt;1
还可以利用左移运算符计算a的第b个二进制位是什么：a&amp;(1&lt;&lt;b)</p>
</li>
</ul>
<h2 id="重温整数"><a href="#重温整数" class="headerlink" title="重温整数"></a>重温整数</h2><p>ECMAScript 整数有两种类型，即有符号整数（允许用正数和负数）和无符号整数（只允许用正数）。在 ECMAScript 中，所有整数字面量默认都是有符号整数，这意味着什么呢？</p>
<p>有符号整数使用 31 位表示整数的数值，用第 32 位表示整数的符号，0 表示正数，1 表示负数。数值范围从 -2147483648 到 2147483647。</p>
<p>可以以两种不同的方式存储二进制形式的有符号整数，一种用于存储正数，一种用于存储负数。正数是以真二进制形式存储的，前 31 位中的每一位都表示 2 的幂，从第 1 位（位 0）开始，表示 2<sup>0</sup>，第 2 位（位 1）表示 2<sup>1</sup>。没用到的位用 0 填充，即忽略不计。例如，下图展示的是数 18 的表示法。</p>
<p><img src="http://www.w3school.com.cn/i/ct_js_integer_binary_signed_32bits.gif" alt="32 位二进制表示的有符号整数"></p>
<p>18 的二进制版本只用了前 5 位，它们是这个数字的有效位。把数字转换成二进制字符串，就能看到有效位：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> iNum = <span class="number">18</span>;</div><div class="line">alert(iNum.toString(<span class="number">2</span>));   <span class="comment">//输出 &amp;quot;10010&amp;quot;</span></div></pre></td></tr></table></figure>
<p>这段代码只输出 &quot;10010&quot;，而不是 18 的 32 位表示。其他的数位并不重要，因为仅使用前 5 位即可确定这个十进制数值。如下图所示：</p>
<p><img src="http://www.w3school.com.cn/i/ct_js_integer_binary_number18.gif" alt="5 位二进制表示的整数 18"></p>
<p>负数也存储为二进制代码，不过采用的形式是二进制补码。计算数字二进制补码的步骤有三步：</p>
<ol>
<li>确定该数字的非负版本的二进制表示（例如，要计算 -18的二进制补码，首先要确定 18 的二进制表示）</li>
<li>求得二进制反码，即要把 0 替换为 1，把 1 替换为 0</li>
<li>在二进制反码上加 1</li>
</ol>
<p>要确定 -18 的二进制表示，首先必须得到 18 的二进制表示，如下所示：</p>
<pre>0000 0000 0000 0000 0000 0000 0001 0010</pre>

<p>接下来，计算二进制反码，如下所示：</p>
<pre>1111 1111 1111 1111 1111 1111 1110 1101</pre>

<p>最后，在二进制反码上加 1，如下所示：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="number">1111</span> <span class="number">1111</span> <span class="number">1111</span> <span class="number">1111</span> <span class="number">1111</span> <span class="number">1111</span> <span class="number">1110</span> <span class="number">1101</span></div><div class="line">                                      <span class="number">1</span></div><div class="line">---------------------------------------</div><div class="line"><span class="number">1111</span> <span class="number">1111</span> <span class="number">1111</span> <span class="number">1111</span> <span class="number">1111</span> <span class="number">1111</span> <span class="number">1110</span> <span class="number">1110</span></div></pre></td></tr></table></figure>
<p>因此，-18 的二进制表示即 1111 1111 1111 1111 1111 1111 1110 1110。记住，在处理有符号整数时，开发者不能访问 31 位。</p>
<p>有趣的是，把负整数转换成二进制字符串后，ECMAScript 并不以二进制补码的形式显示，而是用数字绝对值的标准二进制代码前面加负号的形式输出。例如：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> iNum = <span class="number">-18</span>;</div><div class="line">alert(iNum.toString(<span class="number">2</span>));  <span class="xml"><span class="tag">&lt;<span class="name">span</span>&gt;</span>//输出 &amp;quot;-10010&amp;quot;<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></div></pre></td></tr></table></figure>
<p>这段代码输出的是 &quot;-10010&quot;，而非二进制补码，这是为避免访问位 31。为了简便，ECMAScript 用一种简单的方式处理整数，使得开发者不必关心它们的用法。</p>
<p>另一方面，无符号整数把最后一位作为另一个数位处理。在这种模式中，第 32 位不表示数字的符号，而是值 2<sup>31</sup>。由于这个额外的位，无符号整数的数值范围为 0 到 4294967295。对于小于 2147483647 的整数来说，无符号整数看来与有符号整数一样，而大于 2147483647 的整数则要使用位 31（在有符号整数中，这一位总是 0）。</p>
<p>把无符号整数转换成字符串后，只返回它们的有效位。</p>
<p><span>注意：</span>所有整数字面量都默认存储为有符号整数。只有 ECMAScript 的位运算符才能创建无符号整数。</p>
<h2 id="位运算-NOT"><a href="#位运算-NOT" class="headerlink" title="位运算 NOT"></a>位运算 NOT</h2><p>位运算 NOT 由否定号（~）表示，它是 ECMAScript 中为数不多的与二进制算术有关的运算符之一。
位运算 NOT 是三步的处理过程：</p>
<ol>
<li>把运算数转换成 32 位数字</li>
<li>把二进制数转换成它的二进制反码</li>
<li>把二进制数转换成浮点数</li>
</ol>
<p>例如：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> iNum1 = <span class="number">25</span>;   <span class="xml"><span class="tag">&lt;<span class="name">span</span>&gt;</span>//25 等于 00000000000000000000000000011001<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></div><div class="line"><span class="keyword">var</span> iNum2 = ~iNum1;<span class="string">` &lt;span&gt;//转换为 11111111111111111111111111100110&lt;/span&gt;</span></div><div class="line"><span class="string">alert(iNum2);   &lt;span&gt;//输出 &amp;quot;-26&amp;quot;&lt;/span&gt;</span></div></pre></td></tr></table></figure>
<p>位运算 NOT 实质上是对数字求负，然后减 1，因此 25 变 -26。用下面的方法也可以得到同样的方法：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> iNum1 = <span class="number">25</span>;</div><div class="line"><span class="keyword">var</span> iNum2 = -iNum1 <span class="number">-1</span>;</div><div class="line">alert(iNum2); <span class="xml"><span class="tag">&lt;<span class="name">span</span>&gt;</span>//输出 -26<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></div></pre></td></tr></table></figure>
<h2 id="位运算-AND"><a href="#位运算-AND" class="headerlink" title="位运算 AND"></a>位运算 AND</h2><p>位运算 AND 由和号（&amp;）表示，直接对数字的二进制形式进行运算。它把每个数字中的数位对齐，然后用下面的规则对同一位置上的两个数位进行 AND 运算：</p>
<table>
<tr>
<th>第一个数字中的数位</th>
<th>第二个数字中的数位</th>
<th>结果</th>
</tr>

<tr>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>

<tr>
<td>1</td>
<td>0</td>
<td>0</td>
</tr>

<tr>
<td>0</td>
<td>1</td>
<td>0</td>
</tr>

<tr>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</table>

<p>例如，要对数字 25 和 3 进行 AND 运算，代码如下所示：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> iResult = <span class="number">25</span> &amp;amp; <span class="number">3</span>;</div><div class="line">alert(iResult); <span class="xml"><span class="tag">&lt;<span class="name">span</span>&gt;</span>//输出 &amp;quot;1&amp;quot;<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></div></pre></td></tr></table></figure>
<p>25 和 3 进行 AND 运算的结果是 1。为什么？分析如下：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"> <span class="number">25</span> = <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0001</span> <span class="number">1001</span></div><div class="line">  <span class="number">3</span> = <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0011</span></div><div class="line">---------------------------------------------</div><div class="line">AND = <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0001</span></div></pre></td></tr></table></figure>
<p>可以看出，在 25 和 3 中，只有一个数位（位 0）存放的都是 1，因此，其他数位生成的都是 0，所以结果为 1。</p>
<h2 id="位运算-OR"><a href="#位运算-OR" class="headerlink" title="位运算 OR"></a>位运算 OR</h2><p>位运算 OR 由符号（|）表示，也是直接对数字的二进制形式进行运算。在计算每位时，OR 运算符采用下列规则：</p>
<table>
<tr>
<th>第一个数字中的数位</th>
<th>第二个数字中的数位</th>
<th>结果</th>
</tr>

<tr>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>

<tr>
<td>1</td>
<td>0</td>
<td>1</td>
</tr>

<tr>
<td>0</td>
<td>1</td>
<td>1</td>
</tr>

<tr>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</table>

<p>仍然使用 AND 运算符所用的例子，对 25 和 3 进行 OR 运算，代码如下：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> iResult = <span class="number">25</span> | <span class="number">3</span>;</div><div class="line">alert(iResult); <span class="xml"><span class="tag">&lt;<span class="name">span</span>&gt;</span>//输出 &amp;quot;27&amp;quot;<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></div></pre></td></tr></table></figure>
<p>25 和 3 进行 OR 运算的结果是 27：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"><span class="number">25</span> = <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0001</span> <span class="number">1001</span></div><div class="line"> <span class="number">3</span> = <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0011</span></div><div class="line">--------------------------------------------</div><div class="line">OR = <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0001</span> <span class="number">1011</span></div></pre></td></tr></table></figure>
<p>可以看出，在两个数字中，共有 4 个数位存放的是 1，这些数位被传递给结果。二进制代码 11011 等于 27。</p>
<h2 id="位运算-XOR"><a href="#位运算-XOR" class="headerlink" title="位运算 XOR"></a>位运算 XOR</h2><p>位运算 XOR 由符号（^）表示，当然，也是直接对二进制形式进行运算。XOR 不同于 OR，当只有一个数位存放的是 1 时，它才返回 1。真值表如下：</p>
<table>
<tr>
<th>第一个数字中的数位</th>
<th>第二个数字中的数位</th>
<th>结果</th>
</tr>

<tr>
<td>1</td>
<td>1</td>
<td>0</td>
</tr>

<tr>
<td>1</td>
<td>0</td>
<td>1</td>
</tr>

<tr>
<td>0</td>
<td>1</td>
<td>1</td>
</tr>

<tr>
<td>0</td>
<td>0</td>
<td>0</td>
</tr>
</table>

<p>对 25 和 3 进行 XOR 运算，代码如下：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> iResult = <span class="number">25</span> ^ <span class="number">3</span>;</div><div class="line">alert(iResult); <span class="xml"><span class="tag">&lt;<span class="name">span</span>&gt;</span>//输出 &amp;quot;26&amp;quot;<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></div></pre></td></tr></table></figure>
<p>25 和 3 进行 XOR 运算的结果是 26：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line"> <span class="number">25</span> = <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0001</span> <span class="number">1001</span></div><div class="line">  <span class="number">3</span> = <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0011</span></div><div class="line">---------------------------------------------</div><div class="line">XOR = <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0000</span> <span class="number">0001</span> <span class="number">1010</span></div></pre></td></tr></table></figure>
<p>可以看出，在两个数字中，共有 4 个数位存放的是 1，这些数位被传递给结果。二进制代码 11010 等于 26。</p>
<h2 id="左移运算"><a href="#左移运算" class="headerlink" title="左移运算"></a>左移运算</h2><p>左移运算由两个小于号表示（&lt;&lt;）。它把数字中的所有数位向左移动指定的数量。例如，把数字 2（等于二进制中的 10）左移 5 位，结果为 64（等于二进制中的 1000000）：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> iOld = <span class="number">2</span>;   <span class="xml"><span class="tag">&lt;<span class="name">span</span>&gt;</span>//等于二进制 10<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></div><div class="line"><span class="keyword">var</span> iNew = iOld &amp;lt;&amp;lt; <span class="number">5</span>; <span class="xml"><span class="tag">&lt;<span class="name">span</span>&gt;</span>//等于二进制 1000000 十进制 64<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></div></pre></td></tr></table></figure>
<p><span>注意：</span>在左移数位时，数字右边多出 5 个空位。左移运算用  0 填充这些空位，使结果成为完整的 32 位数字。</p>
<p><img src="http://www.w3school.com.cn/i/ct_js_operators_bitwise_leftshift.gif" alt="数字 2 进行左移运算"></p>
<p><span>注意：</span>左移运算保留数字的符号位。例如，如果把 -2 左移 5 位，得到的是 -64，而不是 64。“符号仍然存储在第 32 位中吗？”是的，不过这在 ECMAScript 后台进行，开发者不能直接访问第 32 个数位。即使输出二进制字符串形式的负数，显示的也是负号形式（例如，-2 将显示 -10。）</p>
<h2 id="有符号右移运算"><a href="#有符号右移运算" class="headerlink" title="有符号右移运算"></a>有符号右移运算</h2><p>有符号右移运算符由两个大于号表示（&gt;&gt;）。它把 32 位数字中的所有数位整体右移，同时保留该数的符号（正号或负号）。有符号右移运算符恰好与左移运算相反。例如，把 64 右移 5 位，将变为 2：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> iOld = <span class="number">64</span>;    <span class="xml"><span class="tag">&lt;<span class="name">span</span>&gt;</span>//等于二进制 1000000<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></div><div class="line"><span class="keyword">var</span> iNew = iOld &amp;gt;&amp;gt; <span class="number">5</span>; <span class="xml"><span class="tag">&lt;<span class="name">span</span>&gt;</span>//等于二进制 10 十进制 2<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></div></pre></td></tr></table></figure>
<p>同样，移动数位后会造成空位。这次，空位位于数字的左侧，但位于符号位之后。ECMAScript 用符号位的值填充这些空位，创建完整的数字，如下图所示：</p>
<p><img src="http://www.w3school.com.cn/i/ct_js_operators_bitwise_signedrightshift.gif" alt="数字 64 进行有符号右移运算"></p>
<h2 id="无符号右移运算"><a href="#无符号右移运算" class="headerlink" title="无符号右移运算"></a>无符号右移运算</h2><p>无符号右移运算符由三个大于号（&gt;&gt;&gt;）表示，它将无符号 32 位数的所有数位整体右移。对于正数，无符号右移运算的结果与有符号右移运算一样。</p>
<p>用有符号右移运算中的例子，把 64 右移 5 位，将变为 2：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> iOld = <span class="number">64</span>;    <span class="xml"><span class="tag">&lt;<span class="name">span</span>&gt;</span>//等于二进制 1000000<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></div><div class="line"><span class="keyword">var</span> iNew = iOld &amp;gt;&amp;gt;&amp;gt; <span class="number">5</span>; <span class="xml"><span class="tag">&lt;<span class="name">span</span>&gt;</span>//等于二进制 10 十进制 2<span class="tag">&lt;/<span class="name">span</span>&gt;</span></span></div></pre></td></tr></table></figure>
<p>对于负数，情况就不同了。</p>
<p>无符号右移运算用 0 填充所有空位。对于正数，这与有符号右移运算的操作一样，而负数则被作为正数来处理。</p>
<p>由于无符号右移运算的结果是一个 32 位的正数，所以负数的无符号右移运算得到的总是一个非常大的数字。例如，如果把 -64 右移 5 位，将得到 134217726。如何得到这种结果的呢？</p>
<p>要实现这一点，需要把这个数字转换成无符号的等价形式（尽管该数字本身还是有符号的），可以通过以下代码获得这种形式：</p>
<pre>var iUnsigned64 = -64 &gt;&gt;&gt; 0;</pre>

<p>然后，用 Number 类型的 toString() 获取它的真正的位表示，采用的基为 2：</p>
<pre>alert(iUnsigned64.toString(2));</pre>

<p>这将生成 11111111111111111111111111000000，即有符号整数 -64 的二进制补码表示，不过它等于无符号整数 4294967232。</p>
<p>出于这种原因，使用无符号右移运算符要小心。</p>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/JavaScript/2018/04/10/JavaScript中位运算符的基本常识.html">http://lucylc.com/JavaScript/2018/04/10/JavaScript中位运算符的基本常识.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;在JavaScript中虽然使用位运算不多，但是也有必要对位运算有所了解，这里就是收集了一些位运算符的基本知识以作学习。
    
    </summary>
    
      <category term="JavaScript" scheme="http://lucylc.com/categories/JavaScript/"/>
    
    
      <category term="JavaScript" scheme="http://lucylc.com/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>前端性能优化--updating</title>
    <link href="http://lucylc.com/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B/2017/03/02/%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96-updating.html"/>
    <id>http://lucylc.com/前端工程/2017/03/02/前端性能优化-updating.html</id>
    <published>2017-03-02T09:18:59.000Z</published>
    <updated>2017-08-20T10:15:40.963Z</updated>
    
    <content type="html"><![CDATA[<a id="more"></a>
<table>
<thead>
<tr>
<th>优化方向</th>
<th>优化手段</th>
</tr>
</thead>
<tbody>
<tr>
<td>请求数量</td>
<td>合并脚本和样式表，CSS Sprites，拆分初始化负载，划分主域</td>
</tr>
<tr>
<td>请求带宽</td>
<td>开启GZip，精简JavaScript，移除重复脚本，图像优化</td>
</tr>
<tr>
<td>缓存利用</td>
<td>使用CDN，使用外部JavaScript和CSS，添加Expires头，减少DNS查找，配置ETag，使AjaX可缓存</td>
</tr>
<tr>
<td>页面结构</td>
<td>将样式表放在顶部，将脚本放在底部，尽早刷新文档的输出</td>
</tr>
<tr>
<td>代码校验</td>
<td>避免CSS表达式，避免重定向</td>
</tr>
</tbody>
</table>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/前端工程/2017/03/02/前端性能优化-updating.html">http://lucylc.com/前端工程/2017/03/02/前端性能优化-updating.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;a id=&quot;more&quot;&gt;&lt;/a&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;优化方向&lt;/th&gt;
&lt;th&gt;优化手段&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;请求数量&lt;/td&gt;
&lt;td&gt;合并脚本和样式表，CSS Sprites，拆分初始化负
    
    </summary>
    
      <category term="前端工程" scheme="http://lucylc.com/categories/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B/"/>
    
    
      <category term="前端工程" scheme="http://lucylc.com/tags/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>前端工程需要用到的技术元素</title>
    <link href="http://lucylc.com/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B/2017/03/02/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E9%9C%80%E8%A6%81%E7%94%A8%E5%88%B0%E7%9A%84%E6%8A%80%E6%9C%AF%E5%85%83%E7%B4%A0.html"/>
    <id>http://lucylc.com/前端工程/2017/03/02/前端工程需要用到的技术元素.html</id>
    <published>2017-03-02T08:40:05.000Z</published>
    <updated>2017-08-20T10:15:40.962Z</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>对于好的文章收录是我长期以来的爱好，这里感谢<a href="https://github.com/fouber/blog" target="_blank" rel="external">云龙大牛</a>的分享</p>
</blockquote>
<a id="more"></a>
<p>前端行业经历了这么长时间的发展，技术元素非常丰富，这里列举出一般web团队需要用到的技术元素：</p>
<p><img src="https://camo.githubusercontent.com/4c1358dc162d8b8e9594c771e5ecdde258670784/687474703a2f2f68746d6c6a732e62302e7570616979756e2e636f6d2f75706c6f6164732f313339383339343738313135352d515132303134303432352d312e706e67" alt="前端开发体系技术元素及其关联关系"></p>
<ol>
<li>开发规范：包括开发、部署的目录规范，编码规范等。不要小瞧规范的威力，可以极大的提升开发效率，真正优秀的规范不会让使用者感到约束，而是能帮助他们快速定位问题，提升效率。</li>
</ol>
<p>2.模块化开发：针对js、css，以功能或业务为单元组织代码。js方面解决独立作用域、依赖管理、api暴露、按需加载与执行、安全合并等问题，css方面解决依赖管理、组件内部样式管理等问题。是提升前端开发效率的重要基础。现在流行的模块化框架有requirejs、seajs等。</p>
<p>3.组件化开发：在模块化基础上，以页面小部件(component)为单位将页面小部件的js、css、html代码片段放在一起进行开发、维护，组件单元是资源独立的，组件在系统内可复用。比如头部(header)、尾部(footer)、搜索框(searchbar)、导航(menu)、对话框(dialog)等，甚至一些复杂的组件比如编辑器(editor)等。通常业务会针对组件化的js部分进行必要的封装，解决一些常见的组件渲染、交互问题。</p>
<p>4.组件仓库：有了组件化，我们希望将一些非常通用的组件放到一个公共的地方供团队共享，方便新项目复用，这个时候我们就需要引入一个组件仓库的东西，现在流行的组件库有bower、component等。团队发展到一定规模后，组件库的需求会变得非常强烈。</p>
<p>5.性能优化：这里的性能优化是指能够通过工程手段保证的性能优化点。由于其内容比较丰富，就不在这里展开了，感兴趣的同学可以阅读我的这两篇文章 [1] [2]。性能优化是前端项目发展到一定阶段必须经历的过程。这部分我想强调的一点是 性能优化一定是一个工程问题和统计问题，不能用工程手段保证的性能优化是不靠谱的，优化时只考虑一个页面的首次加载，不考虑全局在宏观统计上的优化提升也是片面的。</p>
<p>6.项目部署：部署按照现行业界的分工标准，虽然不是前端的工作范畴，但它对性能优化有直接的影响，包括静态资源缓存、cdn、非覆盖式发布等问题。合理的静态资源资源部署可以为前端性能带来较大的优化空间。</p>
<p>7.开发流程：完整的开发流程包括本地开发调试、视觉效果走查确认、前后端联调、提测、上线等环节。对开发流程的改善可以大幅降低开发的时间成本，工作这些年见过很多独立的系统（cms系统、静态资源推送系统）将开发流程割裂开，对前端开发的效率有严重的阻碍。</p>
<p>8.开发工具：这里说的工具不是指IDE，而是工程工具，包括构建与优化工具、开发-调试-部署等流程工具，以及组件库获取、提交等相关工具，甚至运营、文档、配置发布等平台工具。前端开发需要工具支持，这个问题的根本原因来自前端领域语言特性（未来我会单独写一篇文章介绍前端领域语言缺陷问题）。前端开发所使用的语言（js、css、html）以及前端工程资源的加载与定位策略决定了前端工程必须要工具支持。由于这些工具通常都是独立的系统，要想把它们串联起来，才有了yeoman这样的封装。前面提到的7项技术元素都直接或间接的对前端开发工具设计产生一定的影响，因此能否串联其他技术要素，使得前端开发形成一个连贯可持续优化的开发体系，工具的设计至关重要。</p>
<p>以上8项，1-3是技术和业务相关的开发需求，4是技术沉淀与共享需求，5-8是工程优化需求。</p>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/前端工程/2017/03/02/前端工程需要用到的技术元素.html">http://lucylc.com/前端工程/2017/03/02/前端工程需要用到的技术元素.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;对于好的文章收录是我长期以来的爱好，这里感谢&lt;a href=&quot;https://github.com/fouber/blog&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;云龙大牛&lt;/a&gt;的分享&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="前端工程" scheme="http://lucylc.com/categories/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B/"/>
    
    
      <category term="前端工程" scheme="http://lucylc.com/tags/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>理解 SeaJS 与 RequireJS 的差异</title>
    <link href="http://lucylc.com/%E5%89%8D%E7%AB%AF%E6%A8%A1%E5%9D%97%E5%8C%96/2017/03/02/%E7%90%86%E8%A7%A3seaSs%E5%92%8CrequireJs%E7%9A%84%E5%B7%AE%E5%BC%82.html"/>
    <id>http://lucylc.com/前端模块化/2017/03/02/理解seaSs和requireJs的差异.html</id>
    <published>2017-03-02T08:38:27.000Z</published>
    <updated>2017-08-20T10:15:40.969Z</updated>
    
    <content type="html"><![CDATA[<p>requirejs和seajs二者在加载上都有缺陷，就是模块的依赖要等到模块加载完成后，通过静态分析（seajs）或者deps参数（requirejs）来获取，这就为 合并请求 和 按需加载 带来了实现上的矛盾：</p>
<blockquote>
<p>要么放弃按需加载，把所有js合成一个文件，从而满足请求合并（两个框架的官方demo都有这样的例子）；
要么放弃请求合并，请求独立的模块文件，从而满足按需加载。
AMD规范在执行callback的时候，要初始化所有依赖的模块，而CMD只有执行到require的时候才初始化模块.</p>
</blockquote>
<a id="more"></a>
<h3 id="CMD-模块依赖声明方式"><a href="#CMD-模块依赖声明方式" class="headerlink" title="CMD 模块依赖声明方式"></a>CMD 模块依赖声明方式</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">define(<span class="function"><span class="keyword">function</span> (<span class="params">require</span>) </span>&#123;</div><div class="line">    <span class="keyword">var</span> a = <span class="built_in">require</span>(<span class="string">'./a'</span>);</div><div class="line">    <span class="keyword">var</span> b = <span class="built_in">require</span>(<span class="string">'./b'</span>);</div><div class="line">    <span class="comment">// more code ..</span></div><div class="line">&#125;)</div></pre></td></tr></table></figure>
<p>CMD 依赖是就近声明，通过内部require方法进行声明。但是因为是异步模块，加载器需要提前加载这些模块，所以模块真正使用前需要提取模块里面所有的依赖。无论是加载器即时提取，还是通过自动化工具预先提取，CMD 的这种依赖声明格式只能通过静态分析方式实现，这也正是 CMD 的弊端所在。</p>
<h4 id="CMD-规范的弊端"><a href="#CMD-规范的弊端" class="headerlink" title="CMD 规范的弊端"></a>CMD 规范的弊端</h4><p>1.不能直接压缩：require是局部变量，意味着不能直接的通过压缩工具进行压缩，若require这个变量被替换，加载器与自动化工具将无法获取模块的依赖。
2.模块书写有额外约定：路径参数不能进行字符串运算，不能使用变量代替，否则加载器与自动化工具无法正确提取路径。</p>
<blockquote>
<p>注：SeaJS 静态分析实现是把模块包toString()后使用正则提取require部分得到依赖的模块路径。</p>
</blockquote>
<h3 id="AMD-模块依赖声明方式"><a href="#AMD-模块依赖声明方式" class="headerlink" title="AMD 模块依赖声明方式"></a>AMD 模块依赖声明方式</h3><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">define([<span class="string">'./a'</span>, <span class="string">'./b'</span>], <span class="function"><span class="keyword">function</span> (<span class="params">a, b</span>) </span>&#123;</div><div class="line">    <span class="comment">// more code ..</span></div><div class="line">&#125;)</div></pre></td></tr></table></figure>
<p>AMD 的依赖是提前声明。这种优势的好处就是依赖无需通过静态分析，无论是加载器还是自动化工具都可以很直接的获取到依赖，规范的定义可以更简单，意味着可能产生更强大的实现，这对加载器与自动化分析工具都是有利的。</p>
<h4 id="AMD-规范的弊端"><a href="#AMD-规范的弊端" class="headerlink" title="AMD 规范的弊端"></a>AMD 规范的弊端</h4><p>1.依赖提前声明在代码书写上不是那么友好
2.模块内部与 NodeJS 的 Modules 有一定的差异</p>
<p>关于第二点的问题需要特别说明下。其实无论是 CMD 还是 AMD 的异步模块，都无法与同步模块规范保持一致（NodeJS 的 Modules），只有谁比谁更像同步模块而已。AMD 要转换为同步模块，除了去掉define函数的包裹外，需要在头部使用require把依赖声明好，而 CMD 只需要去掉define函数的包裹即可。</p>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/前端模块化/2017/03/02/理解seaSs和requireJs的差异.html">http://lucylc.com/前端模块化/2017/03/02/理解seaSs和requireJs的差异.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;requirejs和seajs二者在加载上都有缺陷，就是模块的依赖要等到模块加载完成后，通过静态分析（seajs）或者deps参数（requirejs）来获取，这就为 合并请求 和 按需加载 带来了实现上的矛盾：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;要么放弃按需加载，把所有js合成一个文件，从而满足请求合并（两个框架的官方demo都有这样的例子）；
要么放弃请求合并，请求独立的模块文件，从而满足按需加载。
AMD规范在执行callback的时候，要初始化所有依赖的模块，而CMD只有执行到require的时候才初始化模块.&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="前端模块化" scheme="http://lucylc.com/categories/%E5%89%8D%E7%AB%AF%E6%A8%A1%E5%9D%97%E5%8C%96/"/>
    
    
      <category term="SeaJS" scheme="http://lucylc.com/tags/SeaJS/"/>
    
      <category term="RequireJS" scheme="http://lucylc.com/tags/RequireJS/"/>
    
  </entry>
  
  <entry>
    <title>何为web前端？前端工程分哪些阶段？</title>
    <link href="http://lucylc.com/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B/2017/03/02/%E4%BD%95%E4%B8%BAweb%E5%89%8D%E7%AB%AF%EF%BC%9F%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B%E5%88%86%E5%93%AA%E4%BA%9B%E9%98%B6%E6%AE%B5%EF%BC%9F.html"/>
    <id>http://lucylc.com/前端工程/2017/03/02/何为web前端？前端工程分哪些阶段？.html</id>
    <published>2017-03-02T08:20:19.000Z</published>
    <updated>2017-08-20T10:15:40.962Z</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>对于好的文章收录是我长期以来的爱好，这里感谢<a href="https://github.com/fouber/blog" target="_blank" rel="external">云龙大牛</a>的分享</p>
</blockquote>
<p>不知道你的团队如何定义前端开发，据我所知，时至今日仍然有很多团队会把前端开发归类为产品或者设计岗位，虽然身份之争多少有些无谓，但我对这种偏见还是心存芥蒂，酝酿了许久，决定写一个系列的文章，试着从工程的角度系统的介绍一下我对前端，尤其是Web前端的理解。</p>
<p>只要我们还把自己的工作看作为一项软件开发活动，那么我相信读过下面的内容你也一定会有所共鸣。</p>
<h2 id="前端，是一种GUI软件"><a href="#前端，是一种GUI软件" class="headerlink" title="前端，是一种GUI软件"></a>前端，是一种GUI软件</h2><a id="more"></a>
<p>现如今前端可谓包罗万象，产品形态五花八门，涉猎极广，什么高大上的基础库/框架，拽炫酷的宣传页面，还有屌炸天的小游戏……不过这些一两个文件的小项目并非是前端技术的主要应用场景，更具商业价值的则是复杂的Web应用，它们功能完善，界面繁多，为用户提供了完整的产品体验，可能是新闻聚合网站，可能是在线购物平台，可能是社交网络，可能是金融信贷应用，可能是音乐互动社区，也可能是视频上传与分享平台……</p>
<blockquote>
<p>从本质上讲，所有Web应用都是一种运行在网页浏览器中的软件，这些软件的图形用户界面（Graphical User Interface，简称GUI）即为前端。</p>
</blockquote>
<p>如此复杂的Web应用，动辄几十上百人共同开发维护，其前端界面通常也颇具规模，工程量不亚于一般的传统GUI软件：</p>
<p><a href="https://github.com/fouber/blog/raw/master/201508/assets/web_gui.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/web_gui.png" alt=""></a></p>
<p>尽管Web应用的复杂程度与日俱增，用户对其前端界面也提出了更高的要求，但时至今日仍然没有多少前端开发者会从软件工程的角度去思考前端开发，来助力团队的开发效率，更有甚者还对前端保留着”如玩具般简单“的刻板印象，日复一日，刀耕火种。</p>
<p>历史悠久的前端开发，始终像是放养的野孩子，原始如斯，不免让人慨叹！</p>
<h2 id="前端工程的三个阶段"><a href="#前端工程的三个阶段" class="headerlink" title="前端工程的三个阶段"></a>前端工程的三个阶段</h2><p>现在的前端开发倒也并非一无所有，回顾一下曾经经历过或听闻过的项目，为了提升其前端开发效率和运行性能，前端团队的工程建设大致会经历三个阶段：</p>
<h3 id="第一阶段：库-框架选型"><a href="#第一阶段：库-框架选型" class="headerlink" title="第一阶段：库/框架选型"></a>第一阶段：库/框架选型</h3><p><a href="https://github.com/fouber/blog/raw/master/201508/assets/libs.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/libs.png" alt=""></a></p>
<p>前端工程建设的第一项任务就是根据项目特征进行技术选型。</p>
<p>基本上现在没有人完全从0开始做网站，哪怕是政府项目用个jquery都很正常吧，React/Angularjs等框架横空出世，解放了不少生产力，合理的技术选型可以为项目节省许多工程量这点毋庸置疑。</p>
<h3 id="第二阶段：简单构建优化"><a href="#第二阶段：简单构建优化" class="headerlink" title="第二阶段：简单构建优化"></a>第二阶段：简单构建优化</h3><p><a href="https://github.com/fouber/blog/raw/master/201508/assets/tools.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/tools.png" alt=""></a></p>
<p>选型之后基本上就可以开始敲码了，不过光解决开发效率还不够，必须要兼顾运行性能。前端工程进行到第二阶段会选型一种构建工具，对代码进行压缩，校验，之后再以页面为单位进行简单的资源合并。</p>
<p>前端开发工程化程度之低，常常出乎我的意料，我之前在百度工作时是没有多少概念的，直到离开大公司的温室，去到业界与更多的团队交流才发现，能做到这个阶段在业界来说已然超出平均水平，属于“具备较高工程化程度”的团队了，查看网上形形色色的网页源代码，能做到最基本的JS/CSS压缩的Web应用都已跨入标准互联网公司行列，不难理解为什么很多前端团队对于前端工程构建的认知还仅停留在“压缩、校验、合并”这种程度。</p>
<h3 id="第三阶段：JS-CSS模块化开发"><a href="#第三阶段：JS-CSS模块化开发" class="headerlink" title="第三阶段：JS/CSS模块化开发"></a>第三阶段：JS/CSS模块化开发</h3><p><a href="https://github.com/fouber/blog/raw/master/201508/assets/libs-2.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/libs-2.png" alt=""></a></p>
<p>分而治之是软件工程中的重要思想，是复杂系统开发和维护的基石，这点放在前端开发中同样适用。在解决了基本开发效率运行效率问题之后，前端团队开始思考维护效率，模块化是目前前端最流行的分治手段。</p>
<blockquote>
<p>很多人觉得模块化开发的工程意义是复用，我不太认可这种看法，在我看来，模块化开发的最大价值应该是分治，是分治，分治！（重说三）。</p>
<p>不管你将来是否要复用某段代码，你都有充分的理由将其分治为一个模块。</p>
</blockquote>
<p>JS模块化方案很多，AMD/CommonJS/UMD/ES6 Module等，对应的框架和工具也一大堆，说起来很烦，大家自行百度吧；CSS模块化开发基本都是在less、sass、stylus等预处理器的import/mixin特性支持下实现的。</p>
<p>虽然这些技术由来已久，在如今这个“言必及React”的时代略显落伍，但想想业界的绝大多数团队的工程化落后程度，放眼望去，毫不夸张的说，能达到第三阶段的前端团队已属于高端行列，基本具备了开发维护一般规模Web应用的能力。</p>
<p>然而，做到这些就够了么？Naive！</p>
<h2 id="第四阶段"><a href="#第四阶段" class="headerlink" title="第四阶段"></a>第四阶段</h2><blockquote>
<p>前端是一种技术问题较少、工程问题较多的软件开发领域。</p>
</blockquote>
<p>当我们要开发一款完整的Web应用时，前端将面临更多的工程问题，比如：</p>
<ul>
<li>大体量：多功能、多页面、多状态、多系统；</li>
<li>大规模：多人甚至多团队合作开发；</li>
<li>高性能：CDN部署、<a href="https://developers.google.com/speed/docs/insights/LeverageBrowserCaching" target="_blank" rel="external">缓存控制</a>、<a href="https://developers.google.com/speed/docs/insights/LeverageBrowserCaching" target="_blank" rel="external">文件指纹</a>、缓存复用、请求合并、按需加载、同步/异步加载、移动端<a href="https://developers.google.com/speed/docs/insights/mobile" target="_blank" rel="external">首屏CSS内嵌</a>、HTTP 2.0服务端<a href="http://chimera.labs.oreilly.com/books/1230000000545/ch12.html#HTTP2_PUSH" target="_blank" rel="external">资源推送</a>。</li>
</ul>
<blockquote>
<p>扩展阅读：<a href="https://github.com/fouber/blog/issues/6" target="_blank" rel="external">大公司里怎样开发和部署前端代码？</a></p>
</blockquote>
<p>这些无疑是一系列严肃的系统工程问题。</p>
<p>前面讲的三个阶段虽然相比曾经“茹毛饮血”的时代进步不少，但用于支撑第四阶段的多人合作开发以及精细的性能优化似乎还欠缺点什么。</p>
<p>到底，缺什么呢？</p>
<h2 id="没有银弹"><a href="#没有银弹" class="headerlink" title="没有银弹"></a>没有银弹</h2><p>读过《<a href="http://book.douban.com/subject/2230248/" target="_blank" rel="external">人月神话</a>》的人应该都听说过，软件工程 <a href="http://baike.baidu.com/view/277972.htm" target="_blank" rel="external">没有银弹</a>。没错，前端开发同样没有银弹，可是现在是连™铅弹都没有的年月！（刚有了BB弹，摔）</p>
<p>前端历来以“简单”著称，在前端开发者群体中，小而美的价值观占据着主要的话语权，甚至成为了某种信仰，想与其他人交流一下工程方面的心得，得到的回应往往都是两个字：太重。</p>
<blockquote>
<p>重你妹！你的脑容量只有4K吗？</p>
</blockquote>
<p>工程方案其实也可以小而美！只不过它的小而美不是指代码量，而是指“规则”。找到问题的根源，用最少最简单明了的规则制定出最容易遵守最容易理解的开发规范或工具，以提升开发效率和工程质量，这同样是小而美的典范！</p>
<p>2011年我有幸参与到 <a href="http://fis.baidu.com" target="_blank" rel="external">FIS</a> 项目中，与百度众多大中型项目的前端研发团队共同合作，不断探索实践前端开发的工程化解决方案，13年离开百度去往UC，面对完全不同的产品形态，不同的业务场景，不同的适配终端，甚至不同的网络环境，过往的方法论仍然能够快速落地，为多个团队的不同业务场景量身定制出合理的前端解决方案。</p>
<p>这些经历让我明悟了一个道理：</p>
<blockquote>
<p>进入第四阶段，我们只需做好两件事就能大幅提升前端开发效率，并且兼顾运行性能，那就是——组件化开发与资源管理。</p>
</blockquote>
<h3 id="第一件事：组件化开发"><a href="#第一件事：组件化开发" class="headerlink" title="第一件事：组件化开发"></a>第一件事：组件化开发</h3><p>分治的确是非常重要的工程优化手段。在我看来，前端作为一种GUI软件，光有JS/CSS的模块化还不够，对于UI组件的分治也有着同样迫切的需求：</p>
<p><a href="https://github.com/fouber/blog/raw/master/201508/assets/components.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/components.png" alt=""></a></p>
<p>如上图，这是我所信仰的前端组件化开发理念，简单解读一下：</p>
<ol>
<li>页面上的每个 <strong>独立的</strong> 可视/可交互区域视为一个组件；</li>
<li><strong>每个组件对应一个工程目录</strong>，组件所需的各种资源都在这个目录下<strong>就近维护</strong>；</li>
<li>由于组件具有独立性，因此组件与组件之间可以 <strong>自由组合</strong>；</li>
<li>页面只不过是组件的容器，负责组合组件形成功能完整的界面；</li>
<li>当不需要某个组件，或者想要替换组件时，可以整个目录删除/替换。</li>
</ol>
<p>其中第二项描述的就近维护原则，是我觉得最具工程价值的地方，它为前端开发提供了很好的分治策略，每个开发者都将清楚的知道，自己所开发维护的功能单元，其代码必然存在于对应的组件目录中，在那个目录下能找到有关这个功能单元的所有内部逻辑，样式也好，JS也好，页面结构也好，都在那里。</p>
<p>组件化开发具有较高的通用性，无论是前端渲染的单页面应用，还是后端模板渲染的多页面应用，组件化开发的概念都能适用。组件HTML部分根据业务选型的不同，可以是静态的HTML文件，可以是前端模板，也可以是后端模板：</p>
<p><a href="https://github.com/fouber/blog/raw/master/201508/assets/templates.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/templates.png" alt=""></a></p>
<blockquote>
<p>不同的技术选型决定了不同的组件封装和调用策略。</p>
</blockquote>
<p>基于这样的工程理念，我们很容易将系统以独立的组件为单元进行分工划分：</p>
<p><a href="https://github.com/fouber/blog/raw/master/201508/assets/split.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/split.png" alt=""></a></p>
<p>由于系统功能被分治到独立的模块或组件中，粒度比较精细，组织形式松散，开发者之间不会产生开发时序的依赖，大幅提升并行的开发效率，理论上允许随时加入新成员认领组件开发或维护工作，也更容易支持多个团队共同维护一个大型站点的开发。</p>
<p>结合前面提到的模块化开发，整个前端项目可以划分为这么几种开发概念：</p>
<table>
<thead>
<tr>
<th>名称</th>
<th>说明</th>
<th>举例</th>
</tr>
</thead>
<tbody>
<tr>
<td>JS模块</td>
<td>独立的算法和数据单元</td>
<td>浏览器环境检测(detect)，网络请求(ajax)，应用配置(config)，DOM操作(dom)，工具函数(utils)，以及组件里的JS单元</td>
</tr>
<tr>
<td>CSS模块</td>
<td>独立的功能性样式单元</td>
<td>栅格系统(grid)，字体图标(icon-fonts)，动画样式(animate)，以及组件里的CSS单元</td>
</tr>
<tr>
<td>UI组件</td>
<td>独立的可视/可交互功能单元</td>
<td>页头(header)，页尾(footer)，导航栏(nav)，搜索框(search)</td>
</tr>
<tr>
<td>页面</td>
<td>前端这种GUI软件的界面状态，是UI组件的容器</td>
<td>首页(index)，列表页(list)，用户管理(user)</td>
</tr>
<tr>
<td>应用</td>
<td>整个项目或整个站点被称之为应用，由多个页面组成</td>
</tr>
</tbody>
</table>
<p>以上5种开发概念以相对较少的规则组成了前端开发的基本工程结构，基于这些理念，我眼中的前端开发就成了这个样子：</p>
<table>
<thead>
<tr>
<th>示意图</th>
<th>描述</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://github.com/fouber/blog/raw/master/201508/assets/constructor.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/constructor.png" alt=""></a></td>
<td>整个Web应用由页面组成</td>
</tr>
<tr>
<td><a href="https://github.com/fouber/blog/raw/master/201508/assets/modular_2.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/modular_2.png" alt=""></a></td>
<td>页面由组件组成</td>
</tr>
<tr>
<td><a href="https://github.com/fouber/blog/raw/master/201508/assets/modular-component.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/modular-component.png" alt=""></a></td>
<td>一个组件一个目录，资源就近维护</td>
</tr>
<tr>
<td><a href="https://github.com/fouber/blog/raw/master/201508/assets/modular_4.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/modular_4.png" alt=""></a></td>
<td>组件可组合，</td>
</tr>
</tbody>
</table>
<p>组件的JS可依赖其他JS模块，
CSS可依赖其他CSS单元 |</p>
<p>综合上面的描述，对于一般中小规模的项目，大致可以规划出这样的源码目录结构：</p>
<p><a href="https://github.com/fouber/blog/raw/master/201508/assets/files-x.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/files-x.png" alt=""></a></p>
<p>如果项目规模较大，涉及多个团队协作，还可以将具有相关业务功能的页面组织在一起，形成一个子系统，进一步将整个站点拆分出多个子系统来分配给不同团队维护，针对这种情况后面我会单开文章详细介绍。</p>
<p>以上架构设计历经许多不同公司不同业务场景的前端团队验证，收获了不错的口碑，是行之有效的前端工程分治方案。</p>
<blockquote>
<p>吐槽：我本人非常反对某些前端团队将前端开发划分为“JS开发”和“页面重构”两种岗位，更倾向于组件粒度的开发理念，对GUI软件开发的分工规划应该以功能为单位，而不是开发语言；对开发者的技术要求也应该是掌握完整的端内技术。</p>
</blockquote>
<h3 id="第二件事：“智能”静态资源管理"><a href="#第二件事：“智能”静态资源管理" class="headerlink" title="第二件事：“智能”静态资源管理"></a>第二件事：“智能”静态资源管理</h3><p>上面提到的模块化/组件化开发，仅仅描述了一种开发理念，也可以认为是一种开发规范，倘若你认可这规范，对它的分治策略产生了共鸣，那我们就可以继续聊聊它的具体实现了。</p>
<p>很明显，模块化/组件化开发之后，我们最终要解决的，就是模块/组件加载的技术问题。然而前端与客户端GUI软件有一个很大的不同：</p>
<blockquote>
<p>前端是一种远程部署，运行时增量下载的GUI软件</p>
</blockquote>
<p>前端应用没有安装过程，其所需程序资源都部署在远程服务器，用户使用浏览器访问不同的页面来加载不同的资源，随着页面访问的增加，渐进式的将整个程序下载到本地运行，“增量下载”是前端在工程上有别于客户端GUI软件的根本原因。</p>
<p><a href="https://github.com/fouber/blog/raw/master/201508/assets/gui.gif" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/gui.gif" alt=""></a></p>
<p>上图展示了一款界面繁多功能丰富的应用，如果采用Web实现，相信也是不小的体量，如果用户第一次访问页面就强制其加载全站静态资源再展示，相信会有很多用户因为失去耐心而流失。根据“增量”的原则，我们应该精心规划每个页面的资源加载策略，使得用户无论访问哪个页面都能按需加载页面所需资源，没访问过的无需加载，访问过的可以缓存复用，最终带来流畅的应用体验。</p>
<p>这正是Web应用“免安装”的魅力所在。</p>
<p>由“增量”原则引申出的前端优化技巧几乎成为了性能优化的核心，有加载相关的按需加载、延迟加载、预加载、请求合并等策略；有缓存相关的浏览器缓存利用，缓存更新、缓存共享、非覆盖式发布等方案；还有复杂的BigRender、BigPipe、Quickling、PageCache等技术。这些优化方案无不围绕着如何将增量原则做到极致而展开。</p>
<p>所以我觉得：</p>
<blockquote>
<p>第四阶段前端开发最迫切需要做好的就是在基础架构中贯彻增量原则。</p>
</blockquote>
<p>相信这种贯彻不会随着时间的推移而改变，在可预见的未来，无论在HTTP1.x还是HTTP2.0时代，无论在ES5亦或者ES6/7时代，无论是AMD/CommonJS/UMD亦或者ES6 module时代，无论端内技术如何变迁，我们都有足够充分的理由要做好前端程序资源的增量加载。</p>
<p>正如前面说到的，第三阶段前端工程缺少点什么呢？我觉得是在其基础架构中缺少这样一种“智能”的资源加载方案。没有这样的方案，很难将前端应用的规模发展到第四阶段，很难实现落地前面介绍的那种组件化开发方案，也很难让多方合作高效率的完成一项大型应用的开发，并保证其最终运行性能良好。在第四阶段，我们需要强大的工程化手段来管理”玩具般简单“的前端开发。</p>
<p>在我的印象中，Facebook是这方面探索的伟大先驱之一，早在2010年的<a href="http://velocity.oreilly.com.cn/2010/" target="_blank" rel="external">Velocity China大会</a>上，来自Facebook的<a href="http://davidwei.org/" target="_blank" rel="external">David Wei博士</a>就为业界展示了他们令人惊艳的<a href="http://velocity.oreilly.com.cn/2010/index.php?func=session&amp;name=%E9%9D%99%E6%80%81%E7%BD%91%E9%A1%B5%E8%B5%84%E6%BA%90%E7%9A%84%E7%AE%A1%E7%90%86%E5%92%8C%E4%BC%98%E5%8C%96" target="_blank" rel="external">静态网页资源管理和优化</a>技术。</p>
<p>David Wei博士在当年的交流会上提到过一些关于Facebook的一些产品数据：</p>
<blockquote>
<ul>
<li>Facebook整站有10000+个静态资源；</li>
<li>每个静态资源都有可能被翻译成超过100种语言版本；</li>
<li>每种资源又会针对浏览器生成3种不同的版本；</li>
<li>要针对不同带宽的用户做5种不同的打包方法；</li>
<li>有3、4个不同的用户组，用于小批次体验新的产品功能；</li>
<li>还要考虑不同的送达方法，可以直接送达，或者通过iframe的方式提升资源并行加载的速度；</li>
<li>静态资源的压缩和非压缩状态可切换，用于调试和定位线上问题</li>
</ul>
</blockquote>
<p>这是一个状态爆炸的问题，将所有状态乘起来，整个网站的资源组合方式会达到几百万种之多（去重之后统计大概有300万种组合方式）。支撑这么大规模前端项目运行的底层架构正是魏博士在那次演讲中分享的<a href="http://velocity.oreilly.com.cn/2010/ppts/VelocityChina2010Dec7StaticResource.pdf" target="_blank" rel="external">Static Resource Management System</a>(静态资源管理系统)，用以解决Facebook项目中有关前端工程的3D问题（Development，Deployment，Debugging）。</p>
<p><a href="https://github.com/fouber/blog/raw/master/201508/assets/velocity.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/velocity.png" alt=""></a></p>
<p>那段时间 <a href="http://fis.baidu.com" target="_blank" rel="external">FIS</a> 项目正好遇到瓶颈，当时的FIS还是一个用php写的task-based构建工具，那时候对于前端工程的认知度很低，觉得前端构建不就是几个压缩优化校验打包任务的组合吗，写好流程调度，就针对不同需求写插件呗，看似非常简单。但当我们支撑越来越多的业务团队，接触到各种不同的业务场景时，我们深刻的感受到task-based工具的粗糙，团队每天疲于根据各种业务场景编写各种打包插件，构建逻辑异常复杂，隐隐看到不可控的迹象。</p>
<p>我们很快意识到把基础架构放到构建工具中实现是一件很愚蠢的事，试图依靠构建工具实现各种优化策略使得构建变成了一个巨大的黑盒，一旦发生问题，定位起来非常困难，而且每种业务场景都有不同的优化需求，构建工具只能通过静态分析来优化加载，具有很大的局限性，单页面/多页面/PC端/移动端/前端渲染/后端渲染/多语言/多皮肤/高级优化等等资源加载问题，总不能给每个都写一套工具吧，更何况这些问题彼此之间还可以有多种组合应用，工具根本写不过来。</p>
<p>Facebook的做法无疑为我们亮起了一盏明灯，不过可惜它并不开源（不是技术封锁，而是这个系统依赖FB体系中的其他方面，通用性不强，开源意义不大），我们只能尝试挖掘相关信息，网上对它的完整介绍还是非常非常少，分析facebook的前端代码也没有太多收获，后来无意中发现了facebook使用的项目管理工具<a href="http://phabricator.org/" target="_blank" rel="external">phabricator</a>中的一个静态管理方案<a href="https://secure.phabricator.com/book/phabdev/article/celerity/" target="_blank" rel="external">Celerity</a>，以及相关的<a href="https://secure.phabricator.com/book/phabflavor/article/soon_static_resources/" target="_blank" rel="external">说明</a>，看它的描述很像是Facebook静态资源管理系统的一个mini版！</p>
<p>简单看过整个系统之后发现原理并不复杂（小而美的典范），它是通过一个小工具扫描所有静态资源，生成一张资源表，然后有一个PHP实现的资源管理框架（Celerity）提供了资源加载接口，替代了传统的script/link等静态的资源加载标签，最终通过查表来加载资源。</p>
<p>虽然没有真正看过FB的那套系统，但眼前的这个小小的框架给了当时的我们足够多的启示：</p>
<blockquote>
<p>静态资源管理系统 = 资源表 + 资源加载框架</p>
</blockquote>
<p>多么优雅的实现啊！</p>
<p>资源表是一份数据文件（比如JSON），是项目中所有静态资源（主要是JS和CSS）的构建信息记录，通过构建工具扫描项目源码生成，是一种k-v结构的数据，以每个资源的id为key，记录了资源的类别、部署路径、依赖关系、打包合并等内容，比如：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">&#123;</div><div class="line">    &quot;a.js&quot;: &#123;</div><div class="line">        &quot;url&quot;: &quot;/static/js/a.5f100fa.js&quot;,</div><div class="line">        &quot;dep&quot;: [ &quot;b.js&quot;, &quot;a.css&quot; ]</div><div class="line">    &#125;,</div><div class="line">    &quot;a.css&quot;: &#123;</div><div class="line">        &quot;url&quot;: &quot;/static/css/a.63cf374.css&quot;,</div><div class="line">        &quot;dep&quot;: [ &quot;button.css&quot; ]</div><div class="line">    &#125;,</div><div class="line">    &quot;b.js&quot;: &#123;</div><div class="line">        &quot;url&quot;: &quot;/static/js/b.97193bf.js&quot;</div><div class="line">    &#125;,</div><div class="line">    &quot;button.css&quot;: &#123;</div><div class="line">        &quot;url&quot;: &quot;/static/css/button.de33108.css&quot;</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>而资源加载框架则提供一些资源引用的API，让开发者根据id来引用资源，替代静态的script/link标签来收集、去重、按需加载资源。调用这些接口时，框架通过查表来查找资源的各项信息，并递归查找其依赖的资源的信息，然后我们可以在这个过程中实现各种性能优化算法来“智能”加载资源。</p>
<p>根据业务场景的不同，加载框架可以在浏览器中用JS实现，也可以是后端模板引擎中用服务端语言实现，甚至二者的组合，不一而足。</p>
<p><a href="https://github.com/fouber/blog/raw/master/201508/assets/srms.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/srms.png" alt=""></a></p>
<blockquote>
<p>有关加载框架的具体实现我曾写过很多文章介绍，可以扩展阅读：</p>
<ul>
<li><a href="https://github.com/fouber/blog/issues/3" target="_blank" rel="external">前端工程与性能优化</a></li>
<li><a href="https://github.com/fouber/blog/issues/4" target="_blank" rel="external">前端工程与模块化框架</a></li>
</ul>
</blockquote>
<p>这种设计很快被验证具有足够的灵活性，能够完美支撑不同团队不同技术规范下的性能优化需求，前面提到的按需加载、延迟加载、预加载、请求合并、文件指纹、CDN部署、Bigpipe、Quickling、BigRender、首屏CSS内嵌、HTTP 2.0服务端推送等等性能优化手段都可以很容易的在这种架构上实现，甚至可以根据性能日志自动进行优化（Facebook已实现）。</p>
<p>因为有了资源表，我们可以很方便的控制资源加载，通过各种手段在运行时计算页面的资源使用情况，从而获得最佳加载性能。无论是前端渲染的单页面应用，还是后端渲染的多页面应用，这种方法都同样适用。</p>
<p>此外，它还很巧妙的约束了构建工具的职责——只生成资源表。资源表是非常通用的数据结构，无论什么业务场景，其业务代码最终都可以被扫描为相同结构的表数据，并标记资源间的依赖关系，有了表之后我们只需根据不同的业务场景定制不同的资源加载框架就行了，从此彻底告别一个团队维护一套工具的时代！！！</p>
<p><a href="https://github.com/fouber/blog/raw/master/201508/assets/srms-2.png" target="_blank" rel="external"><img src="https://github.com/fouber/blog/raw/master/201508/assets/srms-2.png" alt=""></a></p>
<blockquote>
<p>恩，如你所见，虽然彻底告别了一个团队一套工具的时代，但似乎又进入了一个团队一套框架的时代。其实还是有差别的，因为框架具有很大的灵活性，而且不那么黑盒，采用框架实现资源管理相比构建更容易调试、定位和升级变更。</p>
</blockquote>
<p>深耕静态资源加载框架可以带来许多收益，而且有足够的灵活性和健壮性面向未来的技术变革，这个我们留作后话。</p>
<h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>回顾一下前面提到过的前端工程三个阶段：</p>
<ul>
<li>第一阶段：库/框架选型</li>
<li>第二阶段：简单构建优化</li>
<li>第三阶段：JS/CSS模块化开发</li>
</ul>
<p>现在补充上第四阶段：</p>
<ul>
<li>第四阶段：组件化开发与资源管理</li>
</ul>
<p>由于先天缺陷，<strong>前端相比其他软件开发，在基础架构上更加迫切的需要组件化开发和资源管理</strong>，而解决资源管理的方法其实一点也不复杂：</p>
<blockquote>
<p>一个通用的资源表生成工具 + 基于表的资源加载框架</p>
</blockquote>
<p>近几年来各种你听到过的各种资源加载优化策略大部分都可以在这样一套基础上实现，而这种优化对于业务来说是完全透明的，不需要重构的性能优化——这不正是我们一直所期盼的吗？正如魏小亮博士所说：我们可以把优秀的人集中起来去优化加载。</p>
<p>如何选型技术、如何定制规范、如何分治系统、如何优化性能、如何加载资源，当你从切图开始转变为思考这些问题的时候，我想说：</p>
<p>你好，工程师！</p>
<hr>
<blockquote>
<p>前端工程其实是一个很大的话题，开发仅是其中的一部分。</p>
</blockquote>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/前端工程/2017/03/02/何为web前端？前端工程分哪些阶段？.html">http://lucylc.com/前端工程/2017/03/02/何为web前端？前端工程分哪些阶段？.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;对于好的文章收录是我长期以来的爱好，这里感谢&lt;a href=&quot;https://github.com/fouber/blog&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;云龙大牛&lt;/a&gt;的分享&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;不知道你的团队如何定义前端开发，据我所知，时至今日仍然有很多团队会把前端开发归类为产品或者设计岗位，虽然身份之争多少有些无谓，但我对这种偏见还是心存芥蒂，酝酿了许久，决定写一个系列的文章，试着从工程的角度系统的介绍一下我对前端，尤其是Web前端的理解。&lt;/p&gt;
&lt;p&gt;只要我们还把自己的工作看作为一项软件开发活动，那么我相信读过下面的内容你也一定会有所共鸣。&lt;/p&gt;
&lt;h2 id=&quot;前端，是一种GUI软件&quot;&gt;&lt;a href=&quot;#前端，是一种GUI软件&quot; class=&quot;headerlink&quot; title=&quot;前端，是一种GUI软件&quot;&gt;&lt;/a&gt;前端，是一种GUI软件&lt;/h2&gt;
    
    </summary>
    
      <category term="前端工程" scheme="http://lucylc.com/categories/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B/"/>
    
    
      <category term="前端工程" scheme="http://lucylc.com/tags/%E5%89%8D%E7%AB%AF%E5%B7%A5%E7%A8%8B/"/>
    
  </entry>
  
  <entry>
    <title>Js函数作用域与this的指向问题</title>
    <link href="http://lucylc.com/JavaScript/2017/03/02/Js%E5%87%BD%E6%95%B0%E4%BD%9C%E7%94%A8%E5%9F%9F%E4%B8%8Ethis%E7%9A%84%E6%8C%87%E5%90%91%E9%97%AE%E9%A2%98.html"/>
    <id>http://lucylc.com/JavaScript/2017/03/02/Js函数作用域与this的指向问题.html</id>
    <published>2017-03-02T02:08:03.000Z</published>
    <updated>2017-08-20T10:15:40.945Z</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>以前对函数作用域以及this指向都没有一个系统的认识，偶然一次代码编写运行结果与自己预想结果不一样，这让我决定对Js的作用域和this深层次学习。下面是我当初的一个小错误：</p>
</blockquote>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> obj = &#123;</div><div class="line">    a: <span class="number">20</span>,</div><div class="line">    getA: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">        setTimeout(<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">            <span class="built_in">console</span>.log(<span class="keyword">this</span>.a)</div><div class="line">        &#125;, <span class="number">1000</span>)</div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line">obj.getA();</div></pre></td></tr></table></figure>
<p><strong>这里输出的undefined，因为这里的this指向window。只需要修改this指向就可以，方法很多。</strong></p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> obj = &#123;</div><div class="line">    a: <span class="number">20</span>,</div><div class="line">    getA: <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">        setTimeout(<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">            <span class="built_in">console</span>.log(<span class="keyword">this</span>.a)</div><div class="line">        &#125;.bind(<span class="keyword">this</span>), <span class="number">1000</span>)</div><div class="line">    &#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<a id="more"></a>
<p><strong>首先需要了解这些重要概念</strong>：</p>
<ul>
<li>基础数据类型与引用数据类型</li>
<li>内存空间</li>
<li>垃圾回收机制</li>
<li>执行上下文</li>
<li>变量对象与活动对象</li>
</ul>
<h3 id="作用域"><a href="#作用域" class="headerlink" title="作用域"></a>作用域</h3><ul>
<li><p>JavaScript中只有<strong>全局作用域</strong>与<strong>函数作用域</strong>(因为eval我们平时开发中几乎不会用到它，这里不讨论)。</p>
</li>
<li><p><strong>作用域</strong>与<strong>执行上下文</strong>是完全不同的两个概念。我知道很多人会混淆他们，但是一定要仔细区分</p>
</li>
</ul>
<blockquote>
<p>JavaScript代码的整个执行过程，分为两个阶段，代码编译阶段与代码执行阶段。编译阶段由编译器完成，将代码翻译成可执行代码，这个阶段作用域规则会确定。执行阶段由引擎完成，主要任务是执行可执行代码，执行上下文在这个阶段创建。下面请允许我盗一张图：来自波同学。</p>
</blockquote>
<p><img src="http://upload-images.jianshu.io/upload_images/599584-c850e91b12e88831.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt=""></p>
<ul>
<li><strong>我理解作用域是：函数名以及变量或者anguments所能访问或查找的规则，或者叫所能访问到内存区块。优先级是anguments-&gt;function表达式-&gt;var。变量在声明它们的函数体内(或嵌套函数内)任意地方都是有定义的</strong>。下面看一份代码：</li>
</ul>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> scope=<span class="string">"global"</span>;</div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">t</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(scope);</div><div class="line">    <span class="keyword">var</span> scope=<span class="string">"local"</span></div><div class="line">    <span class="built_in">console</span>.log(scope);</div><div class="line">&#125;</div><div class="line">t();</div></pre></td></tr></table></figure>
<p>第一句输出的是： “undefined”，而不是 “global”
第二讲输出的是：”local”
你可能会认为第一句会输出：”global”,因为代码还没执行var scope=”local”,所以肯定会输出“global”。
上面已经讲过，变量在函数体内任意地方都是有定义的。在函数作用域创建阶段，首先会先生成变量对象VO：VO包括anguments、function、var变量的创建。到了函数执行阶段包括变量开始赋值、执行上下文this确定、代码执行。在第一句console.log打印时，函数作用域内只有var scope，scope并没有赋值。可以理解为下面代码：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> scope=<span class="string">"global"</span>;</div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">t</span>(<span class="params"></span>)</span>&#123;</div><div class="line">    <span class="keyword">var</span> scope;</div><div class="line">    <span class="built_in">console</span>.log(scope);</div><div class="line">    scope=<span class="string">"local"</span></div><div class="line">    <span class="built_in">console</span>.log(scope);</div><div class="line">&#125;</div><div class="line">t();</div></pre></td></tr></table></figure>
<p>在此看来，由于函数作用域的特性，局部变量在整个函数体始终是由定义的，我们可以将变量声明”提前“到函数体顶部，同时变量初始化还在原来位置。</p>
<h3 id="作用域链"><a href="#作用域链" class="headerlink" title="作用域链"></a>作用域链</h3><p>这里来看一下执行上下文的生命周期：从创建–&gt;执行代码–&gt;执行完毕，出栈等待被回收。
<img src="http://upload-images.jianshu.io/upload_images/599584-391af3aad043c028.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt="执行上下文生命周期"></p>
<p>这里可以将作用域和作用域链结合起来理解：作用域是一块能够查询到的内存区域或者查询规则；作用域链，是对查询规则的实现或者内存寻址的过程，它保证了当前执行环境对符合访问权限的变量和函数的有序访问。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">var</span> a = <span class="number">20</span>;</div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">test</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="keyword">var</span> b = a + <span class="number">10</span>;</div><div class="line">    <span class="function"><span class="keyword">function</span> <span class="title">innerTest</span>(<span class="params"></span>) </span>&#123;</div><div class="line">        <span class="keyword">var</span> c = <span class="number">10</span>;</div><div class="line">        <span class="keyword">return</span> b + c;</div><div class="line">    &#125;</div><div class="line">    <span class="keyword">return</span> innerTest();</div><div class="line">&#125;</div><div class="line">test();</div><div class="line"></div><div class="line"><span class="comment">//innerTest的执行上下文创建阶段如下：</span></div><div class="line">innerTestEC = &#123;</div><div class="line">    VO: &#123;...&#125;,  <span class="comment">// 变量对象</span></div><div class="line">    scopeChain: [VO(innerTest), VO(test), VO(global)], <span class="comment">// 作用域链</span></div><div class="line">    <span class="keyword">this</span>: &#123;&#125;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<blockquote>
<p>因为变量对象在执行上下文进入执行阶段时，就变成了活动对象，这一点在上一篇文章中已经讲过，因此图中使用了AO来表示。Active Object</p>
<p>顺便理解一下<strong>闭包</strong>，简单来说，假设函数A在函数B的内部进行定义了，并且当函数A在执行时，访问了函数B内部的变量对象，那么B就是一个闭包。概述为：当函数可以记住并访问所在的作用域(全局作用域除外)时，就产生了闭包，即使函数是在当前作用域之外执行。有一下特点：</p>
</blockquote>
<ul>
<li>闭包与作用域链息息相关。</li>
<li>闭包是在函数执行过程中被确认。</li>
<li>通过闭包，我们可以在其他的执行上下文中，访问到其函数的内部变量</li>
</ul>
<p>闭包案例：利用闭包，修改下面的代码，让循环输出的结果依次为1， 2， 3， 4， 5</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i=<span class="number">1</span>; i&lt;=<span class="number">5</span>; i++) &#123;</div><div class="line">    setTimeout( <span class="function"><span class="keyword">function</span> <span class="title">timer</span>(<span class="params"></span>) </span>&#123;</div><div class="line">        <span class="built_in">console</span>.log(i);</div><div class="line">    &#125;, i*<span class="number">1000</span> );</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>简单修改为：（相信你可以更多其他方法）</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i=<span class="number">1</span>; i&lt;=<span class="number">5</span>; i++) &#123;</div><div class="line">    setTimeout( (<span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">        <span class="built_in">console</span>.log(i);</div><div class="line">    &#125;)(i), i*<span class="number">1000</span> );</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<blockquote>
<p>最后输出的7是setTimeout计时器的ID，计时器一般会生成一个唯一id，用于清除时用。</p>
</blockquote>
<h3 id="this的指向理解"><a href="#this的指向理解" class="headerlink" title="this的指向理解"></a>this的指向理解</h3><blockquote>
<p>this的指向，是在函数被调用的时候确定的</p>
</blockquote>
<h4 id="全局对象中的this"><a href="#全局对象中的this" class="headerlink" title="全局对象中的this"></a>全局对象中的this</h4><p>关于全局对象的this，我之前在总结变量对象的时候提到过，它是一个比较特殊的存在。全局环境中的this，指向它本身。因此，这也相对简单，没有那么多复杂的情况需要考虑。</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 通过this绑定到全局对象</span></div><div class="line"><span class="keyword">this</span>.a2 = <span class="number">20</span>;</div><div class="line"></div><div class="line"><span class="comment">// 通过声明绑定到变量对象，但在全局环境中，变量对象就是它自身</span></div><div class="line"><span class="keyword">var</span> a1 = <span class="number">10</span>;</div><div class="line"></div><div class="line"><span class="comment">// 仅仅只有赋值操作，标识符会隐式绑定到全局对象</span></div><div class="line">a3 = <span class="number">30</span>;</div><div class="line"></div><div class="line"><span class="comment">// 输出结果会全部符合预期</span></div><div class="line"><span class="built_in">console</span>.log(a1);</div><div class="line"><span class="built_in">console</span>.log(a2);</div><div class="line"><span class="built_in">console</span>.log(a3);</div></pre></td></tr></table></figure>
<h4 id="函数中的this"><a href="#函数中的this" class="headerlink" title="函数中的this"></a>函数中的this</h4><figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// demo01</span></div><div class="line"><span class="keyword">var</span> a = <span class="number">20</span>;</div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">fn</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="keyword">this</span>.a);</div><div class="line">&#125;</div><div class="line">fn();</div><div class="line"><span class="comment">// demo02</span></div><div class="line"><span class="keyword">var</span> a = <span class="number">20</span>;</div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">fn</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="function"><span class="keyword">function</span> <span class="title">foo</span>(<span class="params"></span>) </span>&#123;</div><div class="line">        <span class="built_in">console</span>.log(<span class="keyword">this</span>.a);</div><div class="line">    &#125;</div><div class="line">    foo();</div><div class="line">&#125;</div><div class="line">fn();</div><div class="line"><span class="comment">// demo03</span></div><div class="line"><span class="keyword">var</span> a = <span class="number">20</span>;</div><div class="line"><span class="keyword">var</span> obj = &#123;</div><div class="line">    a: <span class="number">10</span>,</div><div class="line">    c: <span class="keyword">this</span>.a + <span class="number">20</span>,</div><div class="line">    fn: <span class="function"><span class="keyword">function</span> (<span class="params"></span>) </span>&#123;</div><div class="line">        <span class="keyword">return</span> <span class="keyword">this</span>.a;</div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line"><span class="built_in">console</span>.log(obj.c);</div><div class="line"><span class="built_in">console</span>.log(obj.fn());</div></pre></td></tr></table></figure>
<blockquote>
<p>在一个函数上下文中，this由调用者提供，由调用函数的方式来决定。如果调用者函数，被某一个对象所拥有，那么该函数在调用时，内部的this指向该对象。如果函数独立调用，那么该函数内部的this，则指向undefined。但是在非严格模式中，当this指向undefined时，它会被自动指向全局对象。</p>
<p>当obj在全局声明时，无论obj.c在什么地方调用，这里的this都指向全局对象，而当obj在函数环境中声明时，这个this指向undefined，在非严格模式下，会自动转向全局对象</p>
</blockquote>
<h4 id="使用call，apply显示指定this"><a href="#使用call，apply显示指定this" class="headerlink" title="使用call，apply显示指定this"></a>使用call，apply显示指定this</h4><blockquote>
<p>call与applay后面的参数，都是向将要执行的函数传递参数。其中call以一个一个的形式传递，apply以数组的形式传递。这是他们唯一的不同</p>
</blockquote>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">fn</span>(<span class="params">num1, num2</span>) </span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="keyword">this</span>.a + num1 + num2);</div><div class="line">&#125;</div><div class="line"><span class="keyword">var</span> obj = &#123;</div><div class="line">    a: <span class="number">20</span></div><div class="line">&#125;</div><div class="line"></div><div class="line">fn.call(obj, <span class="number">100</span>, <span class="number">10</span>); <span class="comment">// 130</span></div><div class="line">fn.apply(obj, [<span class="number">20</span>, <span class="number">10</span>]); <span class="comment">// 50</span></div></pre></td></tr></table></figure>
<p><strong>实现继承</strong></p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div></pre></td><td class="code"><pre><div class="line"><span class="comment">// 定义父级的构造函数</span></div><div class="line"><span class="keyword">var</span> Person = <span class="function"><span class="keyword">function</span>(<span class="params">name, age</span>) </span>&#123;</div><div class="line">    <span class="keyword">this</span>.name = name;</div><div class="line">    <span class="keyword">this</span>.age  = age;</div><div class="line">    <span class="keyword">this</span>.gender = [<span class="string">'man'</span>, <span class="string">'woman'</span>];</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 定义子类的构造函数</span></div><div class="line"><span class="keyword">var</span> Student = <span class="function"><span class="keyword">function</span>(<span class="params">name, age, high</span>) </span>&#123;</div><div class="line"></div><div class="line">    <span class="comment">// use call</span></div><div class="line">    Person.call(<span class="keyword">this</span>, name, age);</div><div class="line">    <span class="keyword">this</span>.high = high;</div><div class="line">&#125;</div><div class="line">Student.prototype.message = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line">    <span class="built_in">console</span>.log(<span class="string">'name:'</span>+<span class="keyword">this</span>.name+<span class="string">', age:'</span>+<span class="keyword">this</span>.age+<span class="string">', high:'</span>+<span class="keyword">this</span>.high+<span class="string">', gender:'</span>+<span class="keyword">this</span>.gender[<span class="number">0</span>]+<span class="string">';'</span>);</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="keyword">new</span> Student(<span class="string">'xiaom'</span>, <span class="number">12</span>, <span class="string">'150cm'</span>).message();</div><div class="line"></div><div class="line"><span class="comment">// result</span></div><div class="line"><span class="comment">// ----------</span></div><div class="line"><span class="comment">// name:xiaom, age:12, high:150cm, gender:man;</span></div></pre></td></tr></table></figure>
<p> 在Student的构造函数中，借助call方法，将父级的构造函数执行了一次，相当于将Person中的代码，在Sudent中复制了一份，其中的this指向为从Student中new出来的实例对象。call方法保证了this的指向正确，因此就相当于实现了基层。</p>
 <figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"> <span class="keyword">var</span> Student = <span class="function"><span class="keyword">function</span>(<span class="params">name, age, high</span>) </span>&#123;</div><div class="line">    <span class="keyword">this</span>.name = name;</div><div class="line">    <span class="keyword">this</span>.age  = age;</div><div class="line">    <span class="keyword">this</span>.gender = [<span class="string">'man'</span>, <span class="string">'woman'</span>];</div><div class="line">    <span class="comment">// Person.call(this, name, age); 这一句话，相当于上面三句话，因此实现了继承</span></div><div class="line">    <span class="keyword">this</span>.high = high;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h4 id="构造函数与原型方法上的this"><a href="#构造函数与原型方法上的this" class="headerlink" title="构造函数与原型方法上的this"></a>构造函数与原型方法上的this</h4><blockquote>
<p>这是面向对象编程的核心要点，直接上代码</p>
</blockquote>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">Person</span>(<span class="params">name, age</span>) </span>&#123;</div><div class="line"></div><div class="line">    <span class="comment">// 这里的this指向了谁?</span></div><div class="line">    <span class="keyword">this</span>.name = name;</div><div class="line">    <span class="keyword">this</span>.age = age;</div><div class="line">&#125;</div><div class="line"></div><div class="line">Person.prototype.getName = <span class="function"><span class="keyword">function</span>(<span class="params"></span>) </span>&#123;</div><div class="line"></div><div class="line">    <span class="comment">// 这里的this又指向了谁？</span></div><div class="line">    <span class="keyword">return</span> <span class="keyword">this</span>.name;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="comment">// 上面的2个this，是同一个吗，他们是否指向了原型对象？</span></div><div class="line"></div><div class="line"><span class="keyword">var</span> p1 = <span class="keyword">new</span> Person(<span class="string">'Nick'</span>, <span class="number">20</span>);</div><div class="line">p1.getName();</div></pre></td></tr></table></figure>
<p>通过new操作符调用构造函数，会经历以下4个阶段。</p>
<ul>
<li>创建一个新的对象；</li>
<li>将构造函数的this指向这个新对象；</li>
<li>指向构造函数的代码，为这个对象添加属性，方法等；</li>
<li>返回新对象</li>
</ul>
<p>基本上prototype对象指向new操作符生成的实例，这里指向p1。</p>
<p>查阅资料：<a href="http://www.jianshu.com/p/d647aa6d1ae6#" target="_blank" rel="external">感谢波同学的分享</a>
<a href="http://blog.csdn.net/yueguanghaidao/article/details/9568071" target="_blank" rel="external">csdn的一篇博客</a></p>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/JavaScript/2017/03/02/Js函数作用域与this的指向问题.html">http://lucylc.com/JavaScript/2017/03/02/Js函数作用域与this的指向问题.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;以前对函数作用域以及this指向都没有一个系统的认识，偶然一次代码编写运行结果与自己预想结果不一样，这让我决定对Js的作用域和this深层次学习。下面是我当初的一个小错误：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;figure class=&quot;highlight javascript&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;div class=&quot;line&quot;&gt;1&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;2&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;3&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;4&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;5&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;6&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;7&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;8&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;9&lt;/div&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;div class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;var&lt;/span&gt; obj = &amp;#123;&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;    a: &lt;span class=&quot;number&quot;&gt;20&lt;/span&gt;,&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;    getA: &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;) &lt;/span&gt;&amp;#123;&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;        setTimeout(&lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;) &lt;/span&gt;&amp;#123;&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;            &lt;span class=&quot;built_in&quot;&gt;console&lt;/span&gt;.log(&lt;span class=&quot;keyword&quot;&gt;this&lt;/span&gt;.a)&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;        &amp;#125;, &lt;span class=&quot;number&quot;&gt;1000&lt;/span&gt;)&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;    &amp;#125;&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;&amp;#125;&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;obj.getA();&lt;/div&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
&lt;p&gt;&lt;strong&gt;这里输出的undefined，因为这里的this指向window。只需要修改this指向就可以，方法很多。&lt;/strong&gt;&lt;/p&gt;
&lt;figure class=&quot;highlight javascript&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;div class=&quot;line&quot;&gt;1&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;2&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;3&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;4&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;5&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;6&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;7&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;8&lt;/div&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;div class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;var&lt;/span&gt; obj = &amp;#123;&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;    a: &lt;span class=&quot;number&quot;&gt;20&lt;/span&gt;,&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;    getA: &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;) &lt;/span&gt;&amp;#123;&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;        setTimeout(&lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;function&lt;/span&gt;(&lt;span class=&quot;params&quot;&gt;&lt;/span&gt;) &lt;/span&gt;&amp;#123;&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;            &lt;span class=&quot;built_in&quot;&gt;console&lt;/span&gt;.log(&lt;span class=&quot;keyword&quot;&gt;this&lt;/span&gt;.a)&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;        &amp;#125;.bind(&lt;span class=&quot;keyword&quot;&gt;this&lt;/span&gt;), &lt;span class=&quot;number&quot;&gt;1000&lt;/span&gt;)&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;    &amp;#125;&lt;/div&gt;&lt;div class=&quot;line&quot;&gt;&amp;#125;&lt;/div&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
      <category term="JavaScript" scheme="http://lucylc.com/categories/JavaScript/"/>
    
    
      <category term="JavaScript" scheme="http://lucylc.com/tags/JavaScript/"/>
    
  </entry>
  
  <entry>
    <title>移动端兼容性解决方案汇总</title>
    <link href="http://lucylc.com/Mobile/2017/02/28/%E7%A7%BB%E5%8A%A8%E7%AB%AF%E5%85%BC%E5%AE%B9%E6%80%A7%E9%97%AE%E9%A2%98%E6%94%B6%E9%9B%86.html"/>
    <id>http://lucylc.com/Mobile/2017/02/28/移动端兼容性问题收集.html</id>
    <published>2017-02-28T08:24:54.000Z</published>
    <updated>2017-08-20T10:15:40.969Z</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>关于移动端的兼容性问题的解决方案，希望码友们踊跃分享，让移动端的坑无所遁形</p>
</blockquote>
<a id="more"></a>
<h3 id="1-IOS移动端click事件300ms的延迟响应"><a href="#1-IOS移动端click事件300ms的延迟响应" class="headerlink" title="1. IOS移动端click事件300ms的延迟响应"></a>1. IOS移动端click事件300ms的延迟响应</h3><p>移动设备上的web网页是有300ms延迟的，玩玩会造成按钮点击延迟甚至是点击失效。这是由于区分单击事件和双击屏幕缩放的历史原因造成的,</p>
<p>2007年苹果发布首款iphone上IOS系统搭载的safari为了将适用于PC端上大屏幕的网页能比较好的展示在手机端上，使用了双击缩放(double tap to zoom)的方案，比如你在手机上用浏览器打开一个PC上的网页，你可能在看到页面内容虽然可以撑满整个屏幕，但是字体、图片都很小看不清，此时可以快速双击屏幕上的某一部分，你就能看清该部分放大后的内容，再次双击后能回到原始状态。</p>
<p>双击缩放是指用手指在屏幕上快速点击两次，iOS 自带的 Safari 浏览器会将网页缩放至原始比例。</p>
<p>原因就出在浏览器需要如何判断快速点击上，当用户在屏幕上单击某一个元素时候，例如跳转链接a标签，此处浏览器会先捕获该次单击，但浏览器不能决定用户是单纯要点击链接还是要双击该部分区域进行缩放操作，所以，捕获第一次单击后，浏览器会先Hold一段时间t，如果在t时间区间里用户未进行下一次点击，则浏览器会做单击跳转链接的处理，如果t时间里用户进行了第二次单击操作，则浏览器会禁止跳转，转而进行对该部分区域页面的缩放操作。那么这个时间区间t有多少呢？在IOS safari下，大概为300毫秒。这就是延迟的由来。造成的后果用户纯粹单击页面，页面需要过一段时间才响应，给用户慢体验感觉，对于web开发者来说是，页面js捕获click事件的回调函数处理，需要300ms后才生效，也就间接导致影响其他业务逻辑的处理。</p>
<p>解决方案：</p>
<ul>
<li>fastclick可以解决在手机上点击事件的300ms延迟</li>
<li>zepto的touch模块，tap事件也是为了解决在click的延迟问题</li>
<li>触摸事件的响应顺序为 touchstart –&gt; touchmove –&gt; touchend –&gt; click,也可以通过绑定ontouchstart事件，加快对事件的响应，解决300ms延迟问题</li>
</ul>
<h3 id="2-一些情况下对非可点击元素如-label-span-监听click事件，ios下不会触发，css增加cursor-pointer就搞定了。"><a href="#2-一些情况下对非可点击元素如-label-span-监听click事件，ios下不会触发，css增加cursor-pointer就搞定了。" class="headerlink" title="2.一些情况下对非可点击元素如(label,span)监听click事件，ios下不会触发，css增加cursor:pointer就搞定了。"></a>2.一些情况下对非可点击元素如(label,span)监听click事件，ios下不会触发，css增加cursor:pointer就搞定了。</h3><h3 id="3-三星手机遮罩层下的input、select、a等元素可以被点击和focus-点击穿透"><a href="#3-三星手机遮罩层下的input、select、a等元素可以被点击和focus-点击穿透" class="headerlink" title="3. 三星手机遮罩层下的input、select、a等元素可以被点击和focus(点击穿透)"></a>3. 三星手机遮罩层下的input、select、a等元素可以被点击和focus(点击穿透)</h3><p>问题发现于三星手机，这个在特定需求下才会有，因此如果没有类似问题的可以不看。首先需求是浮层操作，在三星上被遮罩的元素依然可以获取focus、click、change)，有两种解决方案，</p>
<p>1.是通过层显示以后加入对应的class名控制，截断显示层下方可获取焦点元素的事件获取</p>
<p>2.是通过将可获取焦点元素加入的disabled属性，也可以利用属性加dom锁定的方式（disabled的一种变换方式）</p>
<h3 id="4-h5底部输入框被键盘遮挡问题"><a href="#4-h5底部输入框被键盘遮挡问题" class="headerlink" title="4. h5底部输入框被键盘遮挡问题"></a>4. h5底部输入框被键盘遮挡问题</h3><p>h5页面有个很蛋疼的问题就是，当输入框在最底部，点击软键盘后输入框会被遮挡。可采用如下方式解决</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">var oHeight = $(document).height(); //浏览器当前的高度</div><div class="line"></div><div class="line">   $(window).resize(function()&#123;</div><div class="line"></div><div class="line">        if($(document).height() &lt; oHeight)&#123;</div><div class="line"></div><div class="line">        $(&quot;#footer&quot;).css(&quot;position&quot;,&quot;static&quot;);</div><div class="line">    &#125;else&#123;</div><div class="line"></div><div class="line">        $(&quot;#footer&quot;).css(&quot;position&quot;,&quot;absolute&quot;);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">   &#125;);</div></pre></td></tr></table></figure>
<p><a href="http://efe.baidu.com/blog/mobile-fixed-layout/" target="_blank" rel="external">关于Web移动端Fixed布局的解决方案，这篇文章也不错</a></p>
<h3 id="5-不让-Android-手机识别邮箱"><a href="#5-不让-Android-手机识别邮箱" class="headerlink" title="5.不让 Android 手机识别邮箱"></a>5.不让 Android 手机识别邮箱</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">&lt;meta content=&quot;email=no&quot; name=&quot;format-detection&quot; /&gt;</div></pre></td></tr></table></figure>
<h3 id="6-禁止-iOS-识别长串数字为电话"><a href="#6-禁止-iOS-识别长串数字为电话" class="headerlink" title="6.禁止 iOS 识别长串数字为电话"></a><a href="https://github.com/AlloyTeam/Mars/tree/master/issues#禁止-ios-识别长串数字为电话" target="_blank" rel="external"></a>6.禁止 iOS 识别长串数字为电话</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">&lt;meta content=&quot;telephone=no&quot; name=&quot;format-detection&quot; /&gt;</div></pre></td></tr></table></figure>
<h3 id="7-禁止-iOS-弹出各种操作窗口"><a href="#7-禁止-iOS-弹出各种操作窗口" class="headerlink" title="7.禁止 iOS 弹出各种操作窗口"></a><a href="https://github.com/AlloyTeam/Mars/tree/master/issues#禁止-ios-弹出各种操作窗口" target="_blank" rel="external"></a>7.禁止 iOS 弹出各种操作窗口</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">-webkit-touch-callout:none</div></pre></td></tr></table></figure>
<h3 id="8-消除-transition-闪屏"><a href="#8-消除-transition-闪屏" class="headerlink" title="8.消除 transition 闪屏"></a>8.消除 transition 闪屏</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">-webkit-transform-style: preserve-3d;     /*设置内嵌的元素在 3D 空间如何呈现：保留 3D*/</div><div class="line">-webkit-backface-visibility: hidden;      /*(设置进行转换的元素的背面在面对用户时是否可见：隐藏)*/</div></pre></td></tr></table></figure>
<h3 id="9-iOS-系统中文输入法输入英文时，字母之间可能会出现一个六分之一空格"><a href="#9-iOS-系统中文输入法输入英文时，字母之间可能会出现一个六分之一空格" class="headerlink" title="9.iOS 系统中文输入法输入英文时，字母之间可能会出现一个六分之一空格"></a>9.iOS 系统中文输入法输入英文时，字母之间可能会出现一个六分之一空格</h3><p>可以通过正则去掉      <code>this.value = this.value.replace(/\u2006/g, &#39;&#39;);</code></p>
<h3 id="10-禁止ios和android用户选中文字"><a href="#10-禁止ios和android用户选中文字" class="headerlink" title="10.禁止ios和android用户选中文字"></a>10.禁止ios和android用户选中文字</h3><blockquote>
<p>-webkit-user-select:none</p>
</blockquote>
<h3 id="11-在ios和andriod中-audio元素和video元素在无法自动播放"><a href="#11-在ios和andriod中-audio元素和video元素在无法自动播放" class="headerlink" title="11.在ios和andriod中,audio元素和video元素在无法自动播放"></a>11.在ios和andriod中,audio元素和video元素在无法自动播放</h3><p>应对方案：触屏即播</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">$(&apos;html&apos;).one(&apos;touchstart&apos;,function()&#123;</div><div class="line">    audio.play()</div><div class="line">&#125;)</div></pre></td></tr></table></figure>
<h3 id="12-ios下取消input在输入的时候英文首字母的默认大写"><a href="#12-ios下取消input在输入的时候英文首字母的默认大写" class="headerlink" title="12.ios下取消input在输入的时候英文首字母的默认大写"></a>12.ios下取消input在输入的时候英文首字母的默认大写</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">&lt;input autocapitalize=&quot;off&quot; autocorrect=&quot;off&quot; /&gt;</div></pre></td></tr></table></figure>
<h3 id="13-android下取消输入语音按钮"><a href="#13-android下取消输入语音按钮" class="headerlink" title="13.android下取消输入语音按钮"></a>13.android下取消输入语音按钮</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">input::-webkit-input-speech-button &#123;display: none&#125;</div></pre></td></tr></table></figure>
<h3 id="14-CSS动画页面闪白-动画卡顿"><a href="#14-CSS动画页面闪白-动画卡顿" class="headerlink" title="14  CSS动画页面闪白,动画卡顿"></a>14  CSS动画页面闪白,动画卡顿</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">解决方法:</div><div class="line">1.尽可能地使用合成属性transform和opacity来设计CSS3动画，不使用position的left和top来定位</div><div class="line">2.开启硬件加速</div><div class="line">  -webkit-transform: translate3d(0, 0, 0);</div><div class="line">     -moz-transform: translate3d(0, 0, 0);</div><div class="line">      -ms-transform: translate3d(0, 0, 0);</div><div class="line">          transform: translate3d(0, 0, 0);</div></pre></td></tr></table></figure>
<h3 id="15-fixed定位缺陷"><a href="#15-fixed定位缺陷" class="headerlink" title="15.fixed定位缺陷"></a>15.fixed定位缺陷</h3><ul>
<li>ios下fixed元素容易定位出错，软键盘弹出时，影响fixed元素定位</li>
<li>android下fixed表现要比iOS更好，软键盘弹出时，不会影响fixed元素定位</li>
<li>ios4下不支持position:fixed</li>
<li>解决方案： 可用iScroll插件解决这个问题</li>
</ul>
<h3 id="16-阻止旋转屏幕时自动调整字体大小"><a href="#16-阻止旋转屏幕时自动调整字体大小" class="headerlink" title="16.阻止旋转屏幕时自动调整字体大小"></a>16.阻止旋转屏幕时自动调整字体大小</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">html, body, form, fieldset, p, div, h1, h2, h3, h4, h5, h6 &#123;-webkit-text-size-adjust:none;&#125;</div></pre></td></tr></table></figure>
<h3 id="17-Input-的placeholder会出现文本位置偏上的情况"><a href="#17-Input-的placeholder会出现文本位置偏上的情况" class="headerlink" title="17. Input 的placeholder会出现文本位置偏上的情况"></a>17. Input 的placeholder会出现文本位置偏上的情况</h3><p>input 的placeholder会出现文本位置偏上的情况：PC端设置line-height等于height能够对齐，而移动端仍然是偏上，解决是设置line-height：normal</p>
<h3 id="18-往返缓存问题"><a href="#18-往返缓存问题" class="headerlink" title="18. 往返缓存问题"></a>18. 往返缓存问题</h3><p>点击浏览器的回退，有时候不会自动执行js，特别是在mobilesafari中。这与<strong>往返缓存(bfcache)</strong>有关系。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">解决方法 ：window.onunload = function()&#123;&#125;;</div></pre></td></tr></table></figure>
<h3 id="19-calc的兼容性处理"><a href="#19-calc的兼容性处理" class="headerlink" title="19. calc的兼容性处理"></a>19. calc的兼容性处理</h3><p>CSS3中的calc变量在iOS6浏览器中必须加-webkit-前缀，目前的FF浏览器已经无需-moz-前缀。
Android浏览器目前仍然不支持calc，所以要在之前增加一个保守尺寸：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">div &#123;</div><div class="line">    width: 95%;</div><div class="line">    width: -webkit-calc(100% - 50px);</div><div class="line">    width: calc(100% - 50px);</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h3 id="20-iOS6下伪类-hover"><a href="#20-iOS6下伪类-hover" class="headerlink" title="20. iOS6下伪类:hover"></a>20. iOS6下伪类:hover</h3><p>除了<a>之外的元素无效；在Android下则有效。类似</a></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">div#topFloatBar_l:hover #topFloatBar_menu &#123; display:block; &#125;</div></pre></td></tr></table></figure>
<p>这样的导航显示在iOS6点击没有点击效果，只能通过增加点击侦听器给元素增减class来控制子元素。</p>
<h3 id="21-在移动端修改难看的点击的高亮效果，iOS和安卓下都有效："><a href="#21-在移动端修改难看的点击的高亮效果，iOS和安卓下都有效：" class="headerlink" title="21. 在移动端修改难看的点击的高亮效果，iOS和安卓下都有效："></a>21. 在移动端修改难看的点击的高亮效果，iOS和安卓下都有效：</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">* &#123;-webkit-tap-highlight-color:rgba(0,0,0,0);&#125;</div></pre></td></tr></table></figure>
<p>不过这个方法在现在的安卓浏览器下，只能去掉那个橙色的背景色，点击产生的高亮边框还是没有去掉，有待解决！</p>
<p>一个CSS3的属性，加上后，所关联的元素的事件监听都会失效，等于让元素变得“看得见，点不着”。IE到11才开始支持，其他浏览器的当前版本基本都支持。详细介绍见这里：<a href="https://developer.mozilla.org/zh-CN/docs/Web/CSS/pointer-events" target="_blank" rel="external">https://developer.mozilla.org/zh-CN/docs/Web/CSS/pointer-events</a></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">pointer-events: none;</div></pre></td></tr></table></figure>
<h3 id="22-Zepto点透的解决方案"><a href="#22-Zepto点透的解决方案" class="headerlink" title="22. Zepto点透的解决方案"></a>22. Zepto点透的解决方案</h3><p>zepto的tap是通过兼听绑定在document上的touch事件来完成tap事件的模拟的,及tap事件是冒泡到document上触发的,在点击完成时的tap事件(touchstart\touchend)需要冒泡到document上才会触发，而在冒泡到document之前，用户手的接触屏幕(touchstart)和离开屏幕(touchend)是会触发click事件的,因为click事件有延迟触发(这就是为什么移动端不用click而用tap的原因)(大概是300ms,为了实现safari的双击事件的设计)，所以在执行完tap事件之后，弹出来的选择组件马上就隐藏了，此时click事件还在延迟的300ms之中，当300ms到来的时候，click到的其实不是完成而是<strong>隐藏之后的下方的元素，如果正下方的元素绑定的有click事件此时便会触发，如果没有绑定click事件的话就当没click，但是正下方的是input输入框(或者select选择框或者单选复选框)，点击默认聚焦而弹出输入键盘，也就出现了上面的点透现象。</strong></p>
<p>引入fastclick.js，在页面中加入如下js代码</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">window.addEventListener( &quot;load&quot;, function() &#123;</div><div class="line">    FastClick.attach( document.body );</div><div class="line">&#125;, false );</div></pre></td></tr></table></figure>
<p>或者有zepto或者jQuery的js里面加上</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">$(function() &#123;</div><div class="line">    FastClick.attach(document.body);</div><div class="line">&#125;);</div></pre></td></tr></table></figure>
<p>当然require的话就这样：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">var FastClick = require(&apos;fastclick&apos;);</div><div class="line">FastClick.attach(document.body, options);</div></pre></td></tr></table></figure>
<p>方案二：用touchend代替tap事件并阻止掉touchend的默认行为preventDefault()</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">$(&quot;#cbFinish&quot;).on(&quot;touchend&quot;, function (event) &#123;</div><div class="line">   //很多处理比如隐藏什么的</div><div class="line">   event.preventDefault();</div><div class="line">);</div></pre></td></tr></table></figure>
<p>方案三：延迟一定的时间(300ms+)来处理事件</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">$(&quot;#cbFinish&quot;).on(&quot;tap&quot;, function (event) &#123;</div><div class="line">    setTimeout(function()&#123;</div><div class="line">    //很多处理比如隐藏什么的</div><div class="line">    &#125;,320);</div><div class="line">&#125;);</div></pre></td></tr></table></figure>
<h3 id="23-外观"><a href="#23-外观" class="headerlink" title="23.外观"></a>23.外观</h3><h4 id="A-页面高度渲染错误"><a href="#A-页面高度渲染错误" class="headerlink" title="A.页面高度渲染错误"></a>A.页面高度渲染错误</h4><p><img src="http://ossweb-img.qq.com/upload/webplat/info/tgideas/20141118/1416304280712440.gif" alt=""></p>
<pre><code>在各移动端浏览器中经常会出现这种页面高度100%的渲染错误，页面低端和系统自带的导航条重合了，高度的不正确我们需要重置修正它，通过javascript代码重置掉：
</code></pre><blockquote>
<p>document.documentElement.style.height = window.innerHeight + ‘px’;</p>
</blockquote>
<h4 id="B-叠加区高亮"><a href="#B-叠加区高亮" class="headerlink" title="B.叠加区高亮"></a>B.叠加区高亮</h4><p><img src="http://ossweb-img.qq.com/upload/webplat/info/tgideas/20141118/1416304280131383.jpg" alt=""></p>
<pre><code>在部分android机型中点击页面某一块区域可能会出现如图所示的黄色框秒闪，这是部分机型系统自身的默认定制样式，给该元素一个CSS样式重置掉：
</code></pre><blockquote>
<p>-webkit-tap-highlight-color:rgba(0,0,0,0);</p>
</blockquote>
<h3 id="24-行为"><a href="#24-行为" class="headerlink" title="24.行为"></a>24.行为</h3><h4 id="A、事件无法被触发"><a href="#A、事件无法被触发" class="headerlink" title="A、事件无法被触发"></a>A、事件无法被触发</h4><p><img src="http://ossweb-img.qq.com/upload/webplat/info/tgideas/20141118/1416304280403333.gif" alt=""></p>
<pre><code>在部分android机型的微信环境中会出现事件无法触发、表单无法输入的情况，我们针对需要输入或者触发事件的元素设置样式：-webkit-transform: translate3d(0,0,0) ，不过新版本的微信已经直接修复了该问题。
</code></pre><h4 id="B、-active-效果不兼容"><a href="#B、-active-效果不兼容" class="headerlink" title="B、:active 效果不兼容"></a>B、:active 效果不兼容</h4><p><img src="http://ossweb-img.qq.com/upload/webplat/info/tgideas/20141118/1416304280054931.gif" alt=""></p>
<pre><code>在android 4.0版本以下CSS :active伪状态效果无法兼容，我们给该元素的touch系列的事件（touchstart/touchend/touchmove）绑定一个空匿名方法:
</code></pre><blockquote>
<p>var element=document.getElementsById(”btnShare”);
element.addEventListener(‘touchstart’,function(){},false);</p>
</blockquote>
<h3 id="25-应用"><a href="#25-应用" class="headerlink" title="25.应用"></a>25.应用</h3><h4 id="A、浏览器崩溃"><a href="#A、浏览器崩溃" class="headerlink" title="A、浏览器崩溃"></a>A、浏览器崩溃</h4><p><img src="http://ossweb-img.qq.com/upload/webplat/info/tgideas/20141118/1416304280070135.jpg" alt=""></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"></div><div class="line">var act = function()&#123;</div><div class="line">    window.removeEventListener(&apos;devicemotion&apos;,act);</div><div class="line">&#125;;</div><div class="line">window.addEventListener(&apos;devicemotion&apos;,act,false);</div></pre></td></tr></table></figure>
<pre><code>解绑函数写在了事件处理中导致小米手机中的微信崩溃，那么我们不要将解绑时间写在事件处理中即可。
</code></pre><h4 id="B、预加载、自动播放无效"><a href="#B、预加载、自动播放无效" class="headerlink" title="B、预加载、自动播放无效"></a>B、预加载、自动播放无效</h4><p><img src="http://ossweb-img.qq.com/upload/webplat/info/tgideas/20141118/1416304281067074.jpg" alt=""></p>
<pre><code>如上表所示，经过简单的测试发现预加载、自动播放的有效性受操作系统、浏览器（webview）、版本等的影响，苹果官方规定必须由用户手动触发才会载入音频，那么我们捕捉一次用户输入后，让音频加载实现预加载:
</code></pre><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">//play and pause it once</div><div class="line"></div><div class="line">document.addEventListener(&apos;touchstart&apos;, function () &#123;</div><div class="line"></div><div class="line"> document.getElementsByTagName(&apos;audio&apos;)[0].play();</div><div class="line"></div><div class="line"> document.getElementsByTagName(&apos;audio&apos;)[0].pause();</div><div class="line"></div><div class="line">&#125;);</div></pre></td></tr></table></figure>
<h4 id="C、无法同时播放多音频"><a href="#C、无法同时播放多音频" class="headerlink" title="C、无法同时播放多音频"></a>C、无法同时播放多音频</h4><p><img src="http://ossweb-img.qq.com/upload/webplat/info/tgideas/20141118/1416304281787026.gif" alt=""></p>
<blockquote>
<p>在android设备中,播放后一音频会打断前一音频，而不会同步播放,这个是目前系统资深决定的，我们只有采取优雅降权的方法让android选择不一样风格的音频前后切换播放而不是同时播放，达到与预期接近的音频效果。</p>
</blockquote>
<h4 id="D、不支持局部滚动"><a href="#D、不支持局部滚动" class="headerlink" title="D、不支持局部滚动"></a>D、不支持局部滚动</h4><p><img src="http://ossweb-img.qq.com/upload/webplat/info/tgideas/20141118/1416304282050681.gif" alt=""></p>
<blockquote>
<p>在android 4.0版本以下在body(html)元素之外的元素 overflow:scroll 样式设置滚动条无效，这里有两种解决方案:</p>
</blockquote>
<pre><code>1、巧用布局直接设置样式滚动条在body(html)上，其他元素“错觉滚动”。

2、利用iscroll、自写js控制translate、scrollTop模拟
</code></pre><h3 id="26-系统-硬件"><a href="#26-系统-硬件" class="headerlink" title="26.系统/硬件"></a>26.系统/硬件</h3><h4 id="A、怪异悬浮的表单"><a href="#A、怪异悬浮的表单" class="headerlink" title="A、怪异悬浮的表单"></a>A、怪异悬浮的表单</h4><p><img src="http://ossweb-img.qq.com/upload/webplat/info/tgideas/20141118/1416304282155784.gif" alt=""></p>
<blockquote>
<p>在部分android 机型中的输入框可能会出现如图怪异的多余的浮出表单，经过观察与测试发现只有input:password类型的输入框存在，那么我们只要使用input:text类型的输入框并通过样式-webkit-text-security: disc; 隐藏输入密码从而解决。</p>
</blockquote>
<h4 id="B、错误出现滚动条"><a href="#B、错误出现滚动条" class="headerlink" title="B、错误出现滚动条"></a>B、错误出现滚动条</h4><p><img src="http://ossweb-img.qq.com/upload/webplat/info/tgideas/20141118/1416304282257464.jpg" alt=""></p>
<blockquote>
<p>在游戏内嵌页中出现了不应该出现的滚动条，而且内容并没有超出内容区宽度，经过测试overflow:hidden 无效，通过一系列尝试使用古老的 <body scroll="no"> 写法解决，多尝试一下不同的写法和属性会有不一样的惊喜哦！</body></p>
</blockquote>
<h4 id="C、链接打开系统浏览器"><a href="#C、链接打开系统浏览器" class="headerlink" title="C、链接打开系统浏览器"></a>C、链接打开系统浏览器</h4><p><img src="http://ossweb-img.qq.com/upload/webplat/info/tgideas/20141118/1416304282074983.jpg" alt=""></p>
<blockquote>
<p>在游戏内webview的部分android机型中可能会出现点击链接调用系统浏览器的情况，这是一个非常不好的体验。那么我们尝试给这个元素添加 target=”_blank”‘ 属性有可能解决，如果还不能解决那么需要修改IOS或android原生系统函数了。</p>
</blockquote>
<h4 id="D、Flex-box-不兼容"><a href="#D、Flex-box-不兼容" class="headerlink" title="D、Flex box 不兼容"></a>D、Flex box 不兼容</h4><p><img src="http://ossweb-img.qq.com/upload/webplat/info/tgideas/20141118/1416304282160849.jpg" alt=""></p>
<blockquote>
<p>在游戏内嵌webview中碰到Flex box布局不兼容的情况，图中所示下面部分的导航错位了，虽然之前有仔细查看过Flex box的兼容性，但是在游戏内嵌页中无法确定其调用的系统浏览器版本及兼容，所以导致错误，所以我们写完整历史版本呢的3种Flex box 解决。那么我们思考在写页面过程中还是本着保守稳定的方式书写样式可以减少不不要的麻烦。</p>
</blockquote>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/Mobile/2017/02/28/移动端兼容性问题收集.html">http://lucylc.com/Mobile/2017/02/28/移动端兼容性问题收集.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;关于移动端的兼容性问题的解决方案，希望码友们踊跃分享，让移动端的坑无所遁形&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="Mobile" scheme="http://lucylc.com/categories/Mobile/"/>
    
    
      <category term="移动端兼容性" scheme="http://lucylc.com/tags/%E7%A7%BB%E5%8A%A8%E7%AB%AF%E5%85%BC%E5%AE%B9%E6%80%A7/"/>
    
  </entry>
  
  <entry>
    <title>前端Swig模版快速入门</title>
    <link href="http://lucylc.com/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/2017/02/27/swig%E6%A8%A1%E7%89%88%E5%BF%AB%E9%80%9F%E5%85%A5%E9%97%A8.html"/>
    <id>http://lucylc.com/技术分享/2017/02/27/swig模版快速入门.html</id>
    <published>2017-02-27T00:35:59.000Z</published>
    <updated>2017-08-20T10:15:40.961Z</updated>
    
    <content type="html"><![CDATA[<blockquote>
<p>Swig官网文档经常404打不开，网上Swig模版在前端的中文资料非常少，这里也是</p>
<p>摘录网上的一部分资料，乐于分享的朋友可以留言哦。不过对于想要修改</p>
<p>Hexo-Next博客的朋友，相信看了这篇文章的朋友能够大概知道使用技巧。</p>
<p>后续我也会整理一下Swig模版的基本资料。</p>
</blockquote>
<a id="more"></a>
<h2 id="如何使用"><a href="#如何使用" class="headerlink" title="如何使用"></a>如何使用</h2><h3 id="Swig优点："><a href="#Swig优点：" class="headerlink" title="Swig优点："></a>Swig优点：</h3><ul>
<li>支持大多数主流浏览器。</li>
<li>表达式兼容性好。</li>
<li>面向对象的模板继承。</li>
<li>将过滤器和转换应用到模板中的输出。</li>
<li>可根据路劲渲染页面。</li>
<li>支持页面复用。</li>
<li>支持动态页面。</li>
<li>可扩展、可定制。</li>
</ul>
<h3 id="API"><a href="#API" class="headerlink" title="API"></a>API</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">swig.init(&#123;</div><div class="line">  allowErrors: false,</div><div class="line">  autoescape: true,</div><div class="line">  cache: true,</div><div class="line">  encoding: &apos;utf8&apos;,</div><div class="line">  filters: &#123;&#125;,</div><div class="line">  root: &apos;/&apos;,</div><div class="line">  tags: &#123;&#125;,</div><div class="line">  extensions: &#123;&#125;,</div><div class="line">  tzOffset: 0</div><div class="line">&#125;);</div></pre></td></tr></table></figure>
<p>options:</p>
<blockquote>
<p><strong>allowErrors</strong>:
默认值为 false。将所有模板解析和编译错误直接输出到模板。如果为 true，则将引发错误，抛出到 Node.js 进程中，可能会使您的应用程序崩溃。</p>
<p><strong>autoescape</strong>:
默认true，强烈建议保持。字符转换表请参阅转义过滤器。</p>
<blockquote>
<p>true: HTML安全转义
false: 不转义，除非使用转义过滤器或者转义标签
‘js’: js安全转义</p>
</blockquote>
<p><strong>cache</strong>:
更改为 false 将重新编译每个请求的模板的文件。正式环境建议保持true。</p>
<p><strong>encoding</strong>
模板文件编码</p>
<p><strong>root</strong>
需要搜索模板的目录。如果模板传递给 swig.compileFile 绝对路径(以/开头)，Swig不会在模板root中搜索。如果传递一个数组，使用第一个匹配成功的数组项。</p>
<p><strong>tzOffset</strong>
设置默认时区偏移量。此设置会使转换日期过滤器会自动的修正相应时区偏移量。</p>
<p><strong>filters</strong> 自定义过滤器或者重写默认过滤器，参见自定义过滤器指南。</p>
<p><strong>tags</strong>
自定义标签或者重写默认标签，参见自定义标签指南。</p>
<p><strong>extensions</strong> 添加第三方库，可以在编译模板时使用，参见参见自定义标签指南。</p>
</blockquote>
<h3 id="nodejs"><a href="#nodejs" class="headerlink" title="nodejs"></a>nodejs</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">var tpl = swig.compileFile(&quot;path/to/template/file.html&quot;);</div><div class="line">var renderedHtml = tpl.render(&#123; vars: &apos;to be inserted in template&apos; &#125;);</div></pre></td></tr></table></figure>
<p>or</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">var tpl = swig.compile(&quot;Template string here&quot;);</div><div class="line">var renderedHtml = tpl(&#123; vars: &apos;to be inserted in template&apos; &#125;);</div></pre></td></tr></table></figure>
<h3 id="结合Express"><a href="#结合Express" class="headerlink" title="结合Express"></a>结合Express</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">npm install express</div><div class="line">npm install consolidate</div></pre></td></tr></table></figure>
<p>然后</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">app.engine(&apos;.html&apos;, cons.swig);</div><div class="line">app.set(&apos;view engine&apos;, &apos;html&apos;);</div></pre></td></tr></table></figure>
<h3 id="浏览器"><a href="#浏览器" class="headerlink" title="浏览器"></a>浏览器</h3><p>Swig浏览器版本的api基本与nodejs版相同，不同点如下：</p>
<ol>
<li>不能使用swig.compileFile，浏览器没有文件系统</li>
<li>你必须提前使用swig.compile编译好模板</li>
<li><p>按顺序使用extends, import, and include，同时在swig.compile里使用参数templateKey来查找模板</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">var template = swig.compile(&apos;&lt;p&gt;&#123;% block content %&#125;&#123;% endblock %&#125;&lt;/p&gt;&apos;, &#123; filename: &apos;main&apos; &#125;);</div><div class="line">var mypage = swig.compile(&apos;&#123;% extends &quot;main&quot; %&#125;&#123;% block content %&#125;Oh hey there!&#123;% endblock %&#125;&apos;, &#123; filename: &apos;mypage&apos; &#125;);</div></pre></td></tr></table></figure>
</li>
</ol>
<h2 id="基础"><a href="#基础" class="headerlink" title="基础"></a>基础</h2><h3 id="变量"><a href="#变量" class="headerlink" title="变量"></a>变量</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">&#123;&#123; foo.bar &#125;&#125;</div><div class="line">&#123;&#123; foo[&apos;bar&apos;] &#125;&#125;</div></pre></td></tr></table></figure>
<p>如果变量未定义，输出空字符。</p>
<p>变量可以通过过滤器来修改：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">&#123;&#123; name|title &#125;&#125; was born on &#123;&#123; birthday|date(&apos;F jS, Y&apos;) &#125;&#125;</div><div class="line">// Jane was born on July 6th, 1985</div></pre></td></tr></table></figure>
<h3 id="逻辑标签"><a href="#逻辑标签" class="headerlink" title="逻辑标签"></a>逻辑标签</h3><p>参见标签部分。</p>
<h3 id="注释"><a href="#注释" class="headerlink" title="注释"></a>注释</h3><h3 id="空白"><a href="#空白" class="headerlink" title="空白"></a>空白</h3><p>模板里的空白在最终输出时默认保留，如果需要去掉空白，可以在逻辑标签前后加上空白控制服-：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">&#123;% for item in seq -%&#125;</div><div class="line">    &#123;&#123; item &#125;&#125;</div><div class="line">&#123;%- endfor %&#125;</div></pre></td></tr></table></figure>
<h2 id="模板继承"><a href="#模板继承" class="headerlink" title="模板继承"></a>模板继承</h2><p>Swig 使用 extends 和 block 来实现模板继承</p>
<p><strong>layout.html</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">&lt;!doctype html&gt;</div><div class="line">&lt;html&gt;</div><div class="line">&lt;head&gt;</div><div class="line">    &lt;meta charset=&quot;utf-8&quot;&gt;</div><div class="line">    &lt;title&gt;&#123;% block title %&#125;My Site&#123;% endblock %&#125;&lt;/title&gt;</div><div class="line"></div><div class="line">    &#123;% block head %&#125;</div><div class="line">        &lt;link rel=&quot;stylesheet&quot; href=&quot;main.css&quot;&gt;</div><div class="line">    &#123;% endblock %&#125;</div><div class="line">&lt;/head&gt;</div><div class="line">&lt;body&gt;</div><div class="line">    &#123;% block content %&#125;&#123;% endblock %&#125;</div><div class="line">&lt;/body&gt;</div><div class="line">&lt;/html&gt;</div></pre></td></tr></table></figure>
<p><strong>index.html</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">&#123;% extends &apos;layout.html&apos; %&#125;</div><div class="line"></div><div class="line">&#123;% block title %&#125;My Page&#123;% endblock %&#125;</div><div class="line"></div><div class="line">&#123;% block head %&#125;</div><div class="line">&#123;% parent %&#125;</div><div class="line">    &lt;link rel=&quot;stylesheet&quot; href=&quot;custom.css&quot;&gt;</div><div class="line">&#123;% endblock %&#125;</div><div class="line"></div><div class="line">&#123;% block content %&#125;</div><div class="line">    &lt;p&gt;This is just an awesome page.&lt;/p&gt;</div><div class="line">&#123;% endblock %&#125;</div></pre></td></tr></table></figure>
<h2 id="变量过滤器"><a href="#变量过滤器" class="headerlink" title="变量过滤器"></a>变量过滤器</h2><p>用于修改变量。变量名称后用 | 字符分隔添加过滤器。您可以添加多个过滤器。</p>
<h3 id="例子"><a href="#例子" class="headerlink" title="例子"></a>例子</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">&#123;&#123; name|title &#125;&#125; was born on &#123;&#123; birthday|date(&apos;F jS, Y&apos;) &#125;&#125;</div><div class="line">and has &#123;&#123; bikes|length|default(&quot;zero&quot;) &#125;&#125; bikes.</div></pre></td></tr></table></figure>
<p>也可以使用 filter 标签来为块内容添加过滤器</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">&#123;% filter upper %&#125;oh hi, paul&#123;% endfilter %&#125;</div></pre></td></tr></table></figure>
<h3 id="内置过滤器"><a href="#内置过滤器" class="headerlink" title="内置过滤器"></a>内置过滤器</h3><blockquote>
<p><strong>add(value)</strong>
使变量与value相加，可以转换为数值字符串会自动转换为数值。</p>
<p><strong>addslashes</strong>
用 \ 转义字符串</p>
<p><strong>capitalize</strong>
大写首字母</p>
<p><strong>date(format[, tzOffset])</strong>
转换日期为指定格式</p>
<blockquote>
<p>format： 格式
tzOffset： 时区</p>
</blockquote>
<p><strong>default(value)</strong>
默认值（如果变量为undefined，null，false）</p>
<p><strong>e</strong>
同escape</p>
<p><strong>escape([type])</strong>
转义字符</p>
<blockquote>
<p>默认： &amp;, &lt;, &gt;, “, ‘
js: &amp;, &lt;, &gt;, “, ‘, =, -, ;</p>
</blockquote>
<p><strong>first</strong>
返回数组第一个值</p>
<p><strong>join(glue)</strong>
同[].join</p>
<p><strong>json_encode([indent])</strong>
类似JSON.stringify, indent为缩进空格数</p>
<p><strong>last</strong>
返回数组最后一个值</p>
<p><strong>length</strong>
返回变量的length，如果是object，返回key的数量</p>
<p><strong>lower</strong>
同’’.toLowerCase()</p>
<p><strong>raw</strong>
指定输入不会被转义</p>
<p><strong>replace(search, replace[, flags])</strong>
同’’.replace</p>
<p><strong>reverse</strong>
翻转数组</p>
<p><strong>striptags</strong>
去除html/xml标签</p>
<p><strong>title</strong>
大写首字母</p>
<p><strong>uniq</strong>
数组去重</p>
<p><strong>upper</strong>
同’’.toUpperCase</p>
<p><strong>url_encode</strong>
同encodeURIComponent</p>
<p><strong>url_decode</strong>
同decodeURIComponemt</p>
</blockquote>
<h3 id="自定义过滤器"><a href="#自定义过滤器" class="headerlink" title="自定义过滤器"></a>自定义过滤器</h3><p>创建一个 myfilter.js 然后引入到 Swig 的初始化函数中</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">swig.init(&#123; filters: require(&apos;myfilters&apos;) &#125;);</div></pre></td></tr></table></figure>
<p>在 myfilter.js 里，每一个 filter 方法都是一个简单的 js 方法，下例是一个翻转字符串的 filter：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">exports.myfilter = function (input) &#123;</div><div class="line">    return input.toString().split(&apos;&apos;).reverse().join(&apos;&apos;);</div><div class="line">&#125;;</div></pre></td></tr></table></figure>
<p>你的 filter 一旦被引入，你就可以向下面一样使用：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">&#123;&#123; name|myfilter &#125;&#125;</div><div class="line"></div><div class="line">&#123;% filter myfilter %&#125;I shall be filtered&#123;% endfilter %&#125;</div></pre></td></tr></table></figure>
<p>你也可以像下面一样给 filter 传参数：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">exports.prefix = function(input, prefix) &#123;</div><div class="line">    return prefix.toString() + input.toString();</div><div class="line">&#125;;</div><div class="line"></div><div class="line">&#123;&#123; name|prefix(&apos;my prefix&apos;) &#125;&#125;</div><div class="line"></div><div class="line">&#123;% filter prefix &apos;my prefix&apos; %&#125;I will be prefixed with &quot;my prefix&quot;.&#123;% endfilter %&#125;</div><div class="line">&#123;% filter prefix foo %&#125;I will be prefixed with the value stored to `foo`.&#123;% endfilter %&#125;</div></pre></td></tr></table></figure>
<h2 id="标签"><a href="#标签" class="headerlink" title="标签"></a>标签</h2><h3 id="内置标签"><a href="#内置标签" class="headerlink" title="内置标签"></a>内置标签</h3><blockquote>
<p><strong>extends</strong>
使当前模板继承父模板，必须在文件最前</p>
<blockquote>
<p>参数：
file:
父模板相对模板 root 的相对路径</p>
</blockquote>
<p><strong>block</strong>
定义一个块，使之可以被继承的模板重写，或者重写父模板的同名块</p>
<blockquote>
<p>参数：
name:
块的名字，必须以字母数字下划线开头</p>
</blockquote>
<p><strong>parent</strong>
将父模板中同名块注入当前块中</p>
<p><strong>include</strong>
包含一个模板到当前位置，这个模板将使用当前上下文</p>
<blockquote>
<p>参数：
file:
包含模板相对模板 root 的相对路径
ignore missing:
包含模板不存在也不会报错
with x:
设置 x 至根上下文对象以传递给模板生成。必须是一个键值对
only:
限制模板上下文中用 with x 定义的参数</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% include template_path %&#125;</div><div class="line">&gt; &#123;% include &quot;path/to/template.js&quot; %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>你可以标记 ignore missing，这样如果模板不存在，也不会抛出错误</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% include &quot;foobar.html&quot; ignore missing %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>本地声明的上下文变量，默认情况不会传递给包含的模板。例如以下情况，inc.html 无法得到 foo 和 bar</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% set foo = &quot;bar&quot; %&#125;</div><div class="line">&gt; &#123;% include &quot;inc.html&quot; %&#125;</div><div class="line">&gt;</div><div class="line">&gt; &#123;% for bar in thing %&#125;</div><div class="line">&gt;     &#123;% include &quot;inc.html&quot; %&#125;</div><div class="line">&gt; &#123;% endfor %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>如果想把本地声明的变量引入到包含的模板种，可以使用 with 参数来把后面的对象创建到包含模板的上下文中</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% set foo = &#123; bar: &quot;baz&quot; &#125; %&#125;</div><div class="line">&gt; &#123;% include &quot;inc.html&quot; with foo %&#125;</div><div class="line">&gt;</div><div class="line">&gt; &#123;% for bar in thing %&#125;</div><div class="line">&gt;     &#123;% include &quot;inc.html&quot; with bar %&#125;</div><div class="line">&gt; &#123;% endfor %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>如果当前上下文中 foo 和 bar 可用，下面的情况中，只有 foo 会被 inc.html 定义</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% include &quot;inc.html&quot; with foo only %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>only 必须作为最后一个参数，放在其他位置会被忽略</p>
<p><strong>raw</strong>
停止解析标记中任何内容，所有内容都将输出</p>
<blockquote>
<p>参数：
file:
父模板相对模板 root 的相对路径</p>
</blockquote>
<p><strong>for</strong>
遍历对象和数组</p>
<blockquote>
<p>参数：
x:
当前循环迭代名
in:
语法标记
y:
可迭代对象。可以使用过滤器修改</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% for x in y %&#125;</div><div class="line">&gt;     &#123;% if loop.first %&#125;&lt;ul&gt;&#123;% endif %&#125;</div><div class="line">&gt;     &lt;li&gt;&#123;&#123; loop.index &#125;&#125; - &#123;&#123; loop.key &#125;&#125;: &#123;&#123; x &#125;&#125;&lt;/li&gt;</div><div class="line">&gt;     &#123;% if loop.last %&#125;&lt;/ul&gt;&#123;% endif %&#125;</div><div class="line">&gt; &#123;% endfor %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<blockquote>
<p>特殊循环变量
loop.index：当前循环的索引（1开始）
loop.index0：当前循环的索引（0开始）
loop.revindex：当前循环从结尾开始的索引（1开始）
loop.revindex0：当前循环从结尾开始的索引（0开始）
loop.key：如果迭代是对象，是当前循环的键，否则同 loop.index
loop.first：如果是第一个值返回 true
loop.last：如果是最后一个值返回 true
loop.cycle：一个帮助函数，以指定的参数作为周期</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% for item in items %&#125;</div><div class="line">&gt;     &lt;li class=&quot;&#123;&#123; loop.cycle(&apos;odd&apos;, &apos;even&apos;) &#125;&#125;&quot;&gt;&#123;&#123; item &#125;&#125;&lt;/li&gt;</div><div class="line">&gt; &#123;% endfor %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>在 for 标签里使用 else</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% for person in people %&#125;</div><div class="line">&gt;     &#123;&#123; person &#125;&#125;</div><div class="line">&gt; &#123;% else %&#125;</div><div class="line">&gt;     There are no people yet!</div><div class="line">&gt; &#123;% endfor %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p><strong>if</strong>
条件语句</p>
<blockquote>
<p>参数：
…:
接受任何有效的 JavaScript 条件语句，以及一些其他人类可读语法</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% if x %&#125;&#123;% endif %&#125;</div><div class="line">&gt; &#123;% if !x %&#125;&#123;% endif %&#125;</div><div class="line">&gt; &#123;% if not x %&#125;&#123;% endif %&#125;</div><div class="line">&gt;</div><div class="line">&gt; &#123;% if x and y %&#125;&#123;% endif %&#125;</div><div class="line">&gt; &#123;% if x &amp;&amp; y %&#125;&#123;% endif %&#125;</div><div class="line">&gt; &#123;% if x or y %&#125;&#123;% endif %&#125;</div><div class="line">&gt; &#123;% if x || y %&#125;&#123;% endif %&#125;</div><div class="line">&gt; &#123;% if x || (y &amp;&amp; z) %&#125;&#123;% endif %&#125;</div><div class="line">&gt;</div><div class="line">&gt; &#123;% if x [operator] y %&#125;</div><div class="line">&gt;     Operators: ==, !=, &lt;, &lt;=, &gt;, &gt;=, ===, !==</div><div class="line">&gt; &#123;% endif %&#125;</div><div class="line">&gt;</div><div class="line">&gt; &#123;% if x == &apos;five&apos; %&#125;</div><div class="line">&gt;     The operands can be also be string or number literals</div><div class="line">&gt; &#123;% endif %&#125;</div><div class="line">&gt;</div><div class="line">&gt; &#123;% if x|length === 3 %&#125;</div><div class="line">&gt;     You can use filters on any operand in the statement.</div><div class="line">&gt; &#123;% endif %&#125;</div><div class="line">&gt;</div><div class="line">&gt; &#123;% if x in y %&#125;</div><div class="line">&gt;     If x is a value that is present in y, this will return true.</div><div class="line">&gt; &#123;% endif %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>else 和 else if</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% if foo %&#125;</div><div class="line">&gt;     Some content.</div><div class="line">&gt; &#123;% else if &quot;foo&quot; in bar %&#125;</div><div class="line">&gt;     Content if the array `bar` has &quot;foo&quot; in it.</div><div class="line">&gt; &#123;% else %&#125;</div><div class="line">&gt;     Fallback content.</div><div class="line">&gt; &#123;% endif %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p><strong>autoescape</strong>
改变当前变量的自动转义行为</p>
<blockquote>
<p>参数：
on:
当前内容是否转义
type:
转义类型，js 或者 html，默认 html</p>
</blockquote>
<p>假设</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">&gt; some_html_output = &apos;&lt;p&gt;Hello &quot;you&quot; &amp; \&apos;them\&apos;&lt;/p&gt;&apos;;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>然后</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% autoescape false %&#125;</div><div class="line">&gt;     &#123;&#123; some_html_output &#125;&#125;</div><div class="line">&gt; &#123;% endautoescape %&#125;</div><div class="line">&gt;</div><div class="line">&gt; &#123;% autoescape true %&#125;</div><div class="line">&gt;     &#123;&#123; some_html_output &#125;&#125;</div><div class="line">&gt; &#123;% endautoescape %&#125;</div><div class="line">&gt;</div><div class="line">&gt; &#123;% autoescape true &quot;js&quot; %&#125;</div><div class="line">&gt;     &#123;&#123; some_html_output &#125;&#125;</div><div class="line">&gt; &#123;% endautoescape %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>将会输出</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">&gt; &lt;p&gt;Hello &quot;you&quot; &amp; &apos;them&apos;&lt;/p&gt;</div><div class="line">&gt;</div><div class="line">&gt; &amp;lt;p&amp;gt;Hello &amp;quot;you&amp;quot; &amp;amp; &amp;#39;them&amp;#39; &amp;lt;/p&amp;gt;</div><div class="line">&gt;</div><div class="line">&gt; \u003Cp\u003EHello \u0022you\u0022 &amp; \u0027them\u0027\u003C\u005Cp\u003E</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p><strong>set</strong>
设置一个变量，在当前上下文中复用</p>
<blockquote>
<p>参数：
name:
变量名
=:
语法标记
value:
变量值</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% set foo = [0, 1, 2, 3, 4, 5] %&#125;</div><div class="line">&gt; &#123;% for num in foo %&#125;</div><div class="line">&gt;     &lt;li&gt;&#123;&#123; num &#125;&#125;&lt;/li&gt;</div><div class="line">&gt; &#123;% endfor %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p><strong>macro</strong>
创建自定义可服用的代码段</p>
<blockquote>
<p>参数：
…:
用户定义</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% macro input type name id label value error %&#125;</div><div class="line">&gt; &lt;label for=&quot;&#123;&#123; name &#125;&#125;&quot;&gt;&#123;&#123; label &#125;&#125;&lt;/label&gt;</div><div class="line">&gt; &lt;input type=&quot;&#123;&#123; type &#125;&#125;&quot; name=&quot;&#123;&#123; name &#125;&#125;&quot; id=&quot;&#123;&#123; id &#125;&#125;&quot; value=&quot;&#123;&#123; value &#125;&#125;&quot;&#123;% if error %&#125; class=&quot;error&quot;&#123;% endif %&#125;&gt;</div><div class="line">&gt; &#123;% endmacro %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>然后像下面使用</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">&gt; &lt;div&gt;&#123;&#123; input(&quot;text&quot;, &quot;fname&quot;, &quot;fname&quot;, &quot;First Name&quot;, fname.value, fname.errors) &#125;&#125;&lt;/div&gt;</div><div class="line">&gt; &lt;div&gt;&#123;&#123; input(&quot;text&quot;, &quot;lname&quot;, &quot;lname&quot;, &quot;Last Name&quot;, lname.value, lname.errors) &#125;&#125;&lt;/div&gt;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>输出如下</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">&gt; &lt;div&gt;</div><div class="line">&gt;     &lt;label for=&quot;fname&quot;&gt;First Name&lt;/label&gt;</div><div class="line">&gt;     &lt;input type=&quot;text&quot; name=&quot;fname&quot; id=&quot;fname&quot; value=&quot;Paul&quot;&gt;</div><div class="line">&gt; &lt;/div&gt;</div><div class="line">&gt; &lt;div&gt;</div><div class="line">&gt;     &lt;label for=&quot;lname&quot;&gt;Last Name&lt;/label&gt;</div><div class="line">&gt;     &lt;input type=&quot;text&quot; name=&quot;lname&quot; id=&quot;lname&quot; value=&quot;&quot; class=&quot;error&quot;&gt;</div><div class="line">&gt; &lt;/div&gt;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p><strong>import</strong>
允许引入另一个模板的宏进入当前上下文</p>
<blockquote>
<p>参数：
file:
引入模板相对模板 root 的相对路径
as:
语法标记 var: 分配给宏的可访问上下文对象</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% import &apos;formmacros.html&apos; as form %&#125;</div><div class="line">&gt;</div><div class="line">&gt; &#123;# this will run the input macro #&#125;</div><div class="line">&gt; &#123;&#123; form.input(&quot;text&quot;, &quot;name&quot;) &#125;&#125;</div><div class="line">&gt;</div><div class="line">&gt; &#123;# this, however, will NOT output anything because the macro is scoped to the &quot;form&quot; object: #&#125;</div><div class="line">&gt; &#123;&#123; input(&quot;text&quot;, &quot;name&quot;) &#125;&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p><strong>filter</strong>
对整个块应用过滤器</p>
<blockquote>
<p>参数：
filter_name:
过滤器名字 … :
若干传给过滤器的参数 父模板相对模板 root 的相对路径</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% filter uppercase %&#125;oh hi, &#123;&#123; name &#125;&#125;&#123;% endfilter %&#125;</div><div class="line">&gt; &#123;% filter replace &quot;.&quot; &quot;!&quot; &quot;g&quot; %&#125;Hi. My name is Paul.&#123;% endfilter %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>输出</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">&gt; OH HI, PAUL</div><div class="line">&gt; Hi! My name is Paul!</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p><strong>spaceless</strong>
尝试移除html标签间的空格</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">&gt; &#123;% spaceless %&#125;</div><div class="line">&gt; &#123;% for num in foo %&#125;</div><div class="line">&gt;     &lt;li&gt;&#123;&#123; loop.index &#125;&#125;&lt;/li&gt;</div><div class="line">&gt; &#123;% endfor %&#125;</div><div class="line">&gt; &#123;% endspaceless %&#125;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>输出</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">&gt; &lt;li&gt;1&lt;/li&gt;&lt;li&gt;2&lt;/li&gt;&lt;li&gt;3&lt;/li&gt;</div><div class="line">&gt;</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>** 不满足于此吗？想知道详细资料的请您移步<a href="https://github.com/paularmstrong/swig" target="_blank" rel="external">Github</a>。</p>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/技术分享/2017/02/27/swig模版快速入门.html">http://lucylc.com/技术分享/2017/02/27/swig模版快速入门.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;Swig官网文档经常404打不开，网上Swig模版在前端的中文资料非常少，这里也是&lt;/p&gt;
&lt;p&gt;摘录网上的一部分资料，乐于分享的朋友可以留言哦。不过对于想要修改&lt;/p&gt;
&lt;p&gt;Hexo-Next博客的朋友，相信看了这篇文章的朋友能够大概知道使用技巧。&lt;/p&gt;
&lt;p&gt;后续我也会整理一下Swig模版的基本资料。&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="技术分享" scheme="http://lucylc.com/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    
    
      <category term="Swig" scheme="http://lucylc.com/tags/Swig/"/>
    
  </entry>
  
  <entry>
    <title>勿忘初心</title>
    <link href="http://lucylc.com/Mood-Diary/2017/02/24/%E5%8B%BF%E5%BF%98%E5%88%9D%E5%BF%83.html"/>
    <id>http://lucylc.com/Mood-Diary/2017/02/24/勿忘初心.html</id>
    <published>2017-02-24T08:31:31.000Z</published>
    <updated>2017-08-20T10:15:40.968Z</updated>
    
    <content type="html"><![CDATA[<p><img src="http://img.mp.itc.cn/upload/20160824/c17d8c6dab2145b1b4a43a4610d1b30b_th.jpg" alt=""></p>
<p>　　闲了就会思索，思索就会感慨，有很多人感到失落，感慨没有好好珍惜自己的生命。 一辈子很长，随着时间的流逝，过往的历练让我们变得成熟和精明，成熟的你会感到以前很是幼稚，看透了世俗，想穿了一切，于是，我们就此变成了自己年少时所最憎恶的那种人。一辈子仿若又很短，所有的委屈、愤懑都是浮云，要保持那份初心确实着实不易。</p>
<a id="more"></a>
<p>　　万事万物都有它存在的方式，我们能做的就是勿忘初心，只有寄浮于天地，坚持本真的善良和最初的梦想，学会尊重他人和自己的初心，处理好和社会的关系，才会不枉此生。</p>
<p>　　有人说：“只有在轻狂少年时才敢妄谈梦想，不计一切的去实现它，只因我们输得起，无所牵挂，一旦年华老去，变得心有挂碍后，便再无法前进一步。”还有人说：“人生就是在自己走的路上，慢慢地让自己开始变老。”我不赞成这样的消极观点，这样对自己不负责，活着也将若枯木，我们实现不了梦想，只因我们忘却了初心；选择去忘记这最初的梦想，是惧怕于现实太过残酷，将之付诸实现的代价太大。 哪怕此时此刻我们还是无法踏上征途，那么至少在红尘中，我们的初心还好好地在心中珍藏，不让它因岁月的冲刷而斑驳失色；静静的等到时机到来的那一刻，带上我们的梦想出发，一如当初的少年。勿忘初心，方得终始，不忘记自己最初的想法，才能有始有终地去完成自己的梦想。</p>
<p>　　每个人或大或小总有梦想，追梦的路上怎能不磕磕绊绊，追 梦的路上又岂会一帆风顺？那些想去的地方，未完成的事，即使天寒地冻，山高路远，也请勿忘初心，你要遵守的是你的心，你心中那份不朽的热爱，那份坚定不移的自我本真之美，始终如一，不抛弃，不放弃，总有一天你会看到心中的那份光亮！只要努力，我们就能一步步确实的接近我们的梦。不管我们的梦要在何时结束，只要我们还能去心无挂碍地寻梦，就要一往无前的进发。哪怕等到年华老去，被世俗枷锁而无力寻梦，我们也依旧未能成功；至少我们还留下了一份值得在人生的秋季里回味与自豪的记忆。</p>
<p>　　勿忘初心，方得终始，发自内心的感觉，是判断事物的可靠的证据，而真正的善良就是尊重自己的那份原始的感受。要知道心若改变，性格就会随着改变;性格改变，人生亦跟着改变。更多的时候我们能做的就是时刻提醒自己勿忘初心，想想当时是怎样的心境想要坚持，在没有走到最后的最后时说丢掉了最初的那颗心时，请扪心自问是否真的有去坚持过，有去尽力争取过……</p>
<p>　　行百里者，应以九十为半，此即末路艰难之谓。改掉初心，而堕入庸俗道者，十有八九，勉励你我，勿忘初心。 那颗最初的心，不应该迫于时间和环境来改变，正视自我的真实感受，时刻警醒自己勿忘初心。</p>
<p><a href="//www.sanwen.net/subject/3609363/">源于散文网</a></p>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/Mood-Diary/2017/02/24/勿忘初心.html">http://lucylc.com/Mood-Diary/2017/02/24/勿忘初心.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;img src=&quot;http://img.mp.itc.cn/upload/20160824/c17d8c6dab2145b1b4a43a4610d1b30b_th.jpg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;　　闲了就会思索，思索就会感慨，有很多人感到失落，感慨没有好好珍惜自己的生命。 一辈子很长，随着时间的流逝，过往的历练让我们变得成熟和精明，成熟的你会感到以前很是幼稚，看透了世俗，想穿了一切，于是，我们就此变成了自己年少时所最憎恶的那种人。一辈子仿若又很短，所有的委屈、愤懑都是浮云，要保持那份初心确实着实不易。&lt;/p&gt;
    
    </summary>
    
      <category term="Mood Diary" scheme="http://lucylc.com/categories/Mood-Diary/"/>
    
    
      <category term="Mood Diary" scheme="http://lucylc.com/tags/Mood-Diary/"/>
    
  </entry>
  
  <entry>
    <title>前端面试题汇总3</title>
    <link href="http://lucylc.com/InterView/2017/02/24/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98%E6%B1%87%E6%80%BB3.html"/>
    <id>http://lucylc.com/InterView/2017/02/24/前端面试题汇总3.html</id>
    <published>2017-02-24T02:10:24.000Z</published>
    <updated>2017-08-20T10:15:40.967Z</updated>
    
    <content type="html"><![CDATA[<a id="more"></a>
<h3 id="HTML面试题"><a href="#HTML面试题" class="headerlink" title="HTML面试题"></a>HTML面试题</h3><p>1.XHTML和HTML有什么区别</p>
<blockquote>
<ul>
<li>HTML是一种基本的WEB网页设计语言，XHTML是一个基于XML的置标语言
最主要的不同：</li>
</ul>
<ul>
<li>XHTML 元素必须被正确地嵌套。</li>
</ul>
<ul>
<li>XHTML 元素必须被关闭。</li>
</ul>
<ul>
<li>标签名必须用小写字母。</li>
</ul>
<ul>
<li>XHTML 文档必须拥有根元素。</li>
</ul>
</blockquote>
<p>2.前端页面有哪三层构成，分别是什么?作用是什么?</p>
<blockquote>
<ul>
<li>结构层 Html 表示层 CSS 行为层 js;</li>
</ul>
</blockquote>
<p>3.你做的页面在哪些流览器测试过?这些浏览器的内核分别是什么?</p>
<blockquote>
<ul>
<li>Ie(Ie内核) 火狐（Gecko） 谷歌（webkit,Blink） opera(Presto),Safari(wbkit)</li>
</ul>
</blockquote>
<p>4.什么是语义化的HTML?</p>
<blockquote>
<ul>
<li>直观的认识标签 对于搜索引擎的抓取有好处，用正确的标签做正确的事情！</li>
</ul>
<ul>
<li>html语义化就是让页面的内容结构化，便于对浏览器、搜索引擎解析；
在没有样式CCS情况下也以一种文档格式显示，并且是容易阅读的。搜索引擎的爬虫依赖于标记来确定上下文和各个关键字的权重，利于 SEO。</li>
</ul>
<ul>
<li>使阅读源代码的人对网站更容易将网站分块，便于阅读维护理解。</li>
</ul>
</blockquote>
<p>5.HTML5 为什么只需要写 !DOCTYPE HTML？</p>
<blockquote>
<ul>
<li>HTML5 不基于 SGML，因此不需要对DTD进行引用，但是需要doctype来规范浏览器的行为（让浏览器按照它们应该的方式来运行）；而HTML4.01基于SGML,所以需要对DTD进行引用，才能告知浏览器文档所使用的文档类型。</li>
</ul>
</blockquote>
<p>6.Doctype作用？标准模式与兼容模式各有什么区别?</p>
<blockquote>
<ul>
<li>!DOCTYPE声明位于位于HTML文档中的第一行，处于html 标签之前。告知浏览器的解析器用什么文档标准解析这个文档。DOCTYPE不存在或格式不正确会导致文档以兼容模式呈现。</li>
</ul>
<ul>
<li>标准模式的排版 和JS运作模式都是以该浏览器支持的最高标准运行。在兼容模式中，页面以宽松的向后兼容的方式显示,模拟老式浏览器的行为以防止站点无法工作。</li>
</ul>
</blockquote>
<p>7.html5有哪些新特性、移除了那些元素？如何处理HTML5新标签的浏览器兼容问题？如何区分 HTML 和
HTML5？</p>
<blockquote>
<ul>
<li>HTML5 现在已经不是 SGML 的子集，主要是关于图像，位置，存储，多任务等功能的增加。</li>
</ul>
<ul>
<li>绘画 canvas</li>
</ul>
<ul>
<li>用于媒介回放的 video 和 audio 元素</li>
</ul>
<ul>
<li>本地离线存储 localStorage 长期存储数据，浏览器关闭后数据不丢失；</li>
</ul>
<ul>
<li>sessionStorage 的数据在浏览器关闭后自动删除</li>
</ul>
<ul>
<li>语意化更好的内容元素，比如 article、footer、header、nav、section</li>
</ul>
<ul>
<li>表单控件，calendar、date、time、email、url、search</li>
</ul>
<ul>
<li>新的技术webworker, websockt, Geolocation
移除的元素</li>
</ul>
<ul>
<li>纯表现的元素：basefont，big，center，font, s，strike，tt，u；</li>
</ul>
<ul>
<li>对可用性产生负面影响的元素：frame，frameset，noframes；
支持HTML5新标签：</li>
</ul>
<ul>
<li>IE8/IE7/IE6支持通过document.createElement方法产生的标签，</li>
</ul>
<ul>
<li>可以利用这一特性让这些浏览器支持HTML5新标签，</li>
</ul>
<ul>
<li>浏览器支持新标签后，还需要添加标签默认的样式：</li>
</ul>
</blockquote>
<p>8.请描述一下 cookies，sessionStorage 和 localStorage 的区别？</p>
<blockquote>
<ul>
<li>cookie在浏览器和服务器间来回传递。 sessionStorage和localStorage不会</li>
</ul>
<ul>
<li>sessionStorage和localStorage的存储空间更大；</li>
</ul>
<ul>
<li>sessionStorage和localStorage有更多丰富易用的接口；</li>
</ul>
<ul>
<li>sessionStorage和localStorage各自独立的存储空间；</li>
</ul>
</blockquote>
<p>9.如何实现浏览器内多个标签页之间的通信?</p>
<blockquote>
<ul>
<li>调用localstorge、cookies等本地存储方式</li>
</ul>
</blockquote>
<h3 id="CSS面试题"><a href="#CSS面试题" class="headerlink" title="CSS面试题"></a>CSS面试题</h3><p>1.简要说一下CSS的元素分类</p>
<blockquote>
<ul>
<li>块级元素：div,p,h1,form,ul,li;</li>
</ul>
<ul>
<li>行内元素 : span&gt;,a,label,input,img,strong,em;</li>
</ul>
</blockquote>
<p>2.CSS隐藏元素的几种方法（至少说出三种）</p>
<blockquote>
<ul>
<li>Opacity:元素本身依然占据它自己的位置并对网页的布局起作用。它也将响应用户交互;</li>
</ul>
<ul>
<li>Visibility:与 opacity 唯一不同的是它不会响应任何用户交互。此外，元素在读屏软件中也会被隐藏;</li>
</ul>
<ul>
<li>Display:display 设为 none 任何对该元素直接打用户交互操作都不可能生效。此外，读屏软件也不会读到元素的内容。这种方式产生的效果就像元素完全不存在;</li>
</ul>
<ul>
<li>Position:不会影响布局，能让元素保持可以操作;</li>
</ul>
<ul>
<li>Clip-path:clip-path 属性还没有在 IE 或者 Edge 下被完全支持。如果要在你的 clip-path 中使用外部的 SVG 文件，浏览器支持度还要低;</li>
</ul>
</blockquote>
<p>3.CSS清楚浮动的几种方法（至少两种）</p>
<blockquote>
<ul>
<li>使用带clear属性的空元素</li>
</ul>
<ul>
<li>使用CSS的overflow属性；</li>
</ul>
<ul>
<li>使用CSS的:after伪元素；</li>
</ul>
<ul>
<li>使用邻接元素处理；</li>
</ul>
</blockquote>
<p>4.CSS居中（包括水平居中和垂直居中）</p>
<blockquote>
<h4 id="内联元素居中方案"><a href="#内联元素居中方案" class="headerlink" title="内联元素居中方案"></a>内联元素居中方案</h4><p><strong>水平居中设置：</strong>
1.行内元素</p>
<ul>
<li>设置 text-align:center；</li>
</ul>
<p>2.Flex布局</p>
<ul>
<li>设置display:flex;justify-content:center;(灵活运用,支持Chroime，Firefox，IE9+)</li>
</ul>
<p><strong>垂直居中设置：</strong>
1.父元素高度确定的单行文本（内联元素）</p>
<ul>
<li>设置 height = line-height；</li>
</ul>
<p>2.父元素高度确定的多行文本（内联元素）</p>
<ul>
<li>a:插入 table （插入方法和水平居中一样），然后设置 vertical-align:middle；</li>
</ul>
<ul>
<li>b:先设置 display:table-cell 再设置 vertical-align:middle；</li>
</ul>
<h4 id="块级元素居中方案"><a href="#块级元素居中方案" class="headerlink" title="块级元素居中方案"></a>块级元素居中方案</h4><p><strong>水平居中设置：</strong>
1.定宽块状元素</p>
<ul>
<li>设置 左右 margin 值为 auto；</li>
</ul>
<p>2.不定宽块状元素</p>
<ul>
<li>a:在元素外加入 table 标签（完整的，包括 table、tbody、tr、td），该元素写在 td 内，然后设置 margin 的值为 auto；</li>
</ul>
<ul>
<li>b:给该元素设置 displa:inine 方法；</li>
</ul>
<ul>
<li>c:父元素设置 position:relative 和 left:50%，子元素设置 position:relative 和 left:50%；</li>
</ul>
<p><strong>垂直居中设置：</strong></p>
<ul>
<li>使用position:absolute（fixed）,设置left、top、margin-left、margin-top的属性;</li>
</ul>
<ul>
<li>利用position:fixed（absolute）属性，margin:auto这个必须不要忘记了;</li>
</ul>
<ul>
<li>利用display:table-cell属性使内容垂直居中;</li>
</ul>
<ul>
<li>使用css3的新属性transform:translate(x,y)属性;</li>
</ul>
<ul>
<li>使用:before元素;</li>
</ul>
</blockquote>
<p>5.写出几种IE6 BUG的解决方法</p>
<blockquote>
<ul>
<li>双边距BUG float引起的 使用display</li>
</ul>
<ul>
<li>3像素问题 使用float引起的 使用dislpay:inline -3px</li>
</ul>
<ul>
<li>超链接hover 点击后失效 使用正确的书写顺序 link visited hover active</li>
</ul>
<ul>
<li>Ie z-index问题 给父级添加position:relative</li>
</ul>
<ul>
<li>Png 透明 使用js代码 改</li>
</ul>
<ul>
<li>Min-height 最小高度 ！Important 解决’</li>
</ul>
<ul>
<li>select 在ie6下遮盖 使用iframe嵌套</li>
</ul>
<ul>
<li>为什么没有办法定义1px左右的宽度容器（IE6默认的行高造成的，使用over:hidden,zoom:0.08 line-height:1px）</li>
</ul>
</blockquote>
<p>6.对于SASS或是Less的了解程度？喜欢那个？</p>
<blockquote>
<ul>
<li>语法介绍</li>
</ul>
</blockquote>
<p>7.Bootstrap了解程度</p>
<blockquote>
<ul>
<li>特点，排版，插件的使用;</li>
</ul>
</blockquote>
<p>8.页面导入样式时，使用link和@import有什么区别？</p>
<blockquote>
<ul>
<li>link属于XHTML标签，除了加载CSS外，还能用于定义RSS, 定义rel连接属性等作用；而@import是CSS提供的，只能用于加载CSS;</li>
</ul>
<ul>
<li>页面被加载的时，link会同时被加载，而@import引用的CSS会等到页面被加载完再加载;</li>
</ul>
<ul>
<li>import是CSS2.1 提出的，只在IE5以上才能被识别，而link是XHTML标签，无兼容问题;</li>
</ul>
</blockquote>
<p>9.介绍一下CSS的盒子模型？</p>
<blockquote>
<ul>
<li>有两种， IE 盒子模型、标准 W3C 盒子模型；IE的content部分包含了 border 和 pading;</li>
</ul>
<ul>
<li>盒模型： 内容(content)、填充(padding)、边界(margin)、 边框(border).</li>
</ul>
</blockquote>
<p>10.CSS 选择符有哪些？哪些属性可以继承？优先级算法如何计算？ CSS3新增伪类有那些？</p>
<blockquote>
<ul>
<li>id选择器（ # myid）</li>
</ul>
<ul>
<li>类选择器（.myclassname）</li>
</ul>
<ul>
<li>标签选择器（div, h1, p）</li>
</ul>
<ul>
<li>相邻选择器（h1 + p）</li>
</ul>
<ul>
<li>子选择器（ul &gt; li）</li>
</ul>
<ul>
<li>后代选择器（li a）</li>
</ul>
<ul>
<li>通配符选择器（ * ）</li>
</ul>
<ul>
<li>属性选择器（a[rel = “external”]）</li>
</ul>
<ul>
<li>伪类选择器（a: hover, li: nth - child）</li>
</ul>
<ul>
<li>可继承的样式： font-size font-family color, UL LI DL DD DT;</li>
</ul>
<ul>
<li>不可继承的样式：border padding margin width height ;</li>
</ul>
<ul>
<li>优先级就近原则，同权重情况下样式定义最近者为准;</li>
</ul>
<ul>
<li>优先级为:
!important &gt; id &gt; class &gt; tag
important 比 内联优先级高</li>
</ul>
</blockquote>
<p>11.CSS3有哪些新特性？</p>
<blockquote>
<ul>
<li>CSS3实现圆角（border-radius:8px），阴影（box-shadow:10px），
对文字加特效（text-shadow、），线性渐变（gradient），旋转（transform）</li>
</ul>
<ul>
<li>transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜
增加了更多的CSS选择器 多背景 rgba</li>
</ul>
</blockquote>
<h3 id="JavaScript面试题"><a href="#JavaScript面试题" class="headerlink" title="JavaScript面试题"></a>JavaScript面试题</h3><p>1.javascript的typeof返回哪些数据类型</p>
<blockquote>
<ul>
<li>Ｏbject number function boolean underfind;</li>
</ul>
</blockquote>
<p>2.例举3种强制类型转换和2种隐式类型转换?</p>
<blockquote>
<ul>
<li>强制（parseInt,parseFloat,number）隐式（== – ===）；</li>
</ul>
</blockquote>
<p>3.数组方法pop() push() unshift() shift()</p>
<blockquote>
<ul>
<li>Push()尾部添加 pop()尾部删除</li>
</ul>
<ul>
<li>Unshift()头部添加 shift()头部删除</li>
</ul>
</blockquote>
<p>4.ajax请求的时候get 和post方式的区别?</p>
<blockquote>
<ul>
<li>一个在url后面 一个放在虚拟载体里面
有大小限制</li>
</ul>
<ul>
<li>安全问题
应用不同 一个是论坛等只需要请求的，一个是类似修改密码的;</li>
</ul>
</blockquote>
<p>5.call和apply的区别</p>
<blockquote>
<ul>
<li>Object.call(this,obj1,obj2,obj3)</li>
</ul>
<ul>
<li>Object.apply(this,arguments)</li>
</ul>
</blockquote>
<p>6.ajax请求时，如何解释json数据</p>
<blockquote>
<ul>
<li>使用eval parse,鉴于安全性考虑 使用parse更靠谱;</li>
</ul>
</blockquote>
<p>7.事件委托是什么</p>
<blockquote>
<ul>
<li>让利用事件冒泡的原理，让自己的所触发的事件，让他的父元素代替执行！</li>
</ul>
</blockquote>
<p>8.闭包是什么，有什么特性，对页面有什么影响?简要介绍你理解的闭包</p>
<blockquote>
<ul>
<li>闭包就是能够读取其他函数内部变量的函数。</li>
</ul>
</blockquote>
<p>9.添加 删除 替换 插入到某个接点的方法</p>
<blockquote>
<p>obj.appendChidl()
obj.innersetBefore
obj.replaceChild
obj.removeChild</p>
</blockquote>
<p>10.说一下什么是javascript的同源策略？</p>
<blockquote>
<ul>
<li>一段脚本只能读取来自于同一来源的窗口和文档的属性，这里的同一来源指的是主机名、协议和端口号的组合</li>
</ul>
</blockquote>
<p>11.编写一个b继承a的方法;</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">function A(name)&#123;</div><div class="line">    this.name = name;</div><div class="line">    this.sayHello = function()&#123;alert(this.name+” say Hello!”);&#125;;</div><div class="line">&#125;</div><div class="line">function B(name,id)&#123;</div><div class="line">    this.temp = A;</div><div class="line">    this.temp(name);        //相当于new A();</div><div class="line">    delete this.temp;</div><div class="line">     this.id = id;</div><div class="line">    this.checkId = function(ID)&#123;alert(this.id==ID)&#125;;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>12.如何阻止事件冒泡和默认事件</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">function stopBubble(e)</div><div class="line">&#123;</div><div class="line">   if (e &amp;&amp; e.stopPropagation)</div><div class="line">       e.stopPropagation()</div><div class="line">   else</div><div class="line">       window.event.cancelBubble=true</div><div class="line">&#125;</div><div class="line">return false</div></pre></td></tr></table></figure>
<p>13.下面程序执行后弹出什么样的结果?</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">function fn() &#123;</div><div class="line">    this.a = 0;</div><div class="line">    this.b = function() &#123;</div><div class="line">        alert(this.a)</div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line">fn.prototype = &#123;</div><div class="line">    b: function() &#123;</div><div class="line">        this.a = 20;</div><div class="line">        alert(this.a);</div><div class="line">    &#125;,</div><div class="line">    c: function() &#123;</div><div class="line">        this.a = 30;</div><div class="line">        alert(this.a);</div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line">var myfn = new fn();</div><div class="line">myfn.b();</div><div class="line">myfn.c();</div></pre></td></tr></table></figure>
<p>14.谈谈This对象的理解。</p>
<blockquote>
<p>this是js的一个关键字，随着函数使用场合不同，this的值会发生变化。
但是有一个总原则，那就是this指的是调用函数的那个对象。
this一般情况下：是全局对象Global。 作为方法调用，那么this就是指这个对象</p>
</blockquote>
<p>15.下面程序的结果</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">function fun(n,o) &#123;</div><div class="line">  console.log(o)</div><div class="line">  return &#123;</div><div class="line">    fun:function(m)&#123;</div><div class="line">      return fun(m,n);</div><div class="line">    &#125;</div><div class="line">  &#125;;</div><div class="line">&#125;</div><div class="line">var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);</div><div class="line">var b = fun(0).fun(1).fun(2).fun(3);</div><div class="line">var c = fun(0).fun(1);  c.fun(2);  c.fun(3);</div></pre></td></tr></table></figure>
<blockquote>
<p>//答案：
//a: undefined,0,0,0
//b: undefined,0,1,2
//c: undefined,0,1,1</p>
</blockquote>
<p>16.下面程序的输出结果</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">var name = &apos;World!&apos;;</div><div class="line">(function () &#123;</div><div class="line">    if (typeof name === &apos;undefined&apos;) &#123;</div><div class="line">        var name = &apos;Jack&apos;;</div><div class="line">        console.log(&apos;Goodbye &apos; + name);</div><div class="line">    &#125; else &#123;</div><div class="line">        console.log(&apos;Hello &apos; + name);</div><div class="line">    &#125;</div><div class="line">&#125;)();</div></pre></td></tr></table></figure>
<p>17.了解Node么？Node的使用场景都有哪些？</p>
<blockquote>
<ul>
<li>高并发、聊天、实时消息推送</li>
</ul>
</blockquote>
<p>18.介绍下你最常用的一款框架</p>
<blockquote>
<ul>
<li>jquery,rn,angular等;</li>
</ul>
</blockquote>
<p>19.对于前端自动化构建工具有了解吗？简单介绍一下</p>
<blockquote>
<ul>
<li>Gulp,Grunt等；</li>
</ul>
</blockquote>
<p>20.介绍一下你了解的后端语言以及掌握程度</p>
<h3 id="其它"><a href="#其它" class="headerlink" title="其它"></a>其它</h3><p>1.对Node的优点和缺点提出了自己的看法？</p>
<blockquote>
<p>(优点）</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">&gt;  因为Node是基于事件驱动和无阻塞的，所以非常适合处理并发请求，</div><div class="line">&gt;  因此构建在Node上的代理服务器相比其他技术实现（如Ruby）的服务器表现要好得多。</div><div class="line">&gt; 此外，与Node代理服务器交互的客户端代码是由javascript语言编写的，</div><div class="line">&gt; 因此客户端和服务器端都用同一种语言编写，这是非常美妙的事情。</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>&gt;</p>
<blockquote>
<p>（缺点）</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">&gt;  Node是一个相对新的开源项目，所以不太稳定，它总是一直在变，</div><div class="line">&gt; 而且缺少足够多的第三方库支持。看起来，就像是Ruby/Rails当年的样子。</div><div class="line">&gt;</div></pre></td></tr></table></figure>
</blockquote>
<p>2.你有哪些性能优化的方法？</p>
<blockquote>
<p>（1） 减少http请求次数：CSS Sprites, JS、CSS源码压缩、图片大小控制合适；网页Gzip，CDN托管，data缓存 ，图片服务器。
（2）前端模板 JS+数据，减少由于HTML标签导致的带宽浪费，前端用变量保存AJAX请求结果，每次操作本地变量，不用请求，减少请求次数
（3） 用innerHTML代替DOM操作，减少DOM操作次数，优化javascript性能。
（4） 当需要设置的样式很多时设置className而不是直接操作style。
（5） 少用全局变量、缓存DOM节点查找的结果。减少IO读取操作。
（6） 避免使用CSS Expression（css表达式)又称Dynamic properties(动态属性)。
（7） 图片预加载，将样式表放在顶部，将脚本放在底部 加上时间戳。
（8） 避免在页面的主体布局中使用table，table要等其中的内容完全下载之后才会显示出来，显示div+css布局慢。对普通的网站有一个统一的思路，就是尽量向前端优化、减少数据库操作、减少磁盘IO。向前端优化指的是，在不影响功能和体验的情况下，能在浏览器执行的不要在服务端执行，能在缓存服务器上直接返回的不要到应用服务器，程序能直接取得的结果不要到外部取得，本机内能取得的数据不要到远程取，内存能取到的不要到磁盘取，缓存中有的不要去数据库查询。减少数据库操作指减少更新次数、缓存结果减少查询次数、将数据库执行的操作尽可能的让你的程序完成（例如join查询），减少磁盘IO指尽量不使用文件系统作为缓存、减少读写文件次数等。程序优化永远要优化慢的部分，换语言是无法“优化”的。</p>
</blockquote>
<p>3.http状态码有那些？分别代表是什么意思？</p>
<blockquote>
<p>100-199 用于指定客户端应相应的某些动作。
200-299 用于表示请求成功。
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。
400-499 用于指出客户端的错误。400 1、语义有误，当前请求无法被服务器理解。401 当前请求需要用户验证 403 服务器已经理解请求，但是拒绝执行它。
500-599 用于支持服务器错误。 503 – 服务不可用</p>
</blockquote>
<p>4.一个页面从输入 URL 到页面加载显示完成，这个过程中都发生了什么？（流程说的越详细越好）</p>
<blockquote>
<ul>
<li>查找浏览器缓存</li>
</ul>
<ul>
<li>DNS解析、查找该域名对应的IP地址、重定向（301）、发出第二个GET请求</li>
</ul>
<ul>
<li>进行HTTP协议会话</li>
</ul>
<ul>
<li>客户端发送报头(请求报头)</li>
</ul>
<ul>
<li>文档开始下载</li>
</ul>
<ul>
<li>文档树建立，根据标记请求所需指定MIME类型的文件</li>
</ul>
<ul>
<li>文件显示</li>
</ul>
<ul>
<li>浏览器这边做的工作大致分为以下几步：</li>
</ul>
<ul>
<li>加载：根据请求的URL进行域名解析，向服务器发起请求，接收文件（HTML、JS、CSS、图象等）。</li>
</ul>
<ul>
<li>解析：对加载到的资源（HTML、JS、CSS等）进行语法解析，建议相应的内部数据结构（比如HTML的DOM树，JS的（对象）属性表，CSS的样式规则等等）</li>
</ul>
</blockquote>
<p>5.你常用的开发工具是什么，为什么？</p>
<blockquote>
<ul>
<li>Sublime,Atom,Nodepad++;</li>
</ul>
</blockquote>
<p>6.说说最近最流行的一些东西吧？常去哪些网站？</p>
<blockquote>
<ul>
<li>Node.js、MVVM、React-native,Angular,Weex等</li>
</ul>
<ul>
<li>CSDN,Segmentfault,博客园,掘金,Stackoverflow等</li>
</ul>
</blockquote>
<p>7.介绍下你的项目（如果有的话）？并说一下在做这个项目中运用的技术以及遇到的难题是如何解决的</p>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/InterView/2017/02/24/前端面试题汇总3.html">http://lucylc.com/InterView/2017/02/24/前端面试题汇总3.html</a></p>
]]></content>
    
    <summary type="html">
    
      前端面试题汇，总持续更新中
    
    </summary>
    
      <category term="InterView" scheme="http://lucylc.com/categories/InterView/"/>
    
    
      <category term="InterView Question" scheme="http://lucylc.com/tags/InterView-Question/"/>
    
  </entry>
  
  <entry>
    <title>前端面试题汇总2</title>
    <link href="http://lucylc.com/InterView/2017/02/24/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98%E6%B1%87%E6%80%BB2.html"/>
    <id>http://lucylc.com/InterView/2017/02/24/前端面试题汇总2.html</id>
    <published>2017-02-24T02:08:53.000Z</published>
    <updated>2017-08-20T10:15:40.967Z</updated>
    
    <content type="html"><![CDATA[<a id="more"></a>
<h3 id="『HTML-amp-CSS基础』"><a href="#『HTML-amp-CSS基础』" class="headerlink" title="『HTML&amp;CSS基础』"></a>『HTML&amp;CSS基础』</h3><h4 id="【HTML】"><a href="#【HTML】" class="headerlink" title="【HTML】"></a>【HTML】</h4><ul>
<li><p><strong>行内元素</strong>
关注行内置换元素 类似inline-block方式展现 input textarea img select</p>
</li>
<li><p><strong>浏览器内核</strong>
基于Webkit：
Chrome - blink、腾讯X5、UC U3、华为T9
基于Gecko：Firefox
基于Trident：IE
基于Presto：Opera
兼备Webkit&amp;Trident：猎豹、360</p>
</li>
<li><p><strong>W3C标准</strong>
包括结构(xhtml,xml)、表现(css)、行为(ecmascript、dom)的标准。更好地规范浏览器对页面渲染，使得同一套网页方案尽可能在多套浏览器中表现一致。提高开发者开发效率和用户体验</p>
</li>
<li><p><strong>Doctype</strong>
用来告诉浏览器以什么文档类型解析html，没有的话，会按照向下兼容的怪异模式对文档进行解析
h4及以下需要引用dtd声明，dtd有标准型和过渡型两种。两者区别可忽略
h5不急于SGML标准，因此不需要引用dtd</p>
</li>
<li><p><strong>标签语义化的重要性</strong>
1.便于浏览器、搜索引擎解析
2.在没css情况也以一种文档形式展现，便于阅读
3.有利于SEO
4.有利于代码的阅读和维护</p>
</li>
<li><p><strong>strong与em的异同</strong>
同：都是对文本起强调作用
异：em以斜体显示文本，strong更利于SEO识别语义</p>
</li>
<li><p><strong>SEO</strong> <a href="https://segmentfault.com/a/1190000002549587" target="_blank" rel="external">详细</a>
可分为白帽SEO和黑帽SEO
SEO的主要方面：
1.网站标题、关键字、描述 (meta)
2.网站结构布局优化：目录层级不要太多，尽量让Spider跳转3次就可以到达网站的任意一个内页
3.网站代码优化：
SEO会过滤掉display none的元素、利用<code>&lt;meta description</code>和<code>&lt;meta keywords&gt;</code>、html语义化</p>
</li>
<li><p><strong>图片格式</strong>
png-8 256色、png-24、gif、apng(Chrome不支持)、svg、webp(ios不支持)</p>
</li>
<li><p><strong>link vs @import</strong>
区别：
1.link无兼容性缺点，@import仅兼容IE5+
2.link权重高于import
3.link外链的css与html是并行加载的，而import需等html加载完才加载</p>
</li>
</ul>
<h4 id="【CSS】"><a href="#【CSS】" class="headerlink" title="【CSS】"></a>【CSS】</h4><ul>
<li><p><strong>CSS盒模型</strong>
包括 margin padding border content
IE盒模型 (lt IE8)：content包含padding和border
如何改变：<code>box-sizing</code></p>
</li>
<li><p><strong>CSS可继承属性</strong>
与font有关的属性 如<code>font-size</code>、<code>font-family</code>、<code>font-weight</code>等
<code>line-height</code>、<code>color</code>、<code>text-align</code>、<code>text-indent</code>等</p>
</li>
<li><p><strong>BFC</strong>
不同的display会参与不同的环境(formatting context)去渲染，而block参与BFC
BFC特点
1.同个BFC内盒子产生margin塌陷
2.计算BFC的高度时，考虑BFC所包含的所有元素，连浮动元素也参与计算
3.BFC就是页面上的一个隔离的独立容器，里外互相不影响
产生新BFC
1.<code>float</code>属性不为<code>none</code>
2.<code>position</code>为<code>absolute</code>或<code>fixed</code>
3.<code>display</code>为<code>inline-block | table-cell | table-caption | flex | inline-flex</code>
4.<code>overflow</code>不为<code>visible</code></p>
</li>
<li><p><strong>清除浮动</strong>
1.形成新的BFC
2.新增div 设置<code>clear:both</code>
3.在父元素添加:after伪类，设置<code>content:&quot;&quot;;display:block;clear:both;zoom:1</code></p>
</li>
<li><p><strong>position</strong>
<code>absolute | relative | static | sticky | fixed</code></p>
</li>
</ul>
<hr>
<h3 id="『HTML5』"><a href="#『HTML5』" class="headerlink" title="『HTML5』"></a>『HTML5』</h3><h4 id="【新标签】"><a href="#【新标签】" class="headerlink" title="【新标签】"></a>【新标签】</h4><ul>
<li><p><strong>新增的标签</strong>
1.布局，内容 <code>&lt;header&gt; &lt;section&gt; &lt;nav&gt; &lt;article&gt; &lt;aside&gt; &lt;mark&gt; &lt;footer&gt;</code>
2.表单 <code>&lt;datalist&gt; &lt;keygen&gt; &lt;output&gt;</code>
3.媒体 <code>&lt;canvas&gt; &lt;video&gt; &lt;audio&gt; &lt;figure&gt; &lt;figcaption&gt; &lt;source&gt;</code>
4.状态 <code>&lt;progress&gt; &lt;meter&gt;</code>
5.冷门 <code>&lt;command&gt; &lt;details&gt; &lt;summary&gt;</code></p>
</li>
<li><p><strong>表单新类型</strong>
email url number tel search color DatePicker</p>
</li>
<li><p><strong>表单新属性</strong>
autocomplete autofocus require pattern placeholder multiple</p>
</li>
</ul>
<h4 id="【新API】"><a href="#【新API】" class="headerlink" title="【新API】"></a>【新API】</h4><ul>
<li><p><strong>交互</strong>
重力感应 DeviceOrientation
手机加速传感器 DeviceMotion</p>
</li>
<li><p><strong>history</strong> <a href="https://segmentfault.com/a/1190000002920768" target="_blank" rel="external">详细</a>
以Pjax方式实现SPA history.pushState history.replaceState 解决ajax不能后退前进问题</p>
</li>
<li><p><strong>储存</strong>
客户端储存：localStorage sessionStorage&gt;只存在一个会话周期内</p>
</li>
<li><p><strong>跨域</strong>
postMessage</p>
</li>
</ul>
<h4 id="【Web-app】"><a href="#【Web-app】" class="headerlink" title="【Web app】"></a>【Web app】</h4><ul>
<li><p><strong>常见dpr</strong>
ip6 2、ip6+ 3、nexus5 3</p>
</li>
<li><p><strong>移动端适配</strong>
1.自适应方式
2.viewport方式
3.rem方式
4.scale()方式缩放</p>
</li>
<li><p><strong>常用meta</strong>
<strong><em>IE相关</em></strong>
避免IE使用兼容模式 <code>&lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge&quot; /&gt;</code>
为不支持viewport的IE Mobile设定宽度 <code>&lt;meta name=&quot;MobileOptimized&quot; content=&quot;320&quot; /&gt;</code>
是否对手持设备友好 <code>&lt;meta name=&quot;HandheldFriendly&quot; content=&quot;true&quot; /&gt;</code>
<strong><em>UC浏览器</em></strong>
强制竖屏 <code>&lt;meta name=&quot;screen-orientation&quot; content=&quot;portrait&quot; /&gt;</code>
强制全屏 <code>&lt;meta name=&quot;full-screen&quot; content=&quot;yes&quot; /&gt;</code>
应用模式 <code>&lt;meta name=&quot;browsermode&quot; content=&quot;application&quot; /&gt;</code>
<strong><em>X5浏览器</em></strong>
强制竖屏 <code>&lt;meta name=&quot;x5-orientation&quot; content=&quot;portrait&quot; /&gt;</code>
强制全屏 <code>&lt;meta name=&quot;x5-fullscreen&quot; content=&quot;yes&quot; /&gt;</code>
应用模式 <code>&lt;meta name=&quot;x5-page-mode&quot; content=&quot;app&quot; /&gt;</code>
<strong><em>360</em></strong>
开启极速模式 <code>&lt;meta name=&quot;renderer&quot; content=&quot;webkit&quot; /&gt;</code></p>
</li>
<li><p><strong>iphone相关</strong>
启动webapp功能 删除工具栏和菜单栏 <code>&lt;meta name=&quot;apple-mobile-web-app-capable&quot; content=&quot;yes&quot;&gt;</code>
控制状态栏颜色 <code>&lt;meta name=&quot;apple-mobile-web-app-status-bar-style&quot; content=&quot;black&quot; /&gt;</code>
开启号码或邮箱检测 <code>&lt;meta name=&quot;format-detection&quot; content=&quot;telephone=no&quot; /&gt;</code>
添加主屏幕icon <code>&lt;link rel=&quot;apple-touch-icon&quot; href=&quot;touch-icon-iphone.png&quot;&gt;</code></p>
</li>
</ul>
<hr>
<h3 id="『CSS3』"><a href="#『CSS3』" class="headerlink" title="『CSS3』"></a>『CSS3』</h3><h4 id="【新属性】"><a href="#【新属性】" class="headerlink" title="【新属性】"></a>【新属性】</h4><p>flex、column、文本换行、媒体查询、待补充……</p>
<h4 id="开启GPU加速"><a href="#开启GPU加速" class="headerlink" title="开启GPU加速"></a>开启GPU加速</h4><p>注意启用<code>-webkit-backface-visibility:hidden;</code> <code>-webkit-perspective:1000;</code>解决启用<code>transform3d</code>页面闪烁和抖动问题</p>
<h4 id="【动画】"><a href="#【动画】" class="headerlink" title="【动画】"></a>【动画】</h4><ul>
<li><strong>CSS3动画性能</strong></li>
</ul>
<hr>
<h3 id="『Javascript』"><a href="#『Javascript』" class="headerlink" title="『Javascript』"></a>『Javascript』</h3><h4 id="【原生】"><a href="#【原生】" class="headerlink" title="【原生】"></a>【原生】</h4><ul>
<li><p><strong>js数据类型</strong>
5基本 string number boolean undefined null 储存在栈内存中
1复杂 object 储存在堆内存中</p>
</li>
<li><p><strong>this指向</strong>
this总是指向函数的直接调用者（而非间接调用者）</p>
</li>
<li><p><strong>null和undefined区别</strong>
null表示一个无的对象
undefined表示一个无的初始值。表示此处应该有值，但还没有定义，即缺少值</p>
</li>
<li><p><strong>new的具体作用</strong>
如<code>var p = new P();</code>
<code>var p = {}; //创建新对象</code>
<code>p.__proto__ = P.prototype; //继承构造函数的原型</code>
<code>P.call(p); //修改this指向</code></p>
</li>
<li><p><strong>创建对象方式</strong>
对象字面量、工厂模式、构造函数、原型模式、构造函数+原型</p>
</li>
<li><p><strong>原型 原型链</strong>
每个对象都有一个属性 prototype 当需要从对象中寻找属性时，如果在当前对象上没有找到就会从原型对象开始找 一直追溯到原型链的最顶端</p>
</li>
<li><p><strong>实现继承</strong>
1.构造函数继承 <a href="http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance.html" target="_blank" rel="external">详细</a></p>
<ul>
<li><p>利用call、apply修改this指向</p>
</li>
<li><p>让子元素原型指向父元素实例，注意要修改子元素prototype.constructor指向</p>
</li>
<li><p>将需继承的属性写在父元素的prototype上，让子元素prototype指向父元素prototype，但在修改子元素prototype.constructor指向时会同时修改父元素prototype.constructor</p>
</li>
<li><p>同上方法 利用中介函数</p>
</li>
</ul>
<p>2.非构造函数继承 <a href="http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_inheritance_continued.html" target="_blank" rel="external">详细</a>
把父对象的属性，全部拷贝给子对象</p>
</li>
<li><p><strong>浅拷贝vs深拷贝</strong>
浅拷贝
深拷贝 递归调用浅拷贝</p>
</li>
<li><p><strong>闭包</strong> <a href="http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html" target="_blank" rel="external">详细</a>
用途：读取函数内部变量。变量得不到销毁，一直储存在内存中，可能造成内存泄漏</p>
</li>
<li><p><strong>内存泄漏</strong>
指分配的内存既不能使用又得不到回收</p>
<ul>
<li><p>如为某元素绑定了一个事件，而该元素又从dom中移除</p>
</li>
<li><p>滥用闭包</p>
</li>
<li><p>两变量互相引用</p>
</li>
</ul>
</li>
<li><p><strong>原生Ajax实现过程</strong>
1.获取XMLHttpRequest对象
2.xhr.open(type,url,ifAsyn)
3.监听xhr状态改变，xhr.onreadystatechange = function(){} xhr.readyState==4&amp;&amp;xhr.status==200说明请求成功
【readyState：0=未初始化 1=启动 2=发送 3=接收 4=完成】
4.xhr.send()</p>
</li>
<li><p><strong>GET和POST区别</strong>
GET 安全性低 可传内容少 通过url传值
POST 安全性高 可传内容多 通过表单传值</p>
</li>
<li><p><strong>事件处理</strong> <a href="https://segmentfault.com/a/1190000002174034#articleHeader13" target="_blank" rel="external">详细</a></p>
<ul>
<li><p>事件委托
利用事件冒泡机制 将事件绑定在父元素上，节省性能</p>
</li>
<li><p>事件处理程序
DOM0 -&gt; DOM1 -&gt; DOM2 (对比与0，可同时绑定多个事件)</p>
</li>
<li><p>mouseover和mouseenter区别
mouseenter不冒泡</p>
</li>
</ul>
</li>
<li><p><strong>数组去重</strong>
hash方式和index方式</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">Array.prototype.unique = function()&#123;</div><div class="line">var n = [];</div><div class="line">for(var i=0,len=this.length;i&lt;len;i++)&#123;</div><div class="line">    if(n.indexOf(this[i])==-1) &#123;</div><div class="line">        n.push(this[i])</div><div class="line">    &#125;</div><div class="line">&#125;</div><div class="line">return n;</div><div class="line">&#125;</div><div class="line">Array.prototype.unique2 = function()&#123;</div><div class="line">    var n = &#123;&#125;,a =[];</div><div class="line">    for(var i=0,len=this.length;i&lt;len;i++)&#123;</div><div class="line">        if(!n[this[i]]) &#123;</div><div class="line">            a.push(this[i]);</div><div class="line">            n[this[i]] = true;</div><div class="line">        &#125;</div><div class="line">    &#125;</div><div class="line">    return a;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
</li>
<li><p><strong>ES5数组新方法</strong></p>
</li>
<li><p><strong>斐波纳挈数列高效递归</strong> <a href="http://blog.163.com/thinker_creator/blog/static/1019331492009824102458749/" target="_blank" rel="external">详细</a>
附斐波纳挈数列</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">function getNthFibonacci(count) &#123;</div><div class="line">    var fibonacci = [1,1];</div><div class="line">    for(var i=2;i&lt;=count;i++)&#123;</div><div class="line">        fibonacci[i] = fibonacci[i-1]+ fibonacci[i-2];</div><div class="line">    &#125;</div><div class="line">    return fibonacci[count];</div><div class="line">&#125;;</div><div class="line">var a = getNthFibonacci(5);</div><div class="line">console.log(a)</div></pre></td></tr></table></figure>
</li>
<li><p><strong>getComputedStyle和style区别</strong>
getC 只读 可获取未被style定义的样式
style 读写 只可获取含style的样式</p>
</li>
<li><p><strong>DOM</strong>
插入新节点
document:createElement()、createDocumentFragment()、createTextNode()
insertBefore(new,old)
获取节点
childNodes、parentNode、previousSibling、nextSibling、firstChild、lastChild、children
节点操作
appendChild、removeChild、replaceChild、cloneNode、normalize
获取位置</p>
<ul>
<li><p>浏览器宽高 window.innerWidth document.documentElement.clientWidth</p>
</li>
<li><p>文档宽高 document.documentElement.offsetHeight、 document.documentElement.scrollHeight</p>
</li>
<li><p>到文档的最端处距离 offsetTop、offsetLeft</p>
</li>
</ul>
</li>
<li><p><strong>BOM</strong>
浏览器内核 navigator.appVersion</p>
</li>
<li><p><strong>异步编程方法</strong>
1.回调函数，这是异步编程最基本的方法。
2.事件监听，另一种思路是采用事件驱动模式。任务的执行不取决于代码的顺序，而取决于某个事件是否发生。
3.发布/订阅，上一节的”事件”，完全可以理解成”信号”。
4.Promises对象，Promises 对象是CommonJS 工作组提出的一种规范，目的是为异步编程提供统一接口。</p>
</li>
</ul>
<h4 id="【jQuery】"><a href="#【jQuery】" class="headerlink" title="【jQuery】"></a>【jQuery】</h4><ul>
<li><p><strong>操作DOM</strong></p>
</li>
<li><p><strong>ajax</strong></p>
</li>
</ul>
<h4 id="【模块化】"><a href="#【模块化】" class="headerlink" title="【模块化】"></a>【模块化】</h4><h4 id="【MV-】详细"><a href="#【MV-】详细" class="headerlink" title="【MV*】详细"></a>【MV*】<a href="https://segmentfault.com/a/1190000003871577" target="_blank" rel="external">详细</a></h4><h4 id="【虚拟DOM】详细"><a href="#【虚拟DOM】详细" class="headerlink" title="【虚拟DOM】详细"></a>【虚拟DOM】<a href="https://segmentfault.com/a/1190000004029168" target="_blank" rel="external">详细</a></h4><p>以对象树的方式储存在内存中</p>
<hr>
<h3 id="『性能优化』"><a href="#『性能优化』" class="headerlink" title="『性能优化』"></a>『性能优化』</h3><ul>
<li><p>雅虎14条 <a href="http://www.cnblogs.com/silverLee/archive/2009/11/05/1596453.html" target="_blank" rel="external">详细</a></p>
</li>
<li><p>移动端优化</p>
</li>
<li><p>16毫秒的优化 <a href="http://velocity.oreilly.com.cn/2013/ppts/16_ms_optimization--web_front-end_performance_optimization.pdf" target="_blank" rel="external">详细</a></p>
<ol>
<li><p>google提出1s完成终端首屏渲染：网络消耗+js执行与页面渲染</p>
</li>
<li><p>浏览器渲染频率1s 60帧，确保每一帧能在16ms内执行与渲染，尽可能避免重排与重绘</p>
</li>
<li><p>使用RAF控制渲染频率，减少重复渲染，避免事件重复执行</p>
</li>
<li><p>让js操作读写分离</p>
</li>
</ol>
</li>
<li><p>渲染路径优化</p>
<ol>
<li><p>最小化关键资源数量</p>
</li>
<li><p>最小化关键资源字节</p>
</li>
<li><p>最小化关键路径长度</p>
</li>
</ol>
</li>
<li><p>页面直出 <a href="http://web.jobbole.com/86412/" target="_blank" rel="external">详细</a></p>
<ol>
<li><p>server上获取数据并将数据与页面模板结合，在服务端渲染成最终的 HTML</p>
</li>
<li><p>返回最终的 HTML 展示</p>
</li>
</ol>
</li>
</ul>
<hr>
<h3 id="『跨域与前端安全』"><a href="#『跨域与前端安全』" class="headerlink" title="『跨域与前端安全』"></a>『跨域与前端安全』</h3><ul>
<li><p>跨域的方式</p>
<ol>
<li><p>JSONP：强行执行不同域下的JS文件，需要外部JS配合。只能用GET方式</p>
</li>
<li><p>CORS：服务器端设置Access-Control-Allow-Origin，使其能被其他域使用AJAX访问到</p>
</li>
<li><p>domain+iframe：只适用主域相同子域不同的两个站。需要将两个站的document.domain设成同一个主域</p>
</li>
<li><p>window.postMessage(msg,targetOrgin)</p>
</li>
</ol>
</li>
<li><p>跨域攻击 <a href="https://segmentfault.com/a/1190000004623125" target="_blank" rel="external">详细</a></p>
<ol>
<li><p>跨域脚本</p>
</li>
<li><p>跨域请求伪造</p>
</li>
</ol>
</li>
</ul>
<hr>
<h3 id="『HTTP-』"><a href="#『HTTP-』" class="headerlink" title="『HTTP 』"></a>『HTTP 』</h3><ul>
<li><p><strong>HTTP报文</strong></p>
</li>
<li><p><strong>HTTP/1 HTTP/2 HTTPS</strong> <a href="http://www.alloyteam.com/2016/07/httphttp2-0spdyhttps-reading-this-is-enough/" target="_blank" rel="external">详细</a>
建立在TCP基础上</p>
</li>
<li><p><strong>状态码</strong></p>
</li>
<li><p><strong>缓存</strong>
设置缓存 服务器返回<code>Cache-Control:max-age=xxx；expires:Thu, 03 Jan 2019 04:24:16 GMT</code>、设置<code>etag、last-modified</code></p>
</li>
</ul>
<blockquote>
<p>实际上浏览器输入 url 之后敲下回车就是先看本地 cache-control、expires 的情况，刷新(F5)就是忽略先看本地
cache-control、expires 的情况，带上条件
If-None-Match、If-Modified-Since，强制刷新(Ctrl + F5)就是不带条件的访问。</p>
</blockquote>
<ul>
<li><strong>描述从输入url到一个页面展示在你面前的全部过程</strong></li>
</ul>
<ol>
<li><p>DNS Lookup</p>
</li>
<li><p>建立TCP连接</p>
</li>
<li><p>发送http请求</p>
</li>
<li><p>服务器发送响应</p>
</li>
<li><p>浏览器加载解析DOM&amp;CSS</p>
</li>
<li><p>生成DOM Tree&amp;CSS RuleTree</p>
</li>
<li><p>DOMTree和CSS RuleTree结合生成RenderTree</p>
</li>
<li><p>对RenderTree上的每一个元素计算其坐标&gt;称为布局</p>
</li>
<li><p>对RenderTree的元素进行绘制和展示&gt;称为『painting』</p>
</li>
</ol>
<ul>
<li><strong>引申-当页面渲染时，浏览器发生了什么</strong></li>
</ul>
<hr>
<h3 id="『工具』"><a href="#『工具』" class="headerlink" title="『工具』"></a>『工具』</h3><h4 id="【前端自动化工具】"><a href="#【前端自动化工具】" class="headerlink" title="【前端自动化工具】"></a>【前端自动化工具】</h4><ul>
<li><p><strong>grunt</strong></p>
</li>
<li><p><strong>glup</strong></p>
</li>
</ul>
<h4 id="【CSS预处理】"><a href="#【CSS预处理】" class="headerlink" title="【CSS预处理】"></a>【CSS预处理】</h4><p>优势：</p>
<ol>
<li><p>用嵌套方式写CSS，结构更加的清晰</p>
</li>
<li><p>可使用变量、函数，更类似编程的方式</p>
</li>
<li><p>可将一整套CSS拆分成若干个组件，粒子性、可组合的特点更加明显</p>
</li>
</ol>
<ul>
<li><p><strong>sass</strong></p>
</li>
<li><p><strong>less</strong></p>
</li>
<li><p><strong>compass</strong></p>
</li>
</ul>
<hr>
<h3 id="『数据结构』"><a href="#『数据结构』" class="headerlink" title="『数据结构』"></a>『数据结构』</h3><ul>
<li><p><strong>排序</strong> <a href="http://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html" target="_blank" rel="external">详细</a>
不稳定的排序 快速排序、选择排序、希尔排序、堆排序</p>
</li>
<li><p><strong>二叉树原理与实现</strong></p>
</li>
</ul>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/InterView/2017/02/24/前端面试题汇总2.html">http://lucylc.com/InterView/2017/02/24/前端面试题汇总2.html</a></p>
]]></content>
    
    <summary type="html">
    
      前端面试题汇，总持续更新中
    
    </summary>
    
      <category term="InterView" scheme="http://lucylc.com/categories/InterView/"/>
    
    
      <category term="InterView Question" scheme="http://lucylc.com/tags/InterView-Question/"/>
    
  </entry>
  
  <entry>
    <title>前端面试题汇总1</title>
    <link href="http://lucylc.com/InterView/2017/02/24/%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%A2%98%E6%B1%87%E6%80%BB1.html"/>
    <id>http://lucylc.com/InterView/2017/02/24/前端面试题汇总1.html</id>
    <published>2017-02-24T01:59:59.000Z</published>
    <updated>2017-08-20T10:15:40.966Z</updated>
    
    <content type="html"><![CDATA[<a id="more"></a>
<p>本文旨在加深对前端知识点的理解，资料来源于网络</p>
<h4 id="一些开放性题目"><a href="#一些开放性题目" class="headerlink" title="一些开放性题目"></a>一些开放性题目</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">1.自我介绍：除了基本个人信息以外，面试官更想听的是你与众不同的地方和你的优势。</div><div class="line"></div><div class="line">2.项目介绍</div><div class="line"></div><div class="line">3.如何看待前端开发？</div><div class="line"></div><div class="line">4.平时是如何学习前端开发的？</div><div class="line"></div><div class="line">5.未来三到五年的规划是怎样的？</div></pre></td></tr></table></figure>
<h4 id="position的值，-relative和absolute分别是相对于谁进行定位的？"><a href="#position的值，-relative和absolute分别是相对于谁进行定位的？" class="headerlink" title="position的值， relative和absolute分别是相对于谁进行定位的？"></a>position的值， relative和absolute分别是相对于谁进行定位的？</h4><ul>
<li><p><code>absolute</code> :生成绝对定位的元素， 相对于最近一级的 定位不是 static 的父元素来进行定位。</p>
</li>
<li><p><code>fixed</code> （老IE不支持）生成绝对定位的元素，通常相对于浏览器窗口或 frame 进行定位。</p>
</li>
<li><p><code>relative</code> 生成相对定位的元素，相对于其在普通流中的位置进行定位。</p>
</li>
<li><p><code>static</code> 默认值。没有定位，元素出现在正常的流中</p>
</li>
<li><p><code>sticky</code> 生成粘性定位的元素，容器的位置根据正常文档流计算得出</p>
</li>
</ul>
<h4 id="如何解决跨域问题"><a href="#如何解决跨域问题" class="headerlink" title="如何解决跨域问题"></a>如何解决跨域问题</h4><blockquote>
<p>JSONP：</p>
</blockquote>
<p>原理是：动态插入<code>script</code>标签，通过<code>script</code>标签引入一个<code>js</code>文件，这个js文件载入成功后会执行我们在url参数中指定的函数，并且会把我们需要的<code>json</code>数据作为参数传入。</p>
<p>由于同源策略的限制，<code>XmlHttpRequest</code>只允许请求当前源（域名、协议、端口）的资源，为了实现跨域请求，可以通过<code>script</code>标签实现跨域请求，然后在服务端输出JSON数据并执行回调函数，从而解决了跨域的数据请求。</p>
<p>优点是兼容性好，简单易用，支持浏览器与服务器双向通信。缺点是只支持GET请求。</p>
<p><code>JSONP</code>：<code>json+padding</code>（内填充），顾名思义，就是把JSON填充到一个盒子里</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div></pre></td><td class="code"><pre><div class="line">&lt;script&gt;</div><div class="line">    function createJs(sUrl)&#123;</div><div class="line"></div><div class="line">        var oScript = document.createElement(&apos;script&apos;);</div><div class="line">        oScript.type = &apos;text/javascript&apos;;</div><div class="line">        oScript.src = sUrl;</div><div class="line">        document.getElementsByTagName(&apos;head&apos;)[0].appendChild(oScript);</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    createJs(&apos;jsonp.js&apos;);</div><div class="line"></div><div class="line">    box(&#123;</div><div class="line">       &apos;name&apos;: &apos;test&apos;</div><div class="line">    &#125;);</div><div class="line"></div><div class="line">    function box(json)&#123;</div><div class="line">        alert(json.name);</div><div class="line">    &#125;</div><div class="line">&lt;/script&gt;</div></pre></td></tr></table></figure>
<blockquote>
<p>CORS</p>
</blockquote>
<p>服务器端对于<code>CORS</code>的支持，主要就是通过设置<code>Access-Control-Allow-Origin</code>来进行的。如果浏览器检测到相应的设置，就可以允许<code>Ajax</code>进行跨域的访问。</p>
<blockquote>
<p>通过修改document.domain来跨子域</p>
</blockquote>
<p>将子域和主域的<code>document.domain</code>设为同一个主域.前提条件：这两个域名必须属于同一个基础域名!而且所用的协议，端口都要一致，否则无法利用<code>document.domain</code>进行跨域</p>
<p>主域相同的使用<code>document.domain</code></p>
<blockquote>
<p>使用window.name来进行跨域</p>
</blockquote>
<p><code>window</code>对象有个<code>name</code>属性，该属性有个特征：即在一个窗口(window)的生命周期内,窗口载入的所有的页面都是共享一个<code>window.name</code>的，每个页面对<code>window.name</code>都有读写的权限，<code>window.name</code>是持久存在一个窗口载入过的所有页面中的</p>
<blockquote>
<p>使用HTML5中新引进的<code>window.postMessage</code>方法来跨域传送数据</p>
</blockquote>
<p>还有flash、在服务器上设置代理页面等跨域方式。个人认为<code>window.name</code>的方法既不复杂，也能兼容到几乎所有浏览器，这真是极好的一种跨域方法。</p>
<h4 id="XML和JSON的区别？"><a href="#XML和JSON的区别？" class="headerlink" title="XML和JSON的区别？"></a><code>XML</code>和<code>JSON</code>的区别？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line">(1).数据体积方面。</div><div class="line"></div><div class="line">JSON相对于XML来讲，数据的体积小，传递的速度更快些。</div><div class="line"></div><div class="line">(2).数据交互方面。</div><div class="line"></div><div class="line">JSON与JavaScript的交互更加方便，更容易解析处理，更好的数据交互。</div><div class="line"></div><div class="line">(3).数据描述方面。</div><div class="line"></div><div class="line">JSON对数据的描述性比XML较差。</div><div class="line"></div><div class="line">(4).传输速度方面。</div><div class="line"></div><div class="line">JSON的速度要远远快于XML。</div></pre></td></tr></table></figure>
<h4 id="谈谈你对webpack的看法"><a href="#谈谈你对webpack的看法" class="headerlink" title="谈谈你对webpack的看法"></a>谈谈你对webpack的看法</h4><p><code>WebPack</code> 是一个模块打包工具，你可以使用<code>WebPack</code>管理你的模块依赖，并编绎输出模块们所需的静态文件。它能够很好地管理、打包Web开发中所用到的<code>HTML、Javascript、CSS</code>以及各种静态文件（图片、字体等），让开发过程更加高效。对于不同类型的资源，<code>webpack</code>有对应的模块加载器。<code>webpack</code>模块打包器会分析模块间的依赖关系，最后 生成了优化且合并后的静态资源。</p>
<p><code>webpack</code>的两大特色：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">1.code splitting（可以自动完成）</div><div class="line"></div><div class="line">2.loader 可以处理各种类型的静态文件，并且支持串联操作</div></pre></td></tr></table></figure>
<p><code>webpack</code> 是以 <code>commonJS</code> 的形式来书写脚本滴，但对 <code>AMD/CMD</code> 的支持也很全面，方便旧项目进行代码迁移。</p>
<p><code>webpack</code>具有<code>requireJs</code>和<code>browserify</code>的功能，但仍有很多自己的新特性：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line">1. 对 CommonJS 、 AMD 、ES6的语法做了兼容</div><div class="line"></div><div class="line">2. 对js、css、图片等资源文件都支持打包</div><div class="line"></div><div class="line">3. 串联式模块加载器以及插件机制，让其具有更好的灵活性和扩展性，例如提供对CoffeeScript、ES6的支持</div><div class="line"></div><div class="line">4. 有独立的配置文件webpack.config.js</div><div class="line"></div><div class="line">5. 可以将代码切割成不同的chunk，实现按需加载，降低了初始化时间</div><div class="line"></div><div class="line">6. 支持 SourceUrls 和 SourceMaps，易于调试</div><div class="line"></div><div class="line">7. 具有强大的Plugin接口，大多是内部插件，使用起来比较灵活</div><div class="line"></div><div class="line">8.webpack 使用异步 IO 并具有多级缓存。这使得 webpack 很快且在增量编译上更加快</div></pre></td></tr></table></figure>
<h4 id="说说TCP传输的三次握手四次挥手策略"><a href="#说说TCP传输的三次握手四次挥手策略" class="headerlink" title="说说TCP传输的三次握手四次挥手策略"></a>说说TCP传输的三次握手四次挥手策略</h4><p>为了准确无误地把数据送达目标处，<code>TCP</code>协议采用了三次握手策略。用TCP协议把数据包送出去后，<code>TCP</code>不会对传送 后的情况置之不理，它一定会向对方确认是否成功送达。握手过程中使用了TCP的标志：<code>SYN</code>和<code>ACK</code>。</p>
<p>发送端首先发送一个带<code>SYN</code>标志的数据包给对方。接收端收到后，回传一个带有<code>SYN/ACK</code>标志的数据包以示传达确认信息。
最后，发送端再回传一个带<code>ACK</code>标志的数据包，代表“握手”结束。
若在握手过程中某个阶段莫名中断，<code>TCP</code>协议会再次以相同的顺序发送相同的数据包。</p>
<blockquote>
<p>断开一个TCP连接则需要“四次握手”：</p>
</blockquote>
<ul>
<li><p>第一次挥手：主动关闭方发送一个<code>FIN</code>，用来关闭主动方到被动关闭方的数据传送，也就是主动关闭方告诉被动关闭方：我已经不 会再给你发数据了(当然，在fin包之前发送出去的数据，如果没有收到对应的ack确认报文，主动关闭方依然会重发这些数据)，但是，此时主动关闭方还可 以接受数据。</p>
</li>
<li><p>第二次挥手：被动关闭方收到<code>FIN</code>包后，发送一个<code>ACK</code>给对方，确认序号为收到序号<code>+1</code>（与<code>SYN</code>相同，一个<code>FIN</code>占用一个序号）。</p>
</li>
<li><p>第三次挥手：被动关闭方发送一个<code>FIN</code>，用来关闭被动关闭方到主动关闭方的数据传送，也就是告诉主动关闭方，我的数据也发送完了，不会再给你发数据了。</p>
</li>
<li><p>第四次挥手：主动关闭方收到<code>FIN</code>后，发送一个<code>ACK</code>给被动关闭方，确认序号为收到序号+1，至此，完成四次挥手。</p>
</li>
</ul>
<h4 id="TCP和UDP的区别"><a href="#TCP和UDP的区别" class="headerlink" title="TCP和UDP的区别"></a>TCP和UDP的区别</h4><p><code>TCP</code>（Transmission Control Protocol，传输控制协议）是基于连接的协议，也就是说，在正式收发数据前，必须和对方建立可靠的连接。一个<code>TCP</code>连接必须要经过三次“对话”才能建立起来</p>
<p><code>UDP</code>（User Data Protocol，用户数据报协议）是与TCP相对应的协议。它是面向非连接的协议，它不与对方建立连接，而是直接就把数据包发送过去！
UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。</p>
<h4 id="说说你对作用域链的理解"><a href="#说说你对作用域链的理解" class="headerlink" title="说说你对作用域链的理解"></a>说说你对作用域链的理解</h4><p>作用域链的作用是保证执行环境里有权访问的变量和函数是有序的，作用域链的变量只能向上访问，变量访问到<code>window</code>对象即被终止，作用域链向下访问变量是不被允许的。</p>
<h4 id="创建ajax过程"><a href="#创建ajax过程" class="headerlink" title="创建ajax过程"></a>创建ajax过程</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">(1)创建XMLHttpRequest对象,也就是创建一个异步调用对象.</div><div class="line"></div><div class="line">(2)创建一个新的HTTP请求,并指定该HTTP请求的方法、URL及验证信息.</div><div class="line"></div><div class="line">(3)设置响应HTTP请求状态变化的函数.</div><div class="line"></div><div class="line">(4)发送HTTP请求.</div><div class="line"></div><div class="line">(5)获取异步调用返回的数据.</div><div class="line"></div><div class="line">(6)使用JavaScript和DOM实现局部刷新.</div></pre></td></tr></table></figure>
<h4 id="渐进增强和优雅降级"><a href="#渐进增强和优雅降级" class="headerlink" title="渐进增强和优雅降级"></a>渐进增强和优雅降级</h4><p>渐进增强 ：针对低版本浏览器进行构建页面，保证最基本的功能，然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。</p>
<p>优雅降级 ：一开始就构建完整的功能，然后再针对低版本浏览器进行兼容。</p>
<h4 id="常见web安全及防护原理"><a href="#常见web安全及防护原理" class="headerlink" title="常见web安全及防护原理"></a>常见web安全及防护原理</h4><blockquote>
<p>sql注入原理</p>
</blockquote>
<p>就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串，最终达到欺骗服务器执行恶意的SQL命令。</p>
<p>总的来说有以下几点：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"></div><div class="line">1.永远不要信任用户的输入，要对用户的输入进行校验，可以通过正则表达式，或限制长度，对单引号和双&quot;-&quot;进行转换等。</div><div class="line"></div><div class="line">2.永远不要使用动态拼装SQL，可以使用参数化的SQL或者直接使用存储过程进行数据查询存取。</div><div class="line"></div><div class="line">3.永远不要使用管理员权限的数据库连接，为每个应用使用单独的权限有限的数据库连接。</div><div class="line"></div><div class="line">4.不要把机密信息明文存放，请加密或者hash掉密码和敏感的信息。</div></pre></td></tr></table></figure>
<blockquote>
<p>XSS原理及防范</p>
</blockquote>
<p>Xss(cross-site scripting)攻击指的是攻击者往Web页面里插入恶意 <code>html</code>标签或者<code>javascript</code>代码。比如：攻击者在论坛中放一个</p>
<p>看似安全的链接，骗取用户点击后，窃取<code>cookie</code>中的用户私密信息；或者攻击者在论坛中加一个恶意表单，</p>
<p>当用户提交表单的时候，却把信息传送到攻击者的服务器中，而不是用户原本以为的信任站点。</p>
<blockquote>
<p>XSS防范方法</p>
</blockquote>
<p>首先代码里对用户输入的地方和变量都需要仔细检查长度和对<code>”&lt;”,”&gt;”,”;”,”’”</code>等字符做过滤；其次任何内容写到页面之前都必须加以<code>encode</code>，避免不小心把<code>html tag</code> 弄出来。这一个层面做好，至少可以堵住超过一半的<code>XSS</code> 攻击。</p>
<p>首先，避免直接在<code>cookie</code> 中泄露用户隐私，例如email、密码等等。</p>
<p>其次，通过使<code>cookie</code> 和系统<code>ip</code> 绑定来降低<code>cookie</code> 泄露后的危险。这样攻击者得到的<code>cookie</code> 没有实际价值，不可能拿来重放。</p>
<p>如果网站不需要再浏览器端对<code>cookie</code> 进行操作，可以在<code>Set-Cookie</code> 末尾加上<code>HttpOnly</code> 来防止<code>javascript</code> 代码直接获取<code>cookie</code> 。</p>
<p>尽量采用<code>POST</code> 而非<code>GET</code> 提交表单</p>
<blockquote>
<p>XSS与CSRF有什么区别吗？</p>
</blockquote>
<p><code>XSS</code>是获取信息，不需要提前知道其他用户页面的代码和数据包。<code>CSRF</code>是代替用户完成指定的动作，需要知道其他用户页面的代码和数据包。</p>
<p>要完成一次<code>CSRF</code>攻击，受害者必须依次完成两个步骤：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">登录受信任网站A，并在本地生成Cookie。</div><div class="line"></div><div class="line">在不登出A的情况下，访问危险网站B。</div></pre></td></tr></table></figure>
<blockquote>
<p>CSRF的防御</p>
</blockquote>
<ul>
<li><p>服务端的<code>CSRF</code>方式方法很多样，但总的思想都是一致的，就是在客户端页面增加伪随机数。</p>
</li>
<li><p>通过验证码的方法</p>
</li>
</ul>
<h4 id="Web-Worker-和webSocket"><a href="#Web-Worker-和webSocket" class="headerlink" title="Web Worker 和webSocket"></a>Web Worker 和webSocket</h4><blockquote>
<p>worker主线程:</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">1.通过 worker = new Worker( url ) 加载一个JS文件来创建一个worker，同时返回一个worker实例。</div><div class="line"></div><div class="line">2.通过worker.postMessage( data ) 方法来向worker发送数据。</div><div class="line"></div><div class="line">3.绑定worker.onmessage方法来接收worker发送过来的数据。</div><div class="line"></div><div class="line">4.可以使用 worker.terminate() 来终止一个worker的执行。</div></pre></td></tr></table></figure>
<p><code>WebSocket</code>是<code>Web</code>应用程序的传输协议，它提供了双向的，按序到达的数据流。他是一个<code>HTML5</code>协议，<code>WebSocket</code>的连接是持久的，他通过在客户端和服务器之间保持双工连接，服务器的更新可以被及时推送给客户端，而不需要客户端以一定时间间隔去轮询。</p>
<h4 id="HTTP和HTTPS"><a href="#HTTP和HTTPS" class="headerlink" title="HTTP和HTTPS"></a>HTTP和HTTPS</h4><p><code>HTTP</code>协议通常承载于TCP协议之上，在<code>HTTP</code>和<code>TCP</code>之间添加一个安全协议层（<code>SSL</code>或<code>TSL</code>），这个时候，就成了我们常说的HTTPS。</p>
<p>默认HTTP的端口号为80，<code>HTTPS</code>的端口号为443。</p>
<h4 id="为什么HTTPS安全"><a href="#为什么HTTPS安全" class="headerlink" title="为什么HTTPS安全"></a>为什么<code>HTTPS</code>安全</h4><p>因为网络请求需要中间有很多的服务器路由器的转发。中间的节点都可能篡改信息，而如果使用<code>HTTPS</code>，密钥在你和终点站才有。<code>https</code>之所以比<code>http</code>安全，是因为他利用<code>ssl/tls</code>协议传输。它包含证书，卸载，流量转发，负载均衡，页面适配，浏览器适配，refer传递等。保障了传输过程的安全性</p>
<h4 id="对前端模块化的认识"><a href="#对前端模块化的认识" class="headerlink" title="对前端模块化的认识"></a>对前端模块化的认识</h4><blockquote>
<p>AMD 是 <code>RequireJS</code> 在推广过程中对模块定义的规范化产出。</p>
<p>CMD 是 <code>SeaJS</code> 在推广过程中对模块定义的规范化产出。</p>
</blockquote>
<p><code>AMD</code> 是提前执行，<code>CMD</code> 是延迟执行。</p>
<p><code>AMD</code>推荐的风格通过返回一个对象做为模块对象，<code>CommonJS</code>的风格通过对<code>module.exports</code>或<code>exports</code>的属性赋值来达到暴露模块对象的目的。</p>
<blockquote>
<p>CMD模块方式</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">define(function(require, exports, module) &#123;</div><div class="line"></div><div class="line">  // 模块代码</div><div class="line"></div><div class="line">&#125;);</div></pre></td></tr></table></figure>
<h4 id="Javascript垃圾回收方法"><a href="#Javascript垃圾回收方法" class="headerlink" title="Javascript垃圾回收方法"></a>Javascript垃圾回收方法</h4><blockquote>
<p>标记清除（mark and sweep）</p>
</blockquote>
<p>这是JavaScript最常见的垃圾回收方式，当变量进入执行环境的时候，比如函数中声明一个变量，垃圾回收器将其标记为“进入环境”，当变量离开环境的时候（函数执行结束）将其标记为“离开环境”。</p>
<p>垃圾回收器会在运行的时候给存储在内存中的所有变量加上标记，然后去掉环境中的变量以及被环境中变量所引用的变量（闭包），在这些完成之后仍存在标记的就是要删除的变量了</p>
<blockquote>
<p>引用计数(reference counting)</p>
</blockquote>
<p>在低版本IE中经常会出现内存泄露，很多时候就是因为其采用引用计数方式进行垃圾回收。引用计数的策略是跟踪记录每个值被使用的次数，当声明了一个 变量并将一个引用类型赋值给该变量的时候这个值的引用次数就加1，如果该变量的值变成了另外一个，则这个值得引用次数减1，当这个值的引用次数变为0的时 候，说明没有变量在使用，这个值没法被访问了，因此可以将其占用的空间回收，这样垃圾回收器会在运行的时候清理掉引用次数为0的值占用的空间。</p>
<p>在IE中虽然<code>JavaScript</code>对象通过标记清除的方式进行垃圾回收，但BOM与DOM对象却是通过引用计数回收垃圾的，
也就是说只要涉及<code>BOM</code>及DOM就会出现循环引用问题。</p>
<h4 id="你觉得前端工程的价值体现在哪"><a href="#你觉得前端工程的价值体现在哪" class="headerlink" title="你觉得前端工程的价值体现在哪"></a>你觉得前端工程的价值体现在哪</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">为简化用户使用提供技术支持（交互部分）</div><div class="line"></div><div class="line">为多个浏览器兼容性提供支持</div><div class="line"></div><div class="line">为提高用户浏览速度（浏览器性能）提供支持</div><div class="line"></div><div class="line">为跨平台或者其他基于webkit或其他渲染引擎的应用提供支持</div><div class="line"></div><div class="line">为展示数据提供支持（数据接口）</div></pre></td></tr></table></figure>
<h4 id="谈谈性能优化问题"><a href="#谈谈性能优化问题" class="headerlink" title="谈谈性能优化问题"></a>谈谈性能优化问题</h4><p>代码层面：避免使用css表达式，避免使用高级选择器，通配选择器。</p>
<p>缓存利用：缓存Ajax，使用CDN，使用外部js和css文件以便缓存，添加Expires头，服务端配置Etag，减少DNS查找等</p>
<p>请求数量：合并样式和脚本，使用css图片精灵，初始首屏之外的图片资源按需加载，静态资源延迟加载。</p>
<p>请求带宽：压缩文件，开启GZIP，</p>
<blockquote>
<p>代码层面的优化</p>
</blockquote>
<ul>
<li><p>用<code>hash-table</code>来优化查找</p>
</li>
<li><p>少用全局变量</p>
</li>
<li><p>用<code>innerHTML</code>代替<code>DOM</code>操作，减少<code>DOM</code>操作次数，优化<code>javascript</code>性能</p>
</li>
<li><p>用<code>setTimeout</code>来避免页面失去响应</p>
</li>
<li><p>缓存DOM节点查找的结果</p>
</li>
<li><p>避免使用CSS Expression</p>
</li>
<li><p>避免全局查询</p>
</li>
<li><p>避免使用with(with会创建自己的作用域，会增加作用域链长度)</p>
</li>
<li><p>多个变量声明合并</p>
</li>
<li><p>避免图片和iFrame等的空Src。空Src会重新加载当前页面，影响速度和效率</p>
</li>
<li><p>尽量避免写在HTML标签中写Style属性</p>
</li>
</ul>
<h4 id="移动端性能优化"><a href="#移动端性能优化" class="headerlink" title="移动端性能优化"></a>移动端性能优化</h4><ul>
<li><p>尽量使用css3动画，开启硬件加速。</p>
</li>
<li><p>适当使用<code>touch</code>事件代替<code>click</code>事件。</p>
</li>
<li><p>避免使用<code>css3</code>渐变阴影效果。</p>
</li>
<li><p>可以用<code>transform: translateZ(0)</code>来开启硬件加速。</p>
</li>
<li><p>不滥用Float。Float在渲染时计算量比较大，尽量减少使用</p>
</li>
<li><p>不滥用Web字体。Web字体需要下载，解析，重绘当前页面，尽量减少使用。</p>
</li>
<li><p>合理使用requestAnimationFrame动画代替setTimeout</p>
</li>
<li><p>CSS中的属性（CSS3 transitions、CSS3 3D transforms、Opacity、Canvas、WebGL、Video）会触发GPU渲染，请合理使用。过渡使用会引发手机过耗电增加</p>
</li>
<li><p>PC端的在移动端同样适用</p>
</li>
</ul>
<blockquote>
<p>相关阅读：<a href="https://github.com/cssmagic/blog/issues/20" target="_blank" rel="external">如何做到一秒渲染一个移动页面</a></p>
</blockquote>
<h4 id="什么是Etag？"><a href="#什么是Etag？" class="headerlink" title="什么是Etag？"></a>什么是Etag？</h4><p>当发送一个服务器请求时，浏览器首先会进行缓存过期判断。浏览器根据缓存过期时间判断缓存文件是否过期。</p>
<p>情景一：若没有过期，则不向服务器发送请求，直接使用缓存中的结果，此时我们在浏览器控制台中可以看到 <code>200 OK</code>(from cache) ，此时的情况就是完全使用缓存，浏览器和服务器没有任何交互的。</p>
<p>情景二：若已过期，则向服务器发送请求，此时请求中会带上①中设置的文件修改时间，和<code>Etag</code></p>
<p>然后，进行资源更新判断。服务器根据浏览器传过来的文件修改时间，判断自浏览器上一次请求之后，文件是不是没有被修改过；根据<code>Etag</code>，判断文件内容自上一次请求之后，有没有发生变化</p>
<p>情形一：若两种判断的结论都是文件没有被修改过，则服务器就不给浏览器发<code>index.html</code>的内容了，直接告诉它，文件没有被修改过，你用你那边的缓存吧—— <code>304 Not Modified</code>，此时浏览器就会从本地缓存中获取<code>index.html</code>的内容。此时的情况叫协议缓存，浏览器和服务器之间有一次请求交互。</p>
<p>情形二：若修改时间和文件内容判断有任意一个没有通过，则服务器会受理此次请求，之后的操作同①</p>
<p>① 只有get请求会被缓存，post请求不会</p>
<h4 id="Expires和Cache-Control"><a href="#Expires和Cache-Control" class="headerlink" title="Expires和Cache-Control"></a>Expires和Cache-Control</h4><p><code>Expires</code>要求客户端和服务端的时钟严格同步。<code>HTTP1.1</code>引入<code>Cache-Control</code>来克服Expires头的限制。如果max-age和Expires同时出现，则max-age有更高的优先级。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">Cache-Control: no-cache, private, max-age=0</div><div class="line"></div><div class="line">ETag: abcde</div><div class="line"></div><div class="line">Expires: Thu, 15 Apr 2014 20:00:00 GMT</div><div class="line"></div><div class="line">Pragma: private</div><div class="line"></div><div class="line">Last-Modified: $now // RFC1123 format</div></pre></td></tr></table></figure>
<h4 id="ETag应用"><a href="#ETag应用" class="headerlink" title="ETag应用:"></a>ETag应用:</h4><p><code>Etag</code>由服务器端生成，客户端通过<code>If-Match</code>或者说<code>If-None-Match</code>这个条件判断请求来验证资源是否修改。常见的是使用<code>If-None-Match</code>。请求一个文件的流程可能如下：</p>
<p>====第一次请求===</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">1.客户端发起 HTTP GET 请求一个文件；</div><div class="line"></div><div class="line">2.服务器处理请求，返回文件内容和一堆Header，当然包括Etag(例如&quot;2e681a-6-5d044840&quot;)(假设服务器支持Etag生成和已经开启了Etag).状态码200</div></pre></td></tr></table></figure>
<p>====第二次请求===</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">客户端发起 HTTP GET 请求一个文件，注意这个时候客户端同时发送一个If-None-Match头，这个头的内容就是第一次请求时服务器返回的Etag：2e681a-6-5d0448402.服务器判断发送过来的Etag和计算出来的Etag匹配，因此If-None-Match为False，不返回200，返回304，客户端继续使用本地缓存；流程很简单，问题是，如果服务器又设置了Cache-Control:max-age和Expires呢，怎么办</div></pre></td></tr></table></figure>
<p>答案是同时使用，也就是说在完全匹配<code>If-Modified-Since</code>和<code>If-None-Match</code>即检查完修改时间和<code>Etag</code>之后，</p>
<p>服务器才能返回304.(不要陷入到底使用谁的问题怪圈)</p>
<p>为什么使用Etag请求头?</p>
<p>Etag 主要为了解决 <code>Last-Modified</code> 无法解决的一些问题。</p>
<h4 id="栈和队列的区别"><a href="#栈和队列的区别" class="headerlink" title="栈和队列的区别?"></a>栈和队列的区别?</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">栈的插入和删除操作都是在一端进行的，而队列的操作却是在两端进行的。</div><div class="line"></div><div class="line">队列先进先出，栈先进后出。</div><div class="line"></div><div class="line">栈只允许在表尾一端进行插入和删除，而队列只允许在表尾一端进行插入，在表头一端进行删除</div></pre></td></tr></table></figure>
<h4 id="栈和堆的区别？"><a href="#栈和堆的区别？" class="headerlink" title="栈和堆的区别？"></a>栈和堆的区别？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">栈区（stack）—   由编译器自动分配释放   ，存放函数的参数值，局部变量的值等。</div><div class="line"></div><div class="line">堆区（heap）   —   一般由程序员分配释放，   若程序员不释放，程序结束时可能由OS回收。</div><div class="line"></div><div class="line">堆（数据结构）：堆可以被看成是一棵树，如：堆排序；</div><div class="line"></div><div class="line">栈（数据结构）：一种先进后出的数据结构。</div></pre></td></tr></table></figure>
<h4 id="快速-排序的思想并实现一个快排？"><a href="#快速-排序的思想并实现一个快排？" class="headerlink" title="快速 排序的思想并实现一个快排？"></a>快速 排序的思想并实现一个快排？</h4><p>“快速排序”的思想很简单，整个排序过程只需要三步：</p>
<p>　　（1）在数据集之中，找一个基准点</p>
<p>　　（2）建立两个数组，分别存储左边和右边的数组</p>
<p>　　（3）利用递归进行下次比较</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div></pre></td><td class="code"><pre><div class="line">&lt;script type=&quot;text/javascript&quot;&gt;</div><div class="line"></div><div class="line">    function quickSort(arr)&#123;</div><div class="line">        if(arr.length&lt;=1)&#123;</div><div class="line">            return arr;//如果数组只有一个数，就直接返回；</div><div class="line">        &#125;</div><div class="line"></div><div class="line">        var num = Math.floor(arr.length/2);//找到中间数的索引值，如果是浮点数，则向下取整</div><div class="line"></div><div class="line">        var numValue = arr.splice(num,1);//找到中间数的值</div><div class="line">        var left = [];</div><div class="line">        var right = [];</div><div class="line"></div><div class="line">        for(var i=0;i&lt;arr.length;i++)&#123;</div><div class="line">            if(arr[i]&lt;numValue)&#123;</div><div class="line">                left.push(arr[i]);//基准点的左边的数传到左边数组</div><div class="line">            &#125;</div><div class="line">            else&#123;</div><div class="line">               right.push(arr[i]);//基准点的右边的数传到右边数组</div><div class="line">            &#125;</div><div class="line">        &#125;</div><div class="line"></div><div class="line">        return quickSort(left).concat([numValue],quickSort(right));//递归不断重复比较</div><div class="line">    &#125;</div><div class="line"></div><div class="line">    alert(quickSort([32,45,37,16,2,87]));//弹出“2,16,32,37,45,87”</div><div class="line"></div><div class="line">&lt;/script&gt;</div></pre></td></tr></table></figure>
<h4 id="你觉得jQuery或zepto源码有哪些写的好的地方"><a href="#你觉得jQuery或zepto源码有哪些写的好的地方" class="headerlink" title="你觉得jQuery或zepto源码有哪些写的好的地方"></a>你觉得jQuery或zepto源码有哪些写的好的地方</h4><p>(答案仅供参考)</p>
<p><code>jquery</code>源码封装在一个匿名函数的自执行环境中，有助于防止变量的全局污染，然后通过传入window对象参数，可以使window对象作为局部变量使用，好处是当<code>jquery</code>中访问window对象的时候，就不用将作用域链退回到顶层作用域了，从而可以更快的访问<code>window</code>对象。同样，传入<code>undefined</code>参数，可以缩短查找undefined时的作用域链。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">(function( window, undefined ) &#123;</div><div class="line"></div><div class="line">     //用一个函数域包起来，就是所谓的沙箱</div><div class="line"></div><div class="line">     //在这里边var定义的变量，属于这个函数域内的局部变量，避免污染全局</div><div class="line"></div><div class="line">     //把当前沙箱需要的外部变量通过函数参数引入进来</div><div class="line"></div><div class="line">     //只要保证参数对内提供的接口的一致性，你还可以随意替换传进来的这个参数</div><div class="line"></div><div class="line">    window.jQuery = window.$ = jQuery;</div><div class="line"></div><div class="line">&#125;)( window );</div></pre></td></tr></table></figure>
<p>jquery将一些原型属性和方法封装在了<code>jquery.prototype</code>中，为了缩短名称，又赋值给了<code>jquery.fn</code>，这是很形象的写法。</p>
<p>有一些数组或对象的方法经常能使用到，jQuery将其保存为局部变量以提高访问速度。</p>
<p><code>jquery</code>实现的链式调用可以节约代码，所返回的都是同一个对象，可以提高代码效率。</p>
<h4 id="ES6的了解"><a href="#ES6的了解" class="headerlink" title="ES6的了解"></a>ES6的了解</h4><p>新增模板字符串（为JavaScript提供了简单的字符串插值功能）、箭头函数（操作符左边为输入的参数，而右边则是进行的操作以及返回的值<code>Inputs=&gt;outputs</code>。）、<code>for-of</code>（用来遍历数据—例如数组中的值。）<code>arguments</code>对象可被不定参数和默认参数完美代替。<code>ES6</code>将<code>promise</code>对象纳入规范，提供了原生的<code>Promise</code>对象。增加了<code>let</code>和<code>const</code>命令，用来声明变量。增加了块级作用域。let命令实际上就增加了块级作用域。ES6规定，<code>var</code>命令和<code>function</code>命令声明的全局变量，属于全局对象的属性；<code>let</code>命令、<code>const</code>命令、<code>class</code>命令声明的全局变量，不属于全局对象的属性。。还有就是引入<code>module</code>模块的概念</p>
<h4 id="js继承方式及其优缺点"><a href="#js继承方式及其优缺点" class="headerlink" title="js继承方式及其优缺点"></a>js继承方式及其优缺点</h4><blockquote>
<p>原型链继承的缺点</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">一是字面量重写原型会中断关系，使用引用类型的原型，并且子类型还无法给超类型传递参数。</div></pre></td></tr></table></figure>
<blockquote>
<p>借用构造函数（类式继承）</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">借用构造函数虽然解决了刚才两种问题，但没有原型，则复用无从谈起。所以我们需要原型链+借用构造函数的模式，这种模式称为组合继承</div></pre></td></tr></table></figure>
<blockquote>
<p>组合式继承</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">组合式继承是比较常用的一种继承方法，其背后的思路是 使用原型链实现对原型属性和方法的继承，而通过借用构造函数来实现对实例属性的继承。这样，既通过在原型上定义方法实现了函数复用，又保证每个实例都有它自己的属性。</div></pre></td></tr></table></figure>
<p>具体请看：<a href="http://segmentfault.com/a/1190000002440502" target="_blank" rel="external">JavaScript继承方式详解</a></p>
<h4 id="关于Http-2-0-你知道多少？"><a href="#关于Http-2-0-你知道多少？" class="headerlink" title="关于Http 2.0 你知道多少？"></a>关于Http 2.0 你知道多少？</h4><p><code>HTTP/2</code>引入了“服务端推（server push）”的概念，它允许服务端在客户端需要数据之前就主动地将数据发送到客户端缓存中，从而提高性能。</p>
<p><code>HTTP/2</code>提供更多的加密支持</p>
<p><code>HTTP/2</code>使用多路技术，允许多个消息在一个连接上同时交差。</p>
<p>它增加了头压缩（header compression），因此即使非常小的请求，其请求和响应的<code>header</code>都只会占用很小比例的带宽。</p>
<h4 id="defer和async"><a href="#defer和async" class="headerlink" title="defer和async"></a>defer和async</h4><blockquote>
<p>defer并行加载js文件，会按照页面上script标签的顺序执行
async并行加载js文件，下载完成立即执行，不会按照页面上script标签的顺序执行</p>
</blockquote>
<h4 id="谈谈浮动和清除浮动"><a href="#谈谈浮动和清除浮动" class="headerlink" title="谈谈浮动和清除浮动"></a>谈谈浮动和清除浮动</h4><p>浮动的框可以向左或向右移动，直到他的外边缘碰到包含框或另一个浮动框的边框为止。由于浮动框不在文档的普通流中，所以文档的普通流的块框表现得就像浮动框不存在一样。浮动的块框会漂浮在文档普通流的块框上。</p>
<h4 id="如何评价AngularJS和BackboneJS"><a href="#如何评价AngularJS和BackboneJS" class="headerlink" title="如何评价AngularJS和BackboneJS"></a>如何评价AngularJS和BackboneJS</h4><p><code>backbone</code>具有依赖性，依赖<code>underscore.js</code>。<code>Backbone + Underscore + jQuery(or Zepto)</code> 就比一个<code>AngularJS</code> 多出了2 次HTTP请求.</p>
<p><code>Backbone</code>的<code>Model</code>没有与UI视图数据绑定，而是需要在View中自行操作DOM来更新或读取UI数据。<code>AngularJS</code>与此相反，Model直接与UI视图绑定，<code>Model</code>与UI视图的关系，通过<code>directive</code>封装，<code>AngularJS</code>内置的通用<code>directive</code>，就能实现大部分操作了，也就是说，基本不必关心<code>Model</code>与UI视图的关系，直接操作Model就行了，UI视图自动更新。</p>
<p><code>AngularJS</code>的<code>directive</code>，你输入特定数据，他就能输出相应UI视图。是一个比较完善的前端MVW框架，包含模板，数据双向绑定，路由，模块化，服务，依赖注入等所有功能，模板功能强大丰富，并且是声明式的，自带了丰富的 Angular 指令。</p>
<h4 id="用过哪些设计模式？"><a href="#用过哪些设计模式？" class="headerlink" title="用过哪些设计模式？"></a>用过哪些设计模式？</h4><blockquote>
<p>工厂模式：</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">主要好处就是可以消除对象间的耦合，通过使用工程方法而不是new关键字。将所有实例化的代码集中在一个位置防止代码重复。</div><div class="line"></div><div class="line">    工厂模式解决了重复实例化的问题 ，但还有一个问题,那就是识别问题，因为根本无法 搞清楚他们到底是哪个对象的实例。</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">function createObject(name,age,profession)&#123;//集中实例化的函数var obj = new Object();</div><div class="line">    obj.name = name;</div><div class="line">    obj.age = age;</div><div class="line">    obj.profession = profession;</div><div class="line">    obj.move = function () &#123;</div><div class="line">        return this.name + &apos; at &apos; + this.age + &apos; engaged in &apos; + this.profession;</div><div class="line">    &#125;;</div><div class="line">    return obj;</div><div class="line">&#125;</div><div class="line">var test1 = createObject(&apos;trigkit4&apos;,22,&apos;programmer&apos;);//第一个实例var test2 = createObject(&apos;mike&apos;,25,&apos;engineer&apos;);//第二个实例</div></pre></td></tr></table></figure>
<blockquote>
<p>构造函数模式</p>
</blockquote>
<p>使用构造函数的方法 ，即解决了重复实例化的问题 ，又解决了对象识别的问题，该模式与工厂模式的不同之处在于：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">1.构造函数方法没有显示的创建对象 (new Object());</div><div class="line"></div><div class="line">2.直接将属性和方法赋值给 this 对象;</div><div class="line"></div><div class="line">3.没有 renturn 语句。</div></pre></td></tr></table></figure>
<h4 id="说说你对闭包的理解"><a href="#说说你对闭包的理解" class="headerlink" title="说说你对闭包的理解"></a>说说你对闭包的理解</h4><p>使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染，缺点是闭包会常驻内存，会增大内存使用量，使用不当很容易造成内存泄露。在js中，函数即闭包，只有函数才会产生作用域的概念</p>
<p>闭包有三个特性：</p>
<blockquote>
<p>1.函数嵌套函数</p>
<p>2.函数内部可以引用外部的参数和变量</p>
<p>3.参数和变量不会被垃圾回收机制回收</p>
</blockquote>
<p>具体请看：<a href="http://segmentfault.com/a/1190000000652891" target="_blank" rel="external">详解js闭包</a></p>
<h4 id="请你谈谈Cookie的弊端"><a href="#请你谈谈Cookie的弊端" class="headerlink" title="请你谈谈Cookie的弊端"></a>请你谈谈Cookie的弊端</h4><p><code>cookie</code>虽然在持久保存客户端数据提供了方便，分担了服务器存储的负担，但还是有很多局限性的。</p>
<p>第一：每个特定的域名下最多生成20个<code>cookie</code></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">1.IE6或更低版本最多20个cookie</div><div class="line"></div><div class="line">2.IE7和之后的版本最后可以有50个cookie。</div><div class="line"></div><div class="line">3.Firefox最多50个cookie</div><div class="line"></div><div class="line">4.chrome和Safari没有做硬性限制</div></pre></td></tr></table></figure>
<p><code>IE</code>和<code>Opera</code> 会清理近期最少使用的<code>cookie</code>，<code>Firefox</code>会随机清理<code>cookie</code>。</p>
<p><code>cookie</code>的最大大约为<code>4096</code>字节，为了兼容性，一般不能超过<code>4095</code>字节。</p>
<p>IE 提供了一种存储可以持久化用户数据，叫做<code>userdata</code>，从<code>IE5.0</code>就开始支持。每个数据最多128K，每个域名下最多1M。这个持久化数据放在缓存中，如果缓存没有清理，那么会一直存在。</p>
<blockquote>
<p>优点：极高的扩展性和可用性</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">1.通过良好的编程，控制保存在cookie中的session对象的大小。</div><div class="line"></div><div class="line">2.通过加密和安全传输技术（SSL），减少cookie被破解的可能性。</div><div class="line"></div><div class="line">3.只在cookie中存放不敏感数据，即使被盗也不会有重大损失。</div><div class="line"></div><div class="line">4.控制cookie的生命期，使之不会永远有效。偷盗者很可能拿到一个过期的cookie。</div></pre></td></tr></table></figure>
<blockquote>
<p>缺点：</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">1.`Cookie`数量和长度的限制。每个domain最多只能有20条cookie，每个cookie长度不能超过4KB，否则会被截掉.</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">2.安全性问题。如果cookie被人拦截了，那人就可以取得所有的session信息。即使加密也与事无补，因为拦截者并不需要知道cookie的意义，他只要原样转发cookie就可以达到目的了。</div><div class="line"></div><div class="line">3.有些状态不可能保存在客户端。例如，为了防止重复提交表单，我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端，那么它起不到任何作用。</div></pre></td></tr></table></figure>
<h4 id="浏览器本地存储"><a href="#浏览器本地存储" class="headerlink" title="浏览器本地存储"></a>浏览器本地存储</h4><p>在较高版本的浏览器中，<code>js</code>提供了<code>sessionStorage</code>和<code>globalStorage</code>。在<code>HTML5</code>中提供了<code>localStorage</code>来取代<code>globalStorage</code>。</p>
<p><code>html5</code>中的<code>Web Storage</code>包括了两种存储方式：<code>sessionStorage</code>和<code>localStorage</code>。</p>
<p><code>sessionStorage</code>用于本地存储一个会话（session）中的数据，这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此<code>sessionStorage</code>不是一种持久化的本地存储，仅仅是会话级别的存储。</p>
<p>而<code>localStorage</code>用于持久化的本地存储，除非主动删除数据，否则数据是永远不会过期的。</p>
<h4 id="web-storage和cookie的区别"><a href="#web-storage和cookie的区别" class="headerlink" title="web storage和cookie的区别"></a>web storage和cookie的区别</h4><p><code>Web Storage</code>的概念和<code>cookie</code>相似，区别是它是为了更大容量存储设计的。<code>Cookie</code>的大小是受限的，并且每次你请求一个新的页面的时候<code>Cookie</code>都会被发送过去，这样无形中浪费了带宽，另外<code>cookie</code>还需要指定作用域，不可以跨域调用。</p>
<p>除此之外，<code>Web Storage</code>拥有<code>setItem,getItem,removeItem,clear</code>等方法，不像<code>cookie</code>需要前端开发者自己封装<code>setCookie，getCookie</code>。</p>
<p>但是<code>cookie</code>也是不可以或缺的：<code>cookie</code>的作用是与服务器进行交互，作为<code>HTTP</code>规范的一部分而存在 ，而<code>Web Storage</code>仅仅是为了在本地“存储”数据而生</p>
<p>浏览器的支持除了<code>IE７</code>及以下不支持外，其他标准浏览器都完全支持(ie及FF需在web服务器里运行)，值得一提的是IE总是办好事，例如IE7、IE6中的<code>userData</code>其实就是<code>javascript</code>本地存储的解决方案。通过简单的代码封装可以统一到所有的浏览器都支持<code>web storage</code>。</p>
<p><code>localStorage</code>和<code>sessionStorage</code>都具有相同的操作方法，例如<code>setItem、getItem</code>和<code>removeItem</code>等</p>
<h4 id="cookie-和session-的区别："><a href="#cookie-和session-的区别：" class="headerlink" title="cookie 和session 的区别："></a>cookie 和session 的区别：</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">1、cookie数据存放在客户的浏览器上，session数据放在服务器上。</div><div class="line"></div><div class="line">2、cookie不是很安全，别人可以分析存放在本地的COOKIE并进行COOKIE欺骗</div><div class="line"></div><div class="line">   考虑到安全应当使用session。</div><div class="line"></div><div class="line">3、session会在一定时间内保存在服务器上。当访问增多，会比较占用你服务器的性能</div><div class="line"></div><div class="line">    考虑到减轻服务器性能方面，应当使用COOKIE。</div><div class="line"></div><div class="line">4、单个cookie保存的数据不能超过4K，很多浏览器都限制一个站点最多保存20个cookie。</div><div class="line"></div><div class="line">5、所以个人建议：</div><div class="line"></div><div class="line">   将登陆信息等重要信息存放为SESSION</div><div class="line"></div><div class="line">   其他信息如果需要保留，可以放在COOKIE中</div></pre></td></tr></table></figure>
<blockquote>
<p><code>display:none</code>和<code>visibility:hidden</code>的区别？</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">display:none  隐藏对应的元素，在文档布局中不再给它分配空间，它各边的元素会合拢，就当他从来不存在。</div><div class="line"></div><div class="line">visibility:hidden  隐藏对应的元素，但是在文档布局中仍保留原来的空间。</div></pre></td></tr></table></figure>
<blockquote>
<p>CSS中 <code>link</code> 和<code>@import</code> 的区别是？</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">(1) link属于HTML标签，而@import是CSS提供的;</div><div class="line"></div><div class="line">(2) 页面被加载的时，link会同时被加载，而@import被引用的CSS会等到引用它的CSS文件被加载完再加载;</div><div class="line"></div><div class="line">(3) import只在IE5以上才能识别，而link是HTML标签，无兼容问题;</div><div class="line"></div><div class="line">(4) link方式的样式的权重 高于@import的权重.</div></pre></td></tr></table></figure>
<blockquote>
<p><code>position:absolute</code>和<code>float</code>属性的异同</p>
</blockquote>
<ul>
<li><p>共同点：对内联元素设置<code>float</code>和<code>absolute</code>属性，可以让元素脱离文档流，并且可以设置其宽高。</p>
</li>
<li><p>不同点：<code>float</code>仍会占据位置，<code>absolute</code>会覆盖文档流中的其他元素。</p>
</li>
</ul>
<blockquote>
<p>介绍一下box-sizing属性？</p>
</blockquote>
<p><code>box-sizing</code>属性主要用来控制元素的盒模型的解析模式。默认值是<code>content-box</code>。</p>
<ul>
<li><p><code>content-box</code>：让元素维持W3C的标准盒模型。元素的宽度/高度由<code>border + padding + content</code>的宽度/高度决定，设置<code>width/height</code>属性指的是<code>content</code>部分的宽/高</p>
</li>
<li><p><code>border-box</code>：让元素维持IE传统盒模型（IE6以下版本和IE6~7的怪异模式）。设置<code>width/height</code>属性指的是<code>border + padding + content</code></p>
</li>
</ul>
<p>标准浏览器下，按照W3C规范对盒模型解析，一旦修改了元素的边框或内距，就会影响元素的盒子尺寸，就不得不重新计算元素的盒子尺寸，从而影响整个页面的布局。</p>
<blockquote>
<p>CSS 选择符有哪些？哪些属性可以继承？优先级算法如何计算？ CSS3新增伪类有那些？</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">1.id选择器（ # myid）</div><div class="line"></div><div class="line">2.类选择器（.myclassname）</div><div class="line"></div><div class="line">3.标签选择器（div, h1, p）</div><div class="line"></div><div class="line">4.相邻选择器（h1 + p）</div><div class="line"></div><div class="line">5.子选择器（ul &gt; li）</div><div class="line"></div><div class="line">6.后代选择器（li a）</div><div class="line"></div><div class="line">7.通配符选择器（ * ）</div><div class="line"></div><div class="line">8.属性选择器（a[rel = &quot;external&quot;]）</div><div class="line"></div><div class="line">9.伪类选择器（a: hover, li:nth-child）</div></pre></td></tr></table></figure>
<p><strong>优先级为:</strong></p>
<p><code>!important &gt; id &gt; class &gt; tag</code></p>
<p><code>important</code> 比 内联优先级高,但内联比 <code>id</code> 要高</p>
<blockquote>
<p>CSS3新增伪类举例：</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">p:first-of-type 选择属于其父元素的首个 &lt;p&gt; 元素的每个 &lt;p&gt; 元素。</div><div class="line"></div><div class="line">p:last-of-type  选择属于其父元素的最后 &lt;p&gt; 元素的每个 &lt;p&gt; 元素。</div><div class="line"></div><div class="line">p:only-of-type  选择属于其父元素唯一的 &lt;p&gt; 元素的每个 &lt;p&gt; 元素。</div><div class="line"></div><div class="line">p:only-child    选择属于其父元素的唯一子元素的每个 &lt;p&gt; 元素。</div><div class="line"></div><div class="line">p:nth-child(2)  选择属于其父元素的第二个子元素的每个 &lt;p&gt; 元素。</div><div class="line"></div><div class="line">:enabled  :disabled 控制表单控件的禁用状态。</div><div class="line"></div><div class="line">:checked        单选框或复选框被选中。</div></pre></td></tr></table></figure>
<blockquote>
<p>CSS3有哪些新特性？</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">CSS3实现圆角（border-radius），阴影（box-shadow），</div><div class="line"></div><div class="line">对文字加特效（text-shadow、），线性渐变（gradient），旋转（transform）</div><div class="line"></div><div class="line">transform:rotate(9deg) scale(0.85,0.90) translate(0px,-30px) skew(-9deg,0deg);//旋转,缩放,定位,倾斜</div><div class="line"></div><div class="line">增加了更多的CSS选择器  多背景 rgba</div><div class="line"></div><div class="line">在CSS3中唯一引入的伪元素是::selection.</div><div class="line"></div><div class="line">媒体查询，多栏布局</div><div class="line"></div><div class="line">border-image</div></pre></td></tr></table></figure>
<p>CSS3中新增了一种盒模型计算方式：<code>box-sizing</code>。盒模型默认的值是<code>content-box</code>, 新增的值是<code>padding-box</code>和<code>border-box</code>，几种盒模型计算元素宽高的区别如下：</p>
<h4 id="content-box（默认）"><a href="#content-box（默认）" class="headerlink" title="content-box（默认）"></a><code>content-box（默认）</code></h4><p>布局所占宽度Width：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Width = width + padding-left + padding-right + border-left + border-right</div></pre></td></tr></table></figure>
<p>布局所占高度Height:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Height = height + padding-top + padding-bottom + border-top + border-bottom</div></pre></td></tr></table></figure>
<h4 id="padding-box"><a href="#padding-box" class="headerlink" title="padding-box"></a><code>padding-box</code></h4><p>布局所占宽度Width：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Width = width(包含padding-left + padding-right) + border-top + border-bottom</div></pre></td></tr></table></figure>
<p>布局所占高度Height:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Height = height(包含padding-top + padding-bottom) + border-top + border-bottom</div></pre></td></tr></table></figure>
<h4 id="border-box"><a href="#border-box" class="headerlink" title="border-box"></a><code>border-box</code></h4><p>布局所占宽度Width：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Width = width(包含padding-left + padding-right + border-left + border-right)</div></pre></td></tr></table></figure>
<p>布局所占高度Height:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">Height = height(包含padding-top + padding-bottom + border-top + border-bottom)</div></pre></td></tr></table></figure>
<blockquote>
<p>对BFC规范的理解？</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">  BFC，块级格式化上下文，一个创建了新的BFC的盒子是独立布局的，盒子里面的子元素的样式不会影响到外面的元素。在同一个BFC中的两个毗邻的块级盒在垂直方向（和布局方向有关系）的margin会发生折叠。</div><div class="line"></div><div class="line">（W3C CSS 2.1 规范中的一个概念，它决定了元素如何对其内容进行布局，以及与其他元素的关系和相互作用。</div></pre></td></tr></table></figure>
<h4 id="说说你对语义化的理解？"><a href="#说说你对语义化的理解？" class="headerlink" title="说说你对语义化的理解？"></a>说说你对语义化的理解？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">1，去掉或者丢失样式的时候能够让页面呈现出清晰的结构</div><div class="line"></div><div class="line">2，有利于SEO：和搜索引擎建立良好沟通，有助于爬虫抓取更多的有效信息：爬虫依赖于标签来确定上下文和各个关键字的权重；</div><div class="line"></div><div class="line">3，方便其他设备解析（如屏幕阅读器、盲人阅读器、移动设备）以意义的方式来渲染网页；</div><div class="line"></div><div class="line">4，便于团队开发和维护，语义化更具可读性，是下一步吧网页的重要动向，遵循W3C标准的团队都遵循这个标准，可以减少差异化。</div></pre></td></tr></table></figure>
<h4 id="Doctype作用-严格模式与混杂模式如何区分？它们有何意义"><a href="#Doctype作用-严格模式与混杂模式如何区分？它们有何意义" class="headerlink" title="Doctype作用? 严格模式与混杂模式如何区分？它们有何意义?"></a>Doctype作用? 严格模式与混杂模式如何区分？它们有何意义?</h4><p>1）、<code>&lt;!DOCTYPE&gt;</code> 声明位于文档中的最前面，处于 <code>&lt;html&gt;</code> 标签之前。告知浏览器以何种模式来渲染文档。</p>
<p>2）、严格模式的排版和 <code>JS</code> 运作模式是 以该浏览器支持的最高标准运行。</p>
<p>3）、在混杂模式中，页面以宽松的向后兼容的方式显示。模拟老式浏览器的行为以防止站点无法工作。</p>
<p>4）、<code>DOCTYPE</code>不存在或格式不正确会导致文档以混杂模式呈现。</p>
<h4 id="你知道多少种Doctype文档类型？"><a href="#你知道多少种Doctype文档类型？" class="headerlink" title="你知道多少种Doctype文档类型？"></a>你知道多少种<code>Doctype</code>文档类型？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line"> 该标签可声明三种 DTD 类型，分别表示严格版本、过渡版本以及基于框架的 HTML 文档。</div><div class="line"></div><div class="line"> HTML 4.01 规定了三种文档类型：Strict、Transitional 以及 Frameset。</div><div class="line"></div><div class="line"> XHTML 1.0 规定了三种 XML 文档类型：Strict、Transitional 以及 Frameset。</div><div class="line"></div><div class="line">Standards （标准）模式（也就是严格呈现模式）用于呈现遵循最新标准的网页，而 Quirks</div><div class="line"></div><div class="line"> （包容）模式（也就是松散呈现模式或者兼容模式）用于呈现为传统浏览器而设计的网页。</div></pre></td></tr></table></figure>
<h4 id="HTML与XHTML——二者有什么区别"><a href="#HTML与XHTML——二者有什么区别" class="headerlink" title="HTML与XHTML——二者有什么区别"></a>HTML与XHTML——二者有什么区别</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">区别：</div><div class="line"></div><div class="line">1.所有的标记都必须要有一个相应的结束标记</div><div class="line"></div><div class="line">2.所有标签的元素和属性的名字都必须使用小写</div><div class="line"></div><div class="line">3.所有的XML标记都必须合理嵌套</div><div class="line"></div><div class="line">4.所有的属性必须用引号&quot;&quot;括起来</div><div class="line"></div><div class="line">5.把所有&lt;和&amp;特殊符号用编码表示</div><div class="line"></div><div class="line">6.给所有属性赋一个值</div><div class="line"></div><div class="line">7.不要在注释内容中使“--”</div><div class="line"></div><div class="line">8.图片必须有说明文字</div></pre></td></tr></table></figure>
<h4 id="常见兼容性问题？"><a href="#常见兼容性问题？" class="headerlink" title="常见兼容性问题？"></a>常见兼容性问题？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">png24位的图片在iE6浏览器上出现背景，解决方案是做成PNG8.也可以引用一段脚本处理.</div><div class="line"></div><div class="line">浏览器默认的margin和padding不同。解决方案是加一个全局的*&#123;margin:0;padding:0;&#125;来统一。</div><div class="line"></div><div class="line">IE6双边距bug:块属性标签float后，又有横行的margin情况下，在ie6显示margin比设置的大。</div><div class="line"></div><div class="line">浮动ie产生的双倍距离（IE6双边距问题：在IE6下，如果对元素设置了浮动，同时又设置了margin-left或margin-right，margin值会加倍。）</div><div class="line"></div><div class="line">#box&#123; float:left; width:10px; margin:0 0 0 100px;&#125;</div><div class="line"></div><div class="line">这种情况之下IE会产生20px的距离，解决方案是在float的标签样式控制中加入</div><div class="line">_display:inline;将其转化为行内属性。(_这个符号只有ie6会识别)</div><div class="line"></div><div class="line">渐进识别的方式，从总体中逐渐排除局部。</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line">首先，巧妙的使用“\9”这一标记，将IE游览器从所有情况中分离出来。</div><div class="line"></div><div class="line">接着，再次使用“+”将IE8和IE7、IE6分离开来，这样IE8已经独立识别。</div><div class="line"></div><div class="line">css</div><div class="line"></div><div class="line">    .bb&#123;</div><div class="line"></div><div class="line">     background-color:#f1ee18;/*所有识别*/</div><div class="line"></div><div class="line">    .background-color:#00deff\9; /*IE6、7、8识别*/</div><div class="line"></div><div class="line">    +background-color:#a200ff;/*IE6、7识别*/</div><div class="line"></div><div class="line">    _background-color:#1e0bd1;/*IE6识别*/</div><div class="line"></div><div class="line">    &#125;</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">怪异模式问题：漏写DTD声明，Firefox仍然会按照标准模式来解析网页，但在IE中会触发</div><div class="line">怪异模式。为避免怪异模式给我们带来不必要的麻烦，最好养成书写DTD声明的好习惯。现在</div><div class="line">可以使用[html5](http://www.w3.org/TR/html5/single-page.html)推荐的写法：`&lt;doctype html&gt;`</div></pre></td></tr></table></figure>
<blockquote>
<p>上下margin重合问题</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">ie和ff都存在，相邻的两个div的margin-left和margin-right不会重合，但是margin-top和margin-bottom却会发生重合。</div><div class="line"></div><div class="line">解决方法，养成良好的代码编写习惯，同时采用margin-top或者同时采用margin-bottom。</div></pre></td></tr></table></figure>
<h4 id="解释下浮动和它的工作原理？清除浮动的技巧"><a href="#解释下浮动和它的工作原理？清除浮动的技巧" class="headerlink" title="解释下浮动和它的工作原理？清除浮动的技巧"></a>解释下浮动和它的工作原理？清除浮动的技巧</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">浮动元素脱离文档流，不占据空间。浮动元素碰到包含它的边框或者浮动元素的边框停留。</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">1.使用空标签清除浮动。</div><div class="line"></div><div class="line">   这种方法是在所有浮动标签后面添加一个空标签 定义css clear:both. 弊端就是增加了无意义标签。</div><div class="line"></div><div class="line">2.使用overflow。</div><div class="line"></div><div class="line">   给包含浮动元素的父标签添加css属性 overflow:auto; zoom:1; zoom:1用于兼容IE6。</div><div class="line"></div><div class="line">3.使用after伪对象清除浮动。</div><div class="line"></div><div class="line">   该方法只适用于非IE浏览器。具体写法可参照以下示例。使用中需注意以下几点。一、该方法中必须为需要清除浮动元素的伪对象中设置 height:0，否则该元素会比实际高出若干像素；</div></pre></td></tr></table></figure>
<h4 id="浮动元素引起的问题和解决办法？"><a href="#浮动元素引起的问题和解决办法？" class="headerlink" title="浮动元素引起的问题和解决办法？"></a>浮动元素引起的问题和解决办法？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">浮动元素引起的问题：</div><div class="line"></div><div class="line">（1）父元素的高度无法被撑开，影响与父元素同级的元素</div><div class="line"></div><div class="line">（2）与浮动元素同级的非浮动元素（内联元素）会跟随其后</div><div class="line"></div><div class="line">（3）若非第一个元素浮动，则该元素之前的元素也需要浮动，否则会影响页面显示的结构</div></pre></td></tr></table></figure>
<blockquote>
<p>解决方法：</p>
</blockquote>
<p>使用<code>CSS</code>中的<code>clear:both</code>;属性来清除元素的浮动可解决2、3问题，对于问题1，添加如下样式，给父元素添加<code>clearfix</code>样式：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">.clearfix:after&#123;content: &quot;.&quot;;display: block;height: 0;clear: both;visibility: hidden;&#125;</div><div class="line"></div><div class="line">.clearfix&#123;display: inline-block;&#125; /* for IE/Mac */</div></pre></td></tr></table></figure>
<p><strong>清除浮动的几种方法：</strong></p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div></pre></td><td class="code"><pre><div class="line">1，额外标签法，&lt;div style=&quot;clear:both;&quot;&gt;&lt;/div&gt;（缺点：不过这个办法会增加额外的标签使HTML结构看起来不够简洁。）</div><div class="line"></div><div class="line">2，使用after伪类</div><div class="line"></div><div class="line">#parent:after&#123;</div><div class="line"></div><div class="line">    content:&quot;.&quot;;</div><div class="line"></div><div class="line">    height:0;</div><div class="line"></div><div class="line">    visibility:hidden;</div><div class="line"></div><div class="line">    display:block;</div><div class="line"></div><div class="line">    clear:both;</div><div class="line"></div><div class="line">    &#125;</div><div class="line"></div><div class="line">3,浮动外部元素</div><div class="line"></div><div class="line">4,设置overflow为hidden或者auto</div></pre></td></tr></table></figure>
<h4 id="DOM操作——怎样添加、移除、移动、复制、创建和查找节点。"><a href="#DOM操作——怎样添加、移除、移动、复制、创建和查找节点。" class="headerlink" title="DOM操作——怎样添加、移除、移动、复制、创建和查找节点。"></a>DOM操作——怎样添加、移除、移动、复制、创建和查找节点。</h4><blockquote>
<p>1）创建新节点</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">createDocumentFragment()    //创建一个DOM片段</div><div class="line"></div><div class="line">createElement()   //创建一个具体的元素</div><div class="line"></div><div class="line">createTextNode()   //创建一个文本节点</div></pre></td></tr></table></figure>
<blockquote>
<p>2）添加、移除、替换、插入</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">appendChild()</div><div class="line"></div><div class="line">removeChild()</div><div class="line"></div><div class="line">replaceChild()</div><div class="line"></div><div class="line">insertBefore() //并没有insertAfter()</div></pre></td></tr></table></figure>
<blockquote>
<p>3）查找</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">getElementsByTagName()    //通过标签名称</div><div class="line"></div><div class="line">getElementsByName()    //通过元素的Name属性的值(IE容错能力较强，</div><div class="line">会得到一个数组，其中包括id等于name值的)</div><div class="line"></div><div class="line">getElementById()    //通过元素Id，唯一性</div></pre></td></tr></table></figure>
<h4 id="html5有哪些新特性、移除了那些元素？如何处理HTML5新标签的浏览器兼容问题？如何区分-HTML-和-HTML5？"><a href="#html5有哪些新特性、移除了那些元素？如何处理HTML5新标签的浏览器兼容问题？如何区分-HTML-和-HTML5？" class="headerlink" title="html5有哪些新特性、移除了那些元素？如何处理HTML5新标签的浏览器兼容问题？如何区分 HTML 和 HTML5？"></a>html5有哪些新特性、移除了那些元素？如何处理HTML5新标签的浏览器兼容问题？如何区分 HTML 和 HTML5？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div></pre></td><td class="code"><pre><div class="line">HTML5 现在已经不是 SGML 的子集，主要是关于图像，位置，存储，多任务等功能的增加。</div><div class="line"></div><div class="line">拖拽释放(Drag and drop) API</div><div class="line"></div><div class="line">语义化更好的内容标签（header,nav,footer,aside,article,section）</div><div class="line"></div><div class="line">音频、视频API(audio,video)</div><div class="line"></div><div class="line">画布(Canvas) API</div><div class="line"></div><div class="line">地理(Geolocation) API</div><div class="line"></div><div class="line">本地离线存储 localStorage 长期存储数据，浏览器关闭后数据不丢失；</div><div class="line"></div><div class="line">sessionStorage 的数据在浏览器关闭后自动删除</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">表单控件，calendar、date、time、email、url、search</div><div class="line"></div><div class="line">新的技术webworker, websocket, Geolocation</div></pre></td></tr></table></figure>
<blockquote>
<p>移除的元素</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">纯表现的元素：basefont，big，center，font, s，strike，tt，u；</div><div class="line"></div><div class="line">对可用性产生负面影响的元素：frame，frameset，noframes；</div></pre></td></tr></table></figure>
<blockquote>
<p>支持HTML5新标签：</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line"></div><div class="line">IE8/IE7/IE6支持通过document.createElement方法产生的标签，</div><div class="line"></div><div class="line">可以利用这一特性让这些浏览器支持HTML5新标签，</div><div class="line"></div><div class="line">当然最好的方式是直接使用成熟的框架、使用最多的是html5shim框架</div><div class="line"></div><div class="line">   &lt;!--[if lt IE 9]&gt;</div><div class="line"></div><div class="line">   &lt;script&gt; src=&quot;http://html5shim.googlecode.com/svn/trunk/html5.js&quot;&lt;/script&gt;</div><div class="line"></div><div class="line">   &lt;![endif]--&gt;</div><div class="line"></div><div class="line">如何区分： DOCTYPE声明\新增的结构元素\功能元素</div></pre></td></tr></table></figure>
<h4 id="如何实现浏览器内多个标签页之间的通信"><a href="#如何实现浏览器内多个标签页之间的通信" class="headerlink" title="如何实现浏览器内多个标签页之间的通信?"></a>如何实现浏览器内多个标签页之间的通信?</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">调用localstorge、cookies等本地存储方式</div></pre></td></tr></table></figure>
<h4 id="什么是-FOUC（无样式内容闪烁）？你如何来避免-FOUC？"><a href="#什么是-FOUC（无样式内容闪烁）？你如何来避免-FOUC？" class="headerlink" title="什么是 FOUC（无样式内容闪烁）？你如何来避免 FOUC？"></a>什么是 FOUC（无样式内容闪烁）？你如何来避免 FOUC？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"> FOUC - Flash Of Unstyled Content 文档样式闪烁</div><div class="line"></div><div class="line"> &lt;style type=&quot;text/css&quot; media=&quot;all&quot;&gt;@import &quot;../fouc.css&quot;;&lt;/style&gt;</div><div class="line"></div><div class="line">而引用CSS文件的@import就是造成这个问题的罪魁祸首。IE会先加载整个HTML文档的DOM，然后再去导入外部的CSS文件，因此，在页面DOM加载完成到CSS导入完成中间会有一段时间页面上的内容是没有样式的，这段时间的长短跟网速，电脑速度都有关系。</div><div class="line"></div><div class="line"> 解决方法简单的出奇，只要在&lt;head&gt;之间加入一个&lt;link&gt;或者&lt;script&gt;元素就可以了。</div></pre></td></tr></table></figure>
<h4 id="null和undefined的区别？"><a href="#null和undefined的区别？" class="headerlink" title="null和undefined的区别？"></a>null和undefined的区别？</h4><p><code>null</code>是一个表示”无”的对象，转为数值时为0；<code>undefined</code>是一个表示”无”的原始值，转为数值时为<code>NaN</code>。</p>
<p>当声明的变量还未被初始化时，变量的默认值为<code>undefined</code>。</p>
<p><code>null</code>用来表示尚未存在的对象，常用来表示函数企图返回一个不存在的对象。</p>
<p><code>undefined</code>表示”缺少值”，就是此处应该有一个值，但是还没有定义。典型用法是：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">（1）变量被声明了，但没有赋值时，就等于undefined。</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">（2) 调用函数时，应该提供的参数没有提供，该参数等于undefined。</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">（3）对象没有赋值的属性，该属性的值为undefined。</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">（4）函数没有返回值时，默认返回undefined。</div></pre></td></tr></table></figure>
<p><code>null</code>表示”没有对象”，即该处不应该有值。典型用法是：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">（1） 作为函数的参数，表示该函数的参数不是对象。</div><div class="line"></div><div class="line">（2） 作为对象原型链的终点。</div></pre></td></tr></table></figure>
<h4 id="new操作符具体干了什么呢"><a href="#new操作符具体干了什么呢" class="headerlink" title="new操作符具体干了什么呢?"></a>new操作符具体干了什么呢?</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">1、创建一个空对象，并且 this 变量引用该对象，同时还继承了该函数的原型。</div><div class="line"></div><div class="line">2、属性和方法被加入到 this 引用的对象中。</div><div class="line"></div><div class="line">3、新创建的对象由 this 所引用，并且最后隐式的返回 this 。</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">var obj  = &#123;&#125;;</div><div class="line"></div><div class="line">obj.__proto__ = Base.prototype;</div><div class="line"></div><div class="line">Base.call(obj);</div></pre></td></tr></table></figure>
<h4 id="js延迟加载的方式有哪些？"><a href="#js延迟加载的方式有哪些？" class="headerlink" title="js延迟加载的方式有哪些？"></a>js延迟加载的方式有哪些？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">defer和async、动态创建DOM方式（创建script，插入到DOM中，加载完毕后callBack）、按需异步载入js</div></pre></td></tr></table></figure>
<h4 id="call-和-apply-的区别和作用？"><a href="#call-和-apply-的区别和作用？" class="headerlink" title="call() 和 apply() 的区别和作用？"></a><code>call()</code> 和 <code>apply()</code> 的区别和作用？</h4><p>作用：动态改变某个类的某个方法的运行环境（执行上下文）。</p>
<p>区别参见：<a href="http://segmentfault.com/blog/trigkit4/1190000000660786#articleHeader15" target="_blank" rel="external">JavaScript学习总结（四）function函数部分</a></p>
<h4 id="哪些操作会造成内存泄漏？"><a href="#哪些操作会造成内存泄漏？" class="headerlink" title="哪些操作会造成内存泄漏？"></a>哪些操作会造成内存泄漏？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">内存泄漏指任何对象在您不再拥有或需要它之后仍然存在。</div><div class="line"></div><div class="line">垃圾回收器定期扫描对象，并计算引用了每个对象的其他对象的数量。如果一个对象的引用数量为 0（没有其他对象引用过该对象），或对该对象的惟一引用是循环的，那么该对象的内存即可回收。</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">setTimeout 的第一个参数使用字符串而非函数的话，会引发内存泄漏。</div><div class="line"></div><div class="line">闭包、控制台日志、循环（在两个对象彼此引用且彼此保留时，就会产生一个循环）</div></pre></td></tr></table></figure>
<p>详见：<a href="http://segmentfault.com/blog/trigkit4/1190000000687844" target="_blank" rel="external">详解js变量、作用域及内存</a></p>
<h4 id="列举IE-与其他浏览器不一样的特性？"><a href="#列举IE-与其他浏览器不一样的特性？" class="headerlink" title="列举IE 与其他浏览器不一样的特性？"></a>列举IE 与其他浏览器不一样的特性？</h4><ul>
<li><p>IE支持<code>currentStyle</code>，FIrefox使用<code>getComputStyle</code></p>
</li>
<li><p>IE 使用<code>innerText</code>，Firefox使用<code>textContent</code></p>
</li>
<li><p>滤镜方面：IE:<code>filter:alpha(opacity= num)</code>；Firefox：<code>-moz-opacity:num</code></p>
</li>
<li><p>事件方面：IE：<code>attachEvent</code>：火狐是<code>addEventListener</code></p>
</li>
<li><p>鼠标位置：IE是<code>event.clientX</code>；火狐是<code>event.pageX</code></p>
</li>
<li><p>IE使用<code>event.srcElement</code>；Firefox使用<code>event.target</code></p>
</li>
<li><p>IE中消除list的原点仅需margin:0即可达到最终效果；FIrefox需要设置<code>margin:0;padding:0以及list-style:none</code></p>
</li>
<li><p>CSS圆角：ie7以下不支持圆角</p>
</li>
</ul>
<h4 id="WEB应用从服务器主动推送Data到客户端有那些方式？"><a href="#WEB应用从服务器主动推送Data到客户端有那些方式？" class="headerlink" title="WEB应用从服务器主动推送Data到客户端有那些方式？"></a>WEB应用从服务器主动推送Data到客户端有那些方式？</h4><p>Javascript数据推送</p>
<ul>
<li><p><code>Commet</code>：基于HTTP长连接的服务器推送技术</p>
</li>
<li><p>基于<code>WebSocket</code>的推送方案</p>
</li>
<li><p><code>SSE</code>（Server-Send Event）：服务器推送数据新方式</p>
</li>
</ul>
<h4 id="对前端界面工程师这个职位是怎么样理解的？它的前景会怎么样？"><a href="#对前端界面工程师这个职位是怎么样理解的？它的前景会怎么样？" class="headerlink" title="对前端界面工程师这个职位是怎么样理解的？它的前景会怎么样？"></a>对前端界面工程师这个职位是怎么样理解的？它的前景会怎么样？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">前端是最贴近用户的程序员，比后端、数据库、产品经理、运营、安全都近。</div><div class="line"></div><div class="line">    1、实现界面交互</div><div class="line"></div><div class="line">    2、提升用户体验</div><div class="line"></div><div class="line">    3、有了Node.js，前端可以实现服务端的一些事情</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">前端是最贴近用户的程序员，前端的能力就是能让产品从 90分进化到 100 分，甚至更好，</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">参与项目，快速高质量完成实现效果图，精确到1px；</div><div class="line"></div><div class="line">与团队成员，UI设计，产品经理的沟通；</div><div class="line"></div><div class="line">做好的页面结构，页面重构和用户体验；</div><div class="line"></div><div class="line">处理hack，兼容、写出优美的代码格式；</div><div class="line"></div><div class="line">针对服务器的优化、拥抱最新前端技术。</div></pre></td></tr></table></figure>
<h4 id="一个页面从输入-URL-到页面加载显示完成，这个过程中都发生了什么？"><a href="#一个页面从输入-URL-到页面加载显示完成，这个过程中都发生了什么？" class="headerlink" title="一个页面从输入 URL 到页面加载显示完成，这个过程中都发生了什么？"></a>一个页面从输入 URL 到页面加载显示完成，这个过程中都发生了什么？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">分为4个步骤：</div><div class="line"></div><div class="line">（1），当发送一个URL请求时，不管这个URL是Web页面的URL还是Web页面上每个资源的URL，浏览器都会开启一个线程来处理这个请求，同时在远程DNS服务器上启动一个DNS查询。这能使浏览器获得请求对应的IP地址。</div><div class="line"></div><div class="line">（2）， 浏览器与远程`Web`服务器通过`TCP`三次握手协商来建立一个`TCP/IP`连接。该握手包括一个同步报文，一个同步-应答报文和一个应答报文，这三个报文在 浏览器和服务器之间传递。该握手首先由客户端尝试建立起通信，而后服务器应答并接受客户端的请求，最后由客户端发出该请求已经被接受的报文。</div><div class="line"></div><div class="line">（3），一旦`TCP/IP`连接建立，浏览器会通过该连接向远程服务器发送`HTTP`的`GET`请求。远程服务器找到资源并使用HTTP响应返回该资源，值为200的HTTP响应状态表示一个正确的响应。</div><div class="line"></div><div class="line">（4），此时，`Web`服务器提供资源服务，客户端开始下载资源。</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">请求返回后，便进入了我们关注的前端模块</div><div class="line"></div><div class="line">简单来说，浏览器会解析`HTML`生成`DOM Tree`，其次会根据CSS生成CSS Rule Tree，而`javascript`又可以根据`DOM API`操作`DOM`</div></pre></td></tr></table></figure>
<p>详情：<a href="http://segmentfault.com/blog/trigkit4/1190000000697254" target="_blank" rel="external">从输入 URL 到浏览器接收的过程中发生了什么事情？</a></p>
<h4 id="javascript对象的几种创建方式"><a href="#javascript对象的几种创建方式" class="headerlink" title="javascript对象的几种创建方式"></a>javascript对象的几种创建方式</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">1，工厂模式</div><div class="line"></div><div class="line">2，构造函数模式</div><div class="line"></div><div class="line">3，原型模式</div><div class="line"></div><div class="line">4，混合构造函数和原型模式</div><div class="line"></div><div class="line">5，动态原型模式</div><div class="line"></div><div class="line">6，寄生构造函数模式</div><div class="line"></div><div class="line">7，稳妥构造函数模式</div></pre></td></tr></table></figure>
<h4 id="javascript继承的6种方法"><a href="#javascript继承的6种方法" class="headerlink" title="javascript继承的6种方法"></a>javascript继承的6种方法</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">1，原型链继承</div><div class="line"></div><div class="line">2，借用构造函数继承</div><div class="line"></div><div class="line">3，组合继承(原型+借用构造)</div><div class="line"></div><div class="line">4，原型式继承</div><div class="line"></div><div class="line">5，寄生式继承</div><div class="line"></div><div class="line">6，寄生组合式继承</div></pre></td></tr></table></figure>
<p>详情：<a href="http://segmentfault.com/blog/trigkit4/1190000002440502" target="_blank" rel="external">JavaScript继承方式详解</a></p>
<h4 id="创建ajax的过程"><a href="#创建ajax的过程" class="headerlink" title="创建ajax的过程"></a>创建ajax的过程</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div></pre></td><td class="code"><pre><div class="line">(1)创建`XMLHttpRequest`对象,也就是创建一个异步调用对象.</div><div class="line"></div><div class="line">(2)创建一个新的`HTTP`请求,并指定该`HTTP`请求的方法、`URL`及验证信息.</div><div class="line"></div><div class="line">(3)设置响应`HTTP`请求状态变化的函数.</div><div class="line"></div><div class="line">(4)发送`HTTP`请求.</div><div class="line"></div><div class="line">(5)获取异步调用返回的数据.</div><div class="line"></div><div class="line">(6)使用JavaScript和DOM实现局部刷新.</div><div class="line"></div><div class="line">var xmlHttp = new XMLHttpRequest();</div><div class="line"></div><div class="line">xmlHttp.open(&apos;GET&apos;,&apos;demo.php&apos;,&apos;true&apos;);</div><div class="line"></div><div class="line">xmlHttp.send()</div><div class="line"></div><div class="line">xmlHttp.onreadystatechange = function()&#123;</div><div class="line"></div><div class="line">    if(xmlHttp.readyState === 4 &amp; xmlHttp.status === 200)&#123;</div><div class="line"></div><div class="line">    &#125;</div><div class="line"></div><div class="line">&#125;</div></pre></td></tr></table></figure>
<p>详情：<a href="http://segmentfault.com/blog/trigkit4/1190000000691919" target="_blank" rel="external">JavaScript学习总结（七）Ajax和Http状态字</a></p>
<h4 id="异步加载和延迟加载"><a href="#异步加载和延迟加载" class="headerlink" title="异步加载和延迟加载"></a>异步加载和延迟加载</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">1.异步加载的方案： 动态插入script标签</div><div class="line"></div><div class="line">2.通过ajax去获取js代码，然后通过eval执行</div><div class="line"></div><div class="line">3.script标签上添加defer或者async属性</div><div class="line"></div><div class="line">4.创建并插入iframe，让它异步执行js</div><div class="line"></div><div class="line">5.延迟加载：有些 js 代码并不是页面初始化的时候就立刻需要的，而稍后的某些情况才需要的。</div></pre></td></tr></table></figure>
<h4 id="ie各版本和chrome可以并行下载多少个资源"><a href="#ie各版本和chrome可以并行下载多少个资源" class="headerlink" title="ie各版本和chrome可以并行下载多少个资源"></a>ie各版本和chrome可以并行下载多少个资源</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">IE6 两个并发，iE7升级之后的6个并发，之后版本也是6个</div><div class="line">Firefox，chrome也是6个</div></pre></td></tr></table></figure>
<h4 id="Flash、Ajax各自的优缺点，在使用中如何取舍？"><a href="#Flash、Ajax各自的优缺点，在使用中如何取舍？" class="headerlink" title="Flash、Ajax各自的优缺点，在使用中如何取舍？"></a><code>Flash</code>、<code>Ajax</code>各自的优缺点，在使用中如何取舍？</h4><ul>
<li><code>Flash</code>适合处理多媒体、矢量图形、访问机器；对<code>CSS</code>、处理文本上不足，不容易被搜索。</li>
</ul>
<ul>
<li><code>Ajax</code>对<code>CSS</code>、文本支持很好，支持搜索；多媒体、矢量图形、机器访问不足。</li>
</ul>
<ul>
<li>共同点：与服务器的无刷新传递消息、用户离线和在线状态、操作DOM</li>
</ul>
<h4 id="请解释一下-JavaScript-的同源策略。"><a href="#请解释一下-JavaScript-的同源策略。" class="headerlink" title="请解释一下 JavaScript 的同源策略。"></a>请解释一下 JavaScript 的同源策略。</h4><p>概念:同源策略是客户端脚本（尤其是<code>Javascript</code>）的重要的安全度量标准。它最早出自<code>Netscape Navigator2.0</code>，其目的是防止某个文档或脚本从多个不同源装载。</p>
<p>这里的同源策略指的是：协议，域名，端口相同，同源策略是一种安全协议。</p>
<p>指一段脚本只能读取来自同一来源的窗口和文档的属性。</p>
<h4 id="为什么要有同源限制？"><a href="#为什么要有同源限制？" class="headerlink" title="为什么要有同源限制？"></a>为什么要有同源限制？</h4><p>我们举例说明：比如一个黑客程序，他利用<code>Iframe</code>把真正的银行登录页面嵌到他的页面上，当你使用真实的用户名，密码登录时，他的页面就可以通过<code>Javascript</code>读取到你的表单中<code>input</code>中的内容，这样用户名，密码就轻松到手了。</p>
<p>缺点：</p>
<p>现在网站的<code>JS</code> 都会进行压缩，一些文件用了严格模式，而另一些没有。这时这些本来是严格模式的文件，被 <code>merge</code> 后，这个串就到了文件的中间，不仅没有指示严格模式，反而在压缩后浪费了字节。</p>
<h4 id="GET和POST的区别，何时使用POST？"><a href="#GET和POST的区别，何时使用POST？" class="headerlink" title="GET和POST的区别，何时使用POST？"></a>GET和POST的区别，何时使用POST？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">GET：一般用于信息获取，使用URL传递参数，对所发送信息的数量也有限制，一般在2000个字符</div><div class="line"></div><div class="line">POST：一般用于修改服务器上的资源，对所发送的信息没有限制。</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">GET方式需要使用Request.QueryString来取得变量的值，而POST方式通过Request.Form来获取变量的值，</div><div class="line"></div><div class="line">也就是说Get是通过地址栏来传值，而Post是通过提交表单来传值。</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">然而，在以下情况中，请使用 POST 请求：</div><div class="line"></div><div class="line">无法使用缓存文件（更新服务器上的文件或数据库）</div><div class="line"></div><div class="line">向服务器发送大量数据（POST 没有数据量限制）</div><div class="line"></div><div class="line">发送包含未知字符的用户输入时，POST 比 GET 更稳定也更可靠</div></pre></td></tr></table></figure>
<h4 id="事件、IE与火狐的事件机制有什么区别？-如何阻止冒泡？"><a href="#事件、IE与火狐的事件机制有什么区别？-如何阻止冒泡？" class="headerlink" title="事件、IE与火狐的事件机制有什么区别？ 如何阻止冒泡？"></a>事件、IE与火狐的事件机制有什么区别？ 如何阻止冒泡？</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">1. 我们在网页中的某个操作（有的操作对应多个事件）。例如：当我们点击一个按钮就会产生一个事件。是可以被 JavaScript 侦测到的行为。</div><div class="line"></div><div class="line">2. 事件处理机制：IE是事件冒泡、firefox同时支持两种事件模型，也就是：捕获型事件和冒泡型事件。；</div><div class="line"></div><div class="line">3. `ev.stopPropagation()`;注意旧ie的方法 `ev.cancelBubble = true`;</div></pre></td></tr></table></figure>
<h4 id="ajax的缺点和在IE下的问题？"><a href="#ajax的缺点和在IE下的问题？" class="headerlink" title="ajax的缺点和在IE下的问题？"></a>ajax的缺点和在IE下的问题？</h4><p>详情请见：<a href="http://segmentfault.com/blog/trigkit4/1190000000691919" target="_blank" rel="external">JavaScript学习总结（七）Ajax和Http状态字</a></p>
<blockquote>
<p>ajax的缺点</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">1、ajax不支持浏览器back按钮。</div><div class="line"></div><div class="line">2、安全问题 AJAX暴露了与服务器交互的细节。</div><div class="line"></div><div class="line">3、对搜索引擎的支持比较弱。</div><div class="line"></div><div class="line">4、破坏了程序的异常机制。</div><div class="line"></div><div class="line">5、不容易调试。</div></pre></td></tr></table></figure>
<blockquote>
<p>IE缓存问题</p>
</blockquote>
<p>在IE浏览器下，如果请求的方法是<code>GET</code>，并且请求的<code>URL</code>不变，那么这个请求的结果就会被缓存。解决这个问题的办法可以通过实时改变请求的<code>URL</code>，只要URL改变，就不会被缓存，可以通过在URL末尾添加上随机的时间戳参数(<code>&#39;t&#39;= + new Date().getTime()</code>)</p>
<p>或者：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">open(&apos;GET&apos;,&apos;demo.php?rand=+Math.random()&apos;,true);//</div></pre></td></tr></table></figure>
<blockquote>
<p>Ajax请求的页面历史记录状态问题</p>
</blockquote>
<p>可以通过锚点来记录状态，<code>location.hash</code>。让浏览器记录Ajax请求时页面状态的变化。</p>
<p>还可以通过<code>HTML5</code>的<code>history.pushState</code>，来实现浏览器地址栏的无刷新改变</p>
<h4 id="谈谈你对重构的理解"><a href="#谈谈你对重构的理解" class="headerlink" title="谈谈你对重构的理解"></a>谈谈你对重构的理解</h4><p>网站重构：在不改变外部行为的前提下，简化结构、添加可读性，而在网站前端保持一致的行为。也就是说是在不改变UI的情况下，对网站进行优化，
在扩展的同时保持一致的UI。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div></pre></td><td class="code"><pre><div class="line">对于传统的网站来说重构通常是：</div><div class="line"></div><div class="line">表格(table)布局改为DIV+CSS</div><div class="line"></div><div class="line">使网站前端兼容于现代浏览器(针对于不合规范的CSS、如对IE6有效的)</div><div class="line"></div><div class="line">对于移动平台的优化</div><div class="line"></div><div class="line">针对于SEO进行优化</div><div class="line"></div><div class="line">深层次的网站重构应该考虑的方面</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">减少代码间的耦合</div><div class="line"></div><div class="line">让代码保持弹性</div><div class="line"></div><div class="line">严格按规范编写代码</div><div class="line"></div><div class="line">设计可扩展的API</div><div class="line"></div><div class="line">代替旧有的框架、语言(如VB)</div><div class="line"></div><div class="line">增强用户体验</div><div class="line"></div><div class="line">通常来说对于速度的优化也包含在重构中</div></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">压缩JS、CSS、image等前端资源(通常是由服务器来解决)</div><div class="line"></div><div class="line">程序的性能优化(如数据读写)</div><div class="line"></div><div class="line">采用CDN来加速资源加载</div><div class="line"></div><div class="line">对于JS DOM的优化</div><div class="line"></div><div class="line">HTTP服务器的文件缓存</div></pre></td></tr></table></figure>
<h4 id="HTTP状态码"><a href="#HTTP状态码" class="headerlink" title="HTTP状态码"></a>HTTP状态码</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div></pre></td><td class="code"><pre><div class="line"></div><div class="line">100  Continue  继续，一般在发送post请求时，已发送了http header之后服务端将返回此信息，表示确认，之后发送具体参数信息</div><div class="line"></div><div class="line">200  OK   正常返回信息</div><div class="line"></div><div class="line">201  Created  请求成功并且服务器创建了新的资源</div><div class="line"></div><div class="line">202  Accepted  服务器已接受请求，但尚未处理</div><div class="line"></div><div class="line">301  Moved Permanently  请求的网页已永久移动到新位置。</div><div class="line"></div><div class="line">302 Found  临时性重定向。</div><div class="line"></div><div class="line">303 See Other  临时性重定向，且总是使用 GET 请求新的 URI。</div><div class="line"></div><div class="line">304  Not Modified  自从上次请求后，请求的网页未修改过。</div><div class="line"></div><div class="line">400 Bad Request  服务器无法理解请求的格式，客户端不应当尝试再次使用相同的内容发起请求。</div><div class="line"></div><div class="line">401 Unauthorized  请求未授权。</div><div class="line"></div><div class="line">403 Forbidden  禁止访问。</div><div class="line"></div><div class="line">404 Not Found  找不到如何与 URI 相匹配的资源。</div><div class="line"></div><div class="line">500 Internal Server Error  最常见的服务器端错误。</div><div class="line"></div><div class="line">503 Service Unavailable 服务器端暂时无法处理请求（可能是过载或维护）。</div></pre></td></tr></table></figure>
<h4 id="说说你对Promise的理解"><a href="#说说你对Promise的理解" class="headerlink" title="说说你对Promise的理解"></a>说说你对Promise的理解</h4><p>依照 <code>Promise/A+</code> 的定义，<code>Promise</code> 有四种状态：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">pending: 初始状态, 非 fulfilled 或 rejected.</div><div class="line"></div><div class="line">fulfilled: 成功的操作.</div><div class="line"></div><div class="line">rejected: 失败的操作.</div><div class="line"></div><div class="line">settled: Promise已被fulfilled或rejected，且不是pending</div></pre></td></tr></table></figure>
<p>另外， <code>fulfilled</code> 与 <code>rejected</code> 一起合称 <code>settled</code>。</p>
<p><code>Promise</code> 对象用来进行延迟(deferred) 和异步(asynchronous ) 计算。</p>
<blockquote>
<p>Promise 的构造函数</p>
</blockquote>
<p>构造一个 <code>Promise</code>，最基本的用法如下：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">var promise = new Promise(function(resolve, reject) &#123;</div><div class="line"></div><div class="line">    if (...) &#123;  // succeed</div><div class="line"></div><div class="line">        resolve(result);</div><div class="line"></div><div class="line">    &#125; else &#123;   // fails</div><div class="line"></div><div class="line">        reject(Error(errMessage));</div><div class="line"></div><div class="line">    &#125;</div><div class="line">&#125;);</div></pre></td></tr></table></figure>
<p><code>Promise</code> 实例拥有 <code>then</code> 方法（具有 <code>then</code> 方法的对象，通常被称为 <code>thenable</code>）。它的使用方法如下：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">promise.then(onFulfilled, onRejected)</div></pre></td></tr></table></figure>
<p>接收两个函数作为参数，一个在 <code>fulfilled</code> 的时候被调用，一个在 <code>rejected</code> 的时候被调用，接收参数就是 <code>future，onFulfilled</code> 对应 <code>resolve</code>, <code>onRejected</code> 对应 <code>reject</code>。</p>
<h4 id="说说你对前端架构师的理解"><a href="#说说你对前端架构师的理解" class="headerlink" title="说说你对前端架构师的理解"></a>说说你对前端架构师的理解</h4><p>负责前端团队的管理及与其他团队的协调工作，提升团队成员能力和整体效率；
带领团队完成研发工具及平台前端部分的设计、研发和维护；
带领团队进行前端领域前沿技术研究及新技术调研，保证团队的技术领先
负责前端开发规范制定、功能模块化设计、公共组件搭建等工作，并组织培训。</p>
<h4 id="实现一个函数clone，可以对JavaScript中的5种主要的数据类型（包括Number、String、Object、Array、Boolean）进行值复制"><a href="#实现一个函数clone，可以对JavaScript中的5种主要的数据类型（包括Number、String、Object、Array、Boolean）进行值复制" class="headerlink" title="实现一个函数clone，可以对JavaScript中的5种主要的数据类型（包括Number、String、Object、Array、Boolean）进行值复制"></a>实现一个函数clone，可以对JavaScript中的5种主要的数据类型（包括Number、String、Object、Array、Boolean）进行值复制</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line">Object.prototype.clone = function()&#123;</div><div class="line"></div><div class="line">        var o = this.constructor === Array ? [] : &#123;&#125;;</div><div class="line"></div><div class="line">        for(var e in this)&#123;</div><div class="line"></div><div class="line">                o[e] = typeof this[e] === &quot;object&quot; ? this[e].clone() : this[e];</div><div class="line"></div><div class="line">        &#125;</div><div class="line"></div><div class="line">        return o;</div><div class="line">&#125;</div></pre></td></tr></table></figure>
<h4 id="说说严格模式的限制"><a href="#说说严格模式的限制" class="headerlink" title="说说严格模式的限制"></a>说说严格模式的限制</h4><p>严格模式主要有以下限制：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div></pre></td><td class="code"><pre><div class="line">变量必须声明后再使用</div><div class="line"></div><div class="line">函数的参数不能有同名属性，否则报错</div><div class="line"></div><div class="line">不能使用with语句</div><div class="line"></div><div class="line">不能对只读属性赋值，否则报错</div><div class="line"></div><div class="line">不能使用前缀0表示八进制数，否则报错</div><div class="line"></div><div class="line">不能删除不可删除的属性，否则报错</div><div class="line"></div><div class="line">不能删除变量delete prop，会报错，只能删除属性delete global[prop]</div><div class="line"></div><div class="line">eval不会在它的外层作用域引入变量</div><div class="line"></div><div class="line">eval和arguments不能被重新赋值</div><div class="line"></div><div class="line">arguments不会自动反映函数参数的变化</div><div class="line"></div><div class="line">不能使用arguments.callee</div><div class="line"></div><div class="line">不能使用arguments.caller</div><div class="line"></div><div class="line">禁止this指向全局对象</div><div class="line"></div><div class="line">不能使用fn.caller和fn.arguments获取函数调用的堆栈</div><div class="line"></div><div class="line">增加了保留字（比如protected、static和interface）</div></pre></td></tr></table></figure>
<p>设立”严格模式”的目的，主要有以下几个：</p>
<ul>
<li><p>消除<code>Javascript</code>语法的一些不合理、不严谨之处，减少一些怪异行为;</p>
</li>
<li><p>消除代码运行的一些不安全之处，保证代码运行的安全；</p>
</li>
<li><p>提高编译器效率，增加运行速度；</p>
</li>
<li><p>为未来新版本的<code>Javascript</code>做好铺垫。</p>
</li>
</ul>
<p>注：经过测试<code>IE6,7,8,9</code>均不支持严格模式。</p>
<h4 id="如何删除一个cookie"><a href="#如何删除一个cookie" class="headerlink" title="如何删除一个cookie"></a>如何删除一个cookie</h4><blockquote>
<p>1.将时间设为当前时间往前一点。</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">var date = new Date();</div><div class="line"></div><div class="line">date.setDate(date.getDate() - 1);//真正的删除</div></pre></td></tr></table></figure>
<p><code>setDate()</code> 方法用于设置一个月的某一天。</p>
<blockquote>
<p>2.expires的设置</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">document.cookie = &apos;user=&apos;+ encodeURIComponent(&apos;name&apos;)  + &apos;;expires = &apos; + new Date(0)</div></pre></td></tr></table></figure>
<h4 id="lt-strong-gt-，-lt-em-gt-和-lt-b-gt-，-lt-i-gt-标签"><a href="#lt-strong-gt-，-lt-em-gt-和-lt-b-gt-，-lt-i-gt-标签" class="headerlink" title="&lt;strong&gt;，&lt;em&gt;和&lt;b&gt;，&lt;i&gt;标签"></a><code>&lt;strong&gt;</code>，<code>&lt;em&gt;</code>和<code>&lt;b&gt;</code>，<code>&lt;i&gt;</code>标签</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">&lt;strong&gt; 标签和 &lt;em&gt; 标签一样，用于强调文本，但它强调的程度更强一些。</div><div class="line"></div><div class="line">em 是 斜体强调标签，更强烈强调，表示内容的强调点。相当于html元素中的 &lt;i&gt;...&lt;/i&gt;;</div><div class="line"></div><div class="line">&lt; b &gt; &lt; i &gt;是视觉要素，分别表示无意义的加粗，无意义的斜体。</div><div class="line"></div><div class="line">em 和 strong 是表达要素(phrase elements)。</div></pre></td></tr></table></figure>
<h4 id="说说你对AMD和Commonjs的理解"><a href="#说说你对AMD和Commonjs的理解" class="headerlink" title="说说你对AMD和Commonjs的理解"></a>说说你对AMD和Commonjs的理解</h4><p><code>CommonJS</code>是服务器端模块的规范，Node.js采用了这个规范。<code>CommonJS</code>规范加载模块是同步的，也就是说，只有加载完成，才能执行后面的操作。AMD规范则是非同步加载模块，允许指定回调函数。</p>
<p><code>AMD</code>推荐的风格通过返回一个对象做为模块对象，<code>CommonJS</code>的风格通过对<code>module.exports</code>或<code>exports</code>的属性赋值来达到暴露模块对象的目的。</p>
<blockquote>
<p>详情：<a href="https://segmentfault.com/a/1190000004888589" target="_blank" rel="external">也谈webpack及其开发模式</a></p>
</blockquote>
<h4 id="document-write-的用法"><a href="#document-write-的用法" class="headerlink" title="document.write()的用法"></a>document.write()的用法</h4><p><code>document.write()</code>方法可以用在两个方面：页面载入过程中用实时脚本创建页面内容，以及用延时脚本创建本窗口或新窗口的内容。</p>
<p><code>document.write</code>只能重绘整个页面。<code>innerHTML</code>可以重绘页面的一部分</p>
<h4 id="编写一个方法-求一个字符串的字节长度"><a href="#编写一个方法-求一个字符串的字节长度" class="headerlink" title="编写一个方法 求一个字符串的字节长度"></a>编写一个方法 求一个字符串的字节长度</h4><p>假设：一个英文字符占用一个字节，一个中文字符占用两个字节</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line"> function GetBytes(str)&#123;</div><div class="line"></div><div class="line">        var len = str.length;</div><div class="line"></div><div class="line">        var bytes = len;</div><div class="line"></div><div class="line">        for(var i=0; i&lt;len; i++)&#123;</div><div class="line"></div><div class="line">            if (str.charCodeAt(i) &gt; 255) bytes++;</div><div class="line"></div><div class="line">        &#125;</div><div class="line"></div><div class="line">        return bytes;</div><div class="line"></div><div class="line">    &#125;</div><div class="line"></div><div class="line">alert(GetBytes(&quot;你好,as&quot;));</div></pre></td></tr></table></figure>
<h3 id="git-fetch和git-pull的区别"><a href="#git-fetch和git-pull的区别" class="headerlink" title="git fetch和git pull的区别"></a>git fetch和git pull的区别</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">git pull：相当于是从远程获取最新版本并merge到本地</div><div class="line"></div><div class="line">git fetch：相当于是从远程获取最新版本到本地，不会自动merge</div></pre></td></tr></table></figure>
<h4 id="说说你对MVC和MVVM的理解"><a href="#说说你对MVC和MVVM的理解" class="headerlink" title="说说你对MVC和MVVM的理解"></a>说说你对MVC和MVVM的理解</h4><blockquote>
<p><code>MVC</code></p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">View 传送指令到 Controller</div><div class="line"></div><div class="line">Controller 完成业务逻辑后，要求 Model 改变状态</div><div class="line"></div><div class="line">Model 将新的数据发送到 View，用户得到反馈</div></pre></td></tr></table></figure>
<p>所有通信都是单向的。</p>
<p><code>Angular</code>它采用双向绑定（data-binding）：<code>View</code>的变动，自动反映在 <code>ViewModel</code>，反之亦然。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line">组成部分Model、View、ViewModel</div><div class="line"></div><div class="line">View：UI界面</div><div class="line"></div><div class="line">ViewModel：它是View的抽象，负责View与Model之间信息转换，将View的Command传送到Model；</div><div class="line"></div><div class="line">Model：数据访问层</div></pre></td></tr></table></figure>
<h4 id="请解释什么是事件代理"><a href="#请解释什么是事件代理" class="headerlink" title="请解释什么是事件代理"></a>请解释什么是事件代理</h4><p>事件代理（Event Delegation），又称之为事件委托。是 <code>JavaScript</code> 中常用绑定事件的常用技巧。顾名思义，“事件代理”即是把原本需要绑定的事件委托给父元素，让父元素担当事件监听的职务。事件代理的原理是<code>DOM</code>元素的事件冒泡。使用事件代理的好处是可以提高性能。</p>
<h4 id="attribute和property的区别是什么？"><a href="#attribute和property的区别是什么？" class="headerlink" title="attribute和property的区别是什么？"></a>attribute和property的区别是什么？</h4><p><code>attribute</code>是<code>dom</code>元素在文档中作为<code>html</code>标签拥有的属性；</p>
<p><code>property</code>就是<code>dom</code>元素在<code>js</code>中作为对象拥有的属性。</p>
<p>所以：</p>
<p>对于<code>html</code>的标准属性来说，<code>attribute</code>和<code>property</code>是同步的，是会自动更新的，</p>
<p>但是对于自定义的属性来说，他们是不同步的，</p>
<h4 id="说说网络分层里七层模型是哪七层"><a href="#说说网络分层里七层模型是哪七层" class="headerlink" title="说说网络分层里七层模型是哪七层"></a>说说网络分层里七层模型是哪七层</h4><ul>
<li><p>应用层：应用层、表示层、会话层（从上往下）（<code>HTTP、FTP、SMTP、DNS</code>）</p>
</li>
<li><p>传输层（<code>TCP</code>和<code>UDP</code>）</p>
</li>
<li><p>网络层（<code>IP</code>）</p>
</li>
<li><p>物理和数据链路层（以太网）</p>
</li>
</ul>
<blockquote>
<p>每一层的作用如下：</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line"></div><div class="line">物理层：通过媒介传输比特,确定机械及电气规范（比特Bit）</div><div class="line">数据链路层：将比特组装成帧和点到点的传递（帧Frame）</div><div class="line">网络层：负责数据包从源到宿的传递和网际互连（包PackeT）</div><div class="line">传输层：提供端到端的可靠报文传递和错误恢复（段Segment）</div><div class="line">会话层：建立、管理和终止会话（会话协议数据单元SPDU）</div><div class="line">表示层：对数据进行翻译、加密和压缩（表示协议数据单元PPDU）</div><div class="line">应用层：允许访问OSI环境的手段（应用协议数据单元APDU）</div></pre></td></tr></table></figure>
<blockquote>
<p>各种协议</p>
</blockquote>
<p><code>ICMP协议</code>： 因特网控制报文协议。它是TCP/IP协议族的一个子协议，用于在IP主机、路由器之间传递控制消息。
<code>TFTP协议</code>： 是TCP/IP协议族中的一个用来在客户机与服务器之间进行简单文件传输的协议，提供不复杂、开销不大的文件传输服务。
<code>HTTP协议</code>： 超文本传输协议，是一个属于应用层的面向对象的协议，由于其简捷、快速的方式，适用于分布式超媒体信息系统。
<code>DHCP协议</code>： 动态主机配置协议，是一种让系统得以连接到网络上，并获取所需要的配置参数手段。</p>
<h4 id="说说mongoDB和MySQL的区别"><a href="#说说mongoDB和MySQL的区别" class="headerlink" title="说说mongoDB和MySQL的区别"></a>说说mongoDB和MySQL的区别</h4><p><code>MySQL</code>是传统的关系型数据库，<code>MongoDB</code>则是非关系型数据库</p>
<p><code>mongodb</code>以<code>BSON</code>结构（二进制）进行存储，对海量数据存储有着很明显的优势。</p>
<p>对比传统关系型数据库,NoSQL有着非常显著的性能和扩展性优势，与关系型数据库相比，MongoDB的优点有：
①弱一致性（最终一致），更能保证用户的访问速度：
②文档结构的存储方式，能够更便捷的获取数据。</p>
<h4 id="讲讲304缓存的原理"><a href="#讲讲304缓存的原理" class="headerlink" title="讲讲304缓存的原理"></a>讲讲304缓存的原理</h4><p>服务器首先产生<code>ETag</code>，服务器可在稍后使用它来判断页面是否已经被修改。本质上，客户端通过将该记号传回服务器要求服务器验证其（客户端）缓存。</p>
<p>304是HTTP状态码，服务器用来标识这个文件没修改，不返回内容，浏览器在接收到个状态码后，会使用浏览器已缓存的文件</p>
<p>客户端请求一个页面（A）。 服务器返回页面A，并在给<code>A</code>加上一个<code>ETag</code>。 客户端展现该页面，并将页面连同<code>ETag</code>一起缓存。 客户再次请求页面<code>A</code>，并将上次请求时服务器返回的<code>ETag</code>一起传递给服务器。 服务器检查该<code>ETag</code>，并判断出该页面自上次客户端请求之后还未被修改，直接返回响应<code>304</code>（未修改——<code>Not Modified</code>）和一个空的响应体。</p>
<h4 id="什么样的前端代码是好的"><a href="#什么样的前端代码是好的" class="headerlink" title="什么样的前端代码是好的"></a>什么样的前端代码是好的</h4><p>高复用低耦合，这样文件小，好维护，而且好扩展。</p>
<h4 id="代码题"><a href="#代码题" class="headerlink" title="代码题"></a>代码题</h4><ul>
<li><p><a>css代码题</a></p>
</li>
<li><p><a>js代码题</a></p>
</li>
</ul>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/InterView/2017/02/24/前端面试题汇总1.html">http://lucylc.com/InterView/2017/02/24/前端面试题汇总1.html</a></p>
]]></content>
    
    <summary type="html">
    
      前端面试题汇，总持续更新中
    
    </summary>
    
      <category term="InterView" scheme="http://lucylc.com/categories/InterView/"/>
    
    
      <category term="InterView Question" scheme="http://lucylc.com/tags/InterView-Question/"/>
    
  </entry>
  
  <entry>
    <title>前端资源汇集</title>
    <link href="http://lucylc.com/Resources/2017/02/24/%E5%89%8D%E7%AB%AF%E8%B5%84%E6%BA%90%E6%B1%87%E9%9B%86.html"/>
    <id>http://lucylc.com/Resources/2017/02/24/前端资源汇集.html</id>
    <published>2017-02-24T00:31:07.000Z</published>
    <updated>2017-08-20T10:15:40.964Z</updated>
    
    <content type="html"><![CDATA[<a id="more"></a>
<pre><code>-  感谢本文原作者，本就有收藏&amp;分享欲，这种事儿早期也想做了，勘叹见识未广而深；幸遇这良心收集，得以借他人之酒杯，一浇我心之夙愿块垒。毕竟人为收集，并未臻于不可附加之境，还是有许多可以补充的点；因此，有特引于博客，将酌情适当**增**删些内容，一来做自己查纠探索之源，二来分享给更多朋友；好文章好工具，很多时候都**被**隐藏于犄角旮旯了，有居干货，欢请分享。
</code></pre><blockquote>
<p>原文链接：<a href="http://www.jeffjade.com/2016/03/30/104-front-end-tutorial/" target="_blank" rel="external">http://www.jeffjade.com/2016/03/30/104-front-end-tutorial/</a></p>
</blockquote>
<p><img src="http://7xoosr.com1.z0.glb.clouddn.com/sharp-weapon.jpg" alt="最全前端资源汇集"></p>
<table>
<thead>
<tr>
<th>文章目录</th>
<th>文章目录</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="#综合类">1 · 综合类</a></td>
<td><a href="#入门类">2 · 入门类</a></td>
</tr>
<tr>
<td><a href="#工具类">3 · 工具类</a></td>
<td><a href="#综合效果搜索平台">4 · 综合效果搜索平台</a></td>
</tr>
<tr>
<td><a href="#团队Blog">5 · 团队Blog</a></td>
<td><a href="#开发中心">6 · 开发中心</a></td>
</tr>
<tr>
<td><a href="#Nodejs">7 · Nodejs</a></td>
<td><a href="#综合API">8 · 综合API</a></td>
</tr>
<tr>
<td><a href="#Ecmascript">9 · Ecmascript</a></td>
<td><a href="#Vue">10 · Vue</a></td>
</tr>
<tr>
<td><a href="#Angularjs">11 · Angularjs</a></td>
<td><a href="#React">12 · React</a></td>
</tr>
<tr>
<td><a href="#Js template">13 · Js template</a></td>
<td><a href="#HTML5(HTML">14 · HTML5(HTML)</a>)</td>
</tr>
<tr>
<td><a href="#CSS3(CSS">15 · CSS3(CSS)</a>)</td>
<td><a href="#移动端API">16 · 移动端API</a></td>
</tr>
<tr>
<td><a href="#jQuery">17 · jQuery</a></td>
<td><a href="#D3">18 · D3</a></td>
</tr>
<tr>
<td><a href="#Requriejs">19 · Requriejs</a></td>
<td><a href="#Seajs">20 · Seajs</a></td>
</tr>
<tr>
<td><a href="#Less,sass">21 · Less,sass</a></td>
<td><a href="#Markdown">22 · Markdown</a></td>
</tr>
<tr>
<td><a href="#兼容性">23 · 兼容性</a></td>
<td><a href="#UI相关">24 · UI相关</a></td>
</tr>
<tr>
<td><a href="#其它API">25 · 其它API</a></td>
<td><a href="#图表类">26 · 图表类</a></td>
</tr>
<tr>
<td><a href="#正则">27 · 正则</a></td>
<td><a href="#前端规范">28 · 前端规范</a></td>
</tr>
<tr>
<td><a href="#PHP">29 · PHP</a></td>
<td><a href="#各大公司开源项目">30 · 各大公司开源项目</a></td>
</tr>
<tr>
<td><a href="#常用">31 · 常用</a></td>
<td><a href="#算法">32 · 算法</a></td>
</tr>
<tr>
<td><a href="#移动端">33 · 移动端</a></td>
<td><a href="#JSON">34 · JSON</a></td>
</tr>
<tr>
<td><a href="#焦点图">35 · 焦点图</a></td>
<td><a href="#Ext, EasyUI, J-UI 及其它各种UI方案">36 · Ext, EasyUI, J-UI 及其它各种UI方案</a></td>
</tr>
<tr>
<td><a href="#页面 社会化 分享功能">37 · 页面 社会化 分享功能</a></td>
<td><a href="#富文本编辑器">38 · 富文本编辑器</a></td>
</tr>
<tr>
<td><a href="#前端概述">39 · 前端概述</a></td>
<td><a href="#Gulp">40 · Gulp</a></td>
</tr>
<tr>
<td><a href="#Grunt">41 · Grunt</a></td>
<td><a href="#Fis">42 · Fis</a></td>
</tr>
<tr>
<td><a href="#pc图轮">43 · pc图轮</a></td>
<td><a href="#移动端图轮">44 · 移动端图轮</a></td>
</tr>
<tr>
<td><a href="#文件上传">45 · 文件上传</a></td>
<td><a href="#模拟select">46 · 模拟select</a></td>
</tr>
<tr>
<td><a href="#取色插件">47 · 取色插件</a></td>
<td><a href="#城市联动">48 · 城市联动</a></td>
</tr>
<tr>
<td><a href="#剪贴板">49 · 剪贴板</a></td>
<td><a href="#简繁转换">50 · 简繁转换</a></td>
</tr>
<tr>
<td><a href="#表格 Grid">51 · 表格 Grid</a></td>
<td><a href="#在线演示">52 · 在线演示</a></td>
</tr>
<tr>
<td><a href="#常规优化">53 · 常规优化</a></td>
<td><a href="#优化工具">54 · 优化工具</a></td>
</tr>
<tr>
<td><a href="#在线工具">55 · 在线工具</a></td>
<td><a href="#前端架构">56 · 前端架构</a></td>
</tr>
<tr>
<td><a href="#推荐作品">57 · 推荐作品</a></td>
<td><a href="#简历模板">58 · 简历模板</a></td>
</tr>
<tr>
<td><a href="#面试题">59 · 面试题</a></td>
<td><a href="#iconfont">60 · iconfont</a></td>
</tr>
<tr>
<td><a href="#Fiddler">61 · Fiddler</a></td>
<td><a href="#Chrome">62 · Chrome</a></td>
</tr>
<tr>
<td><a href="#Firebug">63 · Firebug</a></td>
<td><a href="#移动,微信调试">64 · 移动,微信调试</a></td>
</tr>
<tr>
<td><a href="#iOS Simulator">65 · iOS Simulator</a></td>
<td><a href="#Image">66 · Image</a></td>
</tr>
<tr>
<td><a href="#浏览器同步">67 · 浏览器同步</a></td>
<td><a href="#在线PPT制作">68 · 在线PPT制作</a></td>
</tr>
<tr>
<td><a href="#前端导航网站">69 · 前端导航网站</a></td>
<td><a href="#常用CDN">70 · 常用CDN</a></td>
</tr>
<tr>
<td><a href="#Git">71 · Git</a></td>
<td><a href="#各种日期日历">72 · 各种日期日历</a></td>
</tr>
<tr>
<td><a href="#Date library">73 · Date library</a></td>
<td><a href="#其它">74 · 其它</a></td>
</tr>
<tr>
<td><a href="#效果类">75 · 效果类</a></td>
<td><a href="#弹出层">76 · 弹出层</a></td>
</tr>
<tr>
<td><a href="#优秀JavaScript项目">77 · 优秀JavaScript项目</a></td>
</tr>
</tbody>
</table>
<h2 id="综合类"><a href="#综合类" class="headerlink" title="综合类"></a><strong>综合类</strong></h2><table>
<thead>
<tr>
<th>综合类</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>前端知识体系</td>
<td><a href="http://www.cnblogs.com/sb19871023/p/3894452.html" target="_blank" rel="external">http://www.cnblogs.com/sb19871023/p/3894452.html</a></td>
</tr>
<tr>
<td>前端知识结构</td>
<td><a href="https://github.com/JacksonTian/fks" target="_blank" rel="external">https://github.com/JacksonTian/fks</a></td>
</tr>
<tr>
<td>Web前端开发大系概览</td>
<td><a href="https://github.com/unruledboy/WebFrontEndStack" target="_blank" rel="external">https://github.com/unruledboy/WebFrontEndStack</a></td>
</tr>
<tr>
<td>Web前端开发大系概览-中文版</td>
<td><a href="http://www.cnblogs.com/unruledboy/p/WebFrontEndStack.html" target="_blank" rel="external">http://www.cnblogs.com/unruledboy/p/WebFrontEndStack.html</a></td>
</tr>
<tr>
<td>Web Front-end Stack v2.2</td>
<td><a href="https://raw.githubusercontent.com/unruledboy/WebFrontEndStack/master/Web%20Front%20End%20Stack.png" target="_blank" rel="external">Web Front-end Stack v2.2</a></td>
</tr>
<tr>
<td>免费的编程中文书籍索引</td>
<td><a href="https://github.com/justjavac/free-programming-books-zh_CN" target="_blank" rel="external">https://github.com/justjavac/free-programming-books-zh_CN</a></td>
</tr>
<tr>
<td>前端书籍</td>
<td><a href="https://github.com/dypsilon/frontend-dev-bookmarks" target="_blank" rel="external">https://github.com/dypsilon/frontend-dev-bookmarks</a></td>
</tr>
<tr>
<td>前端免费书籍大全</td>
<td><a href="https://github.com/vhf/free-programming-books" target="_blank" rel="external">https://github.com/vhf/free-programming-books</a></td>
</tr>
<tr>
<td>前端知识体系</td>
<td><a href="http://www.cnblogs.com/sb19871023/p/3894452.html" target="_blank" rel="external">http://www.cnblogs.com/sb19871023/p/3894452.html</a></td>
</tr>
<tr>
<td>免费的编程中文书籍索引</td>
<td><a href="https://github.com/justjavac/free-programming-books-zh_CN" target="_blank" rel="external">https://github.com/justjavac/free-programming-books-zh_CN</a></td>
</tr>
<tr>
<td>智能社 - 精通JavaScript开发</td>
<td><a href="http://study.163.com/course/introduction/224014.htm" target="_blank" rel="external">http://study.163.com/course/introduction/224014.htm</a></td>
</tr>
<tr>
<td>重新介绍 JavaScript（JS 教程）</td>
<td><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/A_re-introduction_to_JavaScript" target="_blank" rel="external">https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/A_re-introduction_to_JavaScript</a></td>
</tr>
<tr>
<td>麻省理工学院公开课：计算机科学及编程导论</td>
<td><a href="http://v.163.com/special/opencourse/bianchengdaolun.html" target="_blank" rel="external">http://v.163.com/special/opencourse/bianchengdaolun.html</a></td>
</tr>
<tr>
<td>JavaScript中的this陷阱的最全收集–没有之一</td>
<td><a href="http://segmentfault.com/a/1190000002640298" target="_blank" rel="external">http://segmentfault.com/a/1190000002640298</a></td>
</tr>
<tr>
<td>JS函数式编程指南</td>
<td><a href="https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch1.html" target="_blank" rel="external">https://llh911001.gitbooks.io/mostly-adequate-guide-chinese/content/ch1.html</a></td>
</tr>
<tr>
<td>JavaScript Promise迷你书（中文版）</td>
<td><a href="http://liubin.github.io/promises-book" target="_blank" rel="external">http://liubin.github.io/promises-book</a></td>
</tr>
<tr>
<td>腾讯移动Web前端知识库</td>
<td><a href="https://github.com/AlloyTeam/Mars" target="_blank" rel="external">https://github.com/AlloyTeam/Mars</a></td>
</tr>
<tr>
<td>Front-End-Develop-Guide 前端开发指南</td>
<td><a href="https://github.com/Front-End-Developers-Hunan/Front-End-Develop-Guide" target="_blank" rel="external">https://github.com/Front-End-Developers-Hunan/Front-End-Develop-Guide</a></td>
</tr>
<tr>
<td>前端开发笔记本</td>
<td><a href="https://li-xinyang.gitbooks.io/frontend-notebook/content" target="_blank" rel="external">https://li-xinyang.gitbooks.io/frontend-notebook/content</a></td>
</tr>
<tr>
<td>大前端工具集 - 聂微东</td>
<td><a href="https://github.com/nieweidong/fetool" target="_blank" rel="external">https://github.com/nieweidong/fetool</a></td>
</tr>
<tr>
<td>前端开发者手册</td>
<td><a href="https://dwqs.gitbooks.io/frontenddevhandbook/content" target="_blank" rel="external">https://dwqs.gitbooks.io/frontenddevhandbook/content</a></td>
</tr>
</tbody>
</table>
<h2 id="入门类"><a href="#入门类" class="headerlink" title="入门类"></a><strong>入门类</strong></h2><table>
<thead>
<tr>
<th>入门类</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>前端入门教程</td>
<td><a href="http://www.cnblogs.com/jikey/p/3613082.html" target="_blank" rel="external">http://www.cnblogs.com/jikey/p/3613082.html</a></td>
</tr>
<tr>
<td>瘳雪峰的Javascript教程</td>
<td><a href="http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000" target="_blank" rel="external">http://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000</a></td>
</tr>
<tr>
<td>前端工程师必备的PS技能——切图篇</td>
<td><a href="http://www.imooc.com/view/506" target="_blank" rel="external">http://www.imooc.com/view/506</a></td>
</tr>
<tr>
<td>结合个人经历总结的前端入门方法</td>
<td><a href="https://github.com/qiu-deqing/FE-learning" target="_blank" rel="external">https://github.com/qiu-deqing/FE-learning</a></td>
</tr>
</tbody>
</table>
<h2 id="工具类"><a href="#工具类" class="headerlink" title="工具类"></a><strong>工具类</strong></h2><table>
<thead>
<tr>
<th>工具类</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>前端人的俱乐部</strong></td>
<td><a href="http://f2er.club/" target="_blank" rel="external">http://f2er.club/</a> 真可以解放你的收藏夹</td>
</tr>
<tr>
<td>如何优雅地使用Sublime Text</td>
<td><a href="http://www.jeffjade.com/2015/12/15/2015-04-17-toss-sublime-text/#" target="_blank" rel="external">http://www.jeffjade.com/2015/12/15/2015-04-17-toss-sublime-text/#</a></td>
</tr>
<tr>
<td>新编码神器Atom使用纪要</td>
<td><a href="http://www.jeffjade.com/2016/03/03/2016-03-02-how-to-use-atom/" target="_blank" rel="external">http://www.jeffjade.com/2016/03/03/2016-03-02-how-to-use-atom/</a></td>
</tr>
<tr>
<td>css sprite 雪碧图制作</td>
<td><a href="http://www.imooc.com/learn/93" target="_blank" rel="external">http://www.imooc.com/learn/93</a></td>
</tr>
<tr>
<td>版本控制入门 – 搬进 Github</td>
<td><a href="http://www.imooc.com/learn/390" target="_blank" rel="external">http://www.imooc.com/learn/390</a></td>
</tr>
<tr>
<td>Grunt-beginner前端自动化工具</td>
<td><a href="http://www.imooc.com/learn/30" target="_blank" rel="external">http://www.imooc.com/learn/30</a></td>
</tr>
<tr>
<td>IntelliJ IDEA 简体中文专题教程</td>
<td><a href="https://github.com/judasn/IntelliJ-IDEA-Tutorial" target="_blank" rel="external">https://github.com/judasn/IntelliJ-IDEA-Tutorial</a></td>
</tr>
<tr>
<td>SublimeText</td>
<td><a href="https://github.com/jikeytang/sublime-text" target="_blank" rel="external">https://github.com/jikeytang/sublime-text</a></td>
</tr>
<tr>
<td>Atom</td>
<td><a href="https://atom.io" target="_blank" rel="external">https://atom.io</a></td>
</tr>
<tr>
<td>visual studio code</td>
<td><a href="https://code.visualstudio.com" target="_blank" rel="external">https://code.visualstudio.com</a></td>
</tr>
</tbody>
</table>
<h2 id="综合效果搜索平台"><a href="#综合效果搜索平台" class="headerlink" title="综合效果搜索平台"></a><strong>综合效果搜索平台</strong></h2><table>
<thead>
<tr>
<th>综合效果搜索平台</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>JavaScript 资源大全中文版</strong></td>
<td><a href="https://github.com/jobbole/awesome-javascript-cn" target="_blank" rel="external">https://github.com/jobbole/awesome-javascript-cn</a></td>
</tr>
<tr>
<td><strong>100+ 超全的web开发工具和资源</strong></td>
<td><a href="https://xituqu.com/170.html" target="_blank" rel="external">https://xituqu.com/170.html</a></td>
</tr>
<tr>
<td><strong>设计师网址导航</strong></td>
<td><a href="http://hao.uisdc.com/" target="_blank" rel="external">http://hao.uisdc.com/</a></td>
</tr>
<tr>
<td><strong>快搜</strong></td>
<td><a href="http://so.chongbuluo.com/" target="_blank" rel="external">http://so.chongbuluo.com/</a></td>
</tr>
<tr>
<td>阿里iconfont</td>
<td><a href="http://www.iconfont.cn/" target="_blank" rel="external">http://www.iconfont.cn/</a></td>
</tr>
<tr>
<td>zoommyapp.com</td>
<td><a href="http://zoommyapp.com/" target="_blank" rel="external">http://zoommyapp.com/</a> 高质量图库</td>
</tr>
<tr>
<td>unsplash.com</td>
<td><a href="https://unsplash.com/" target="_blank" rel="external">https://unsplash.com/</a> 高质量图库</td>
</tr>
<tr>
<td>www.pinterest.com</td>
<td><a href="https://www.pinterest.com/" target="_blank" rel="external">https://www.pinterest.com/</a> 图库</td>
</tr>
<tr>
<td>New Old Stock</td>
<td><a href="http://nos.twnsnd.co" target="_blank" rel="external">http://nos.twnsnd.co</a> 复古风图库</td>
</tr>
<tr>
<td>500px.com</td>
<td><a href="https://500px.com/" target="_blank" rel="external">https://500px.com/</a> 唯美照片</td>
</tr>
<tr>
<td>效果网</td>
<td><a href="http://www.jq22.com" target="_blank" rel="external">http://www.jq22.com</a></td>
</tr>
<tr>
<td>花瓣网</td>
<td><a href="http://huaban.com/" target="_blank" rel="external">http://huaban.com/</a></td>
</tr>
<tr>
<td>优美图</td>
<td><a href="http://www.topit.me/" target="_blank" rel="external">http://www.topit.me/</a></td>
</tr>
<tr>
<td>codepen</td>
<td><a href="http://codepen.io/" target="_blank" rel="external">http://codepen.io/</a></td>
</tr>
<tr>
<td>摄图网</td>
<td><a href="http://699pic.com/" target="_blank" rel="external">http://699pic.com/</a></td>
</tr>
<tr>
<td>常用的JavaScript代码片段</td>
<td><a href="http://microjs.com" target="_blank" rel="external">http://microjs.com</a></td>
</tr>
</tbody>
</table>
<h2 id="团队Blog"><a href="#团队Blog" class="headerlink" title="团队Blog"></a><strong>团队Blog</strong></h2><table>
<thead>
<tr>
<th>团队Blog-Name</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>腾讯ISUX</strong></td>
<td><a href="http://isux.tencent.com" target="_blank" rel="external">http://isux.tencent.com</a></td>
</tr>
<tr>
<td><strong>奇舞周刊</strong></td>
<td><a href="http://old.75team.com/weekly/" target="_blank" rel="external">http://old.75team.com/weekly/</a></td>
</tr>
<tr>
<td>淘宝前端团队（FED）</td>
<td><a href="http://taobaofed.org" target="_blank" rel="external">http://taobaofed.org</a></td>
</tr>
<tr>
<td>码农周刊</td>
<td><a href="http://weekly.manong.io" target="_blank" rel="external">http://weekly.manong.io</a></td>
</tr>
<tr>
<td>WEB前端开发</td>
<td><a href="http://www.css88.com" target="_blank" rel="external">http://www.css88.com</a></td>
</tr>
<tr>
<td>A JS tip per day!</td>
<td><a href="http://www.jstips.co" target="_blank" rel="external">http://www.jstips.co</a></td>
</tr>
<tr>
<td>腾讯全端 AlloyTeam</td>
<td><a href="http://www.alloyteam.com/webdevelop/" target="_blank" rel="external">http://www.alloyteam.com/webdevelop/</a></td>
</tr>
<tr>
<td>阿里巴巴-U一点</td>
<td><a href="http://www.aliued.cn" target="_blank" rel="external">http://www.aliued.cn</a></td>
</tr>
<tr>
<td>百度WEB前端研发部</td>
<td><a href="http://fex.baidu.com" target="_blank" rel="external">http://fex.baidu.com</a></td>
</tr>
<tr>
<td>携程设计委员会</td>
<td><a href="http://ued.ctrip.com/blog/" target="_blank" rel="external">http://ued.ctrip.com/blog/</a></td>
</tr>
<tr>
<td>平安科技移动开发二队技术周报</td>
<td><a href="https://github.com/PaicHyperionDev/MobileDevWeekly" target="_blank" rel="external">https://github.com/PaicHyperionDev/MobileDevWeekly</a></td>
</tr>
</tbody>
</table>
<h2 id="开发中心"><a href="#开发中心" class="headerlink" title="开发中心"></a><strong>开发中心</strong></h2><table>
<thead>
<tr>
<th>开发中心</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>mozilla js参考</td>
<td><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript" target="_blank" rel="external">https://developer.mozilla.org/zh-CN/docs/Web/JavaScript</a></td>
</tr>
<tr>
<td>chrome开发中心（chrome的内核已转向blink）</td>
<td><a href="https://developer.chrome.com/extensions/api_index.html" target="_blank" rel="external">https://developer.chrome.com/extensions/api_index.html</a></td>
</tr>
<tr>
<td>safari开发中心</td>
<td><a href="https://developer.apple.com/library/safari/navigation" target="_blank" rel="external">https://developer.apple.com/library/safari/navigation</a></td>
</tr>
<tr>
<td>microsoft js参考</td>
<td><a href="https://msdn.microsoft.com/zh-cn/library/d1et7k7c(v=vs.94.aspx" target="_blank" rel="external">https://msdn.microsoft.com/zh-cn/library/d1et7k7c(v=vs.94.aspx</a></td>
</tr>
<tr>
<td>js秘密花园</td>
<td><a href="http://sanshi.me/articles/JavaScript-Garden-CN/html/index.html" target="_blank" rel="external">http://sanshi.me/articles/JavaScript-Garden-CN/html/index.html</a></td>
</tr>
<tr>
<td>js秘密花园</td>
<td><a href="http://bonsaiden.github.io/JavaScript-Garden/zh" target="_blank" rel="external">http://bonsaiden.github.io/JavaScript-Garden/zh</a></td>
</tr>
<tr>
<td>w3help</td>
<td><a href="http://www.w3help.org" target="_blank" rel="external">http://www.w3help.org</a> 综合Bug集合网站</td>
</tr>
</tbody>
</table>
<h2 id="Nodejs"><a href="#Nodejs" class="headerlink" title="Nodejs"></a><strong>Nodejs</strong></h2><table>
<thead>
<tr>
<th>Nodejs</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Node.js 包教不包会</td>
<td><a href="https://github.com/alsotang/node-lessons" target="_blank" rel="external">https://github.com/alsotang/node-lessons</a></td>
</tr>
<tr>
<td>一个nodejs博客</td>
<td><a href="http://60sky.com" target="_blank" rel="external">http://60sky.com</a></td>
</tr>
<tr>
<td>【NodeJS 学习笔记04】新闻发布系统</td>
<td><a href="http://www.cnblogs.com/yexiaochai/p/3536547.html" target="_blank" rel="external">http://www.cnblogs.com/yexiaochai/p/3536547.html</a></td>
</tr>
<tr>
<td>过年7天乐，学nodejs 也快乐</td>
<td><a href="http://www.cnblogs.com/qqloving/p/3541099.html" target="_blank" rel="external">http://www.cnblogs.com/qqloving/p/3541099.html</a></td>
</tr>
<tr>
<td>七天学会NodeJS</td>
<td><a href="https://github.com/nqdeng/7-days-nodejs" target="_blank" rel="external">https://github.com/nqdeng/7-days-nodejs</a></td>
</tr>
<tr>
<td>Nodejs学习笔记（二）— 事件模块</td>
<td><a href="http://www.cnblogs.com/zhongweiv/p/nodejs_events.html" target="_blank" rel="external">http://www.cnblogs.com/zhongweiv/p/nodejs_events.html</a></td>
</tr>
<tr>
<td>nodejs入门</td>
<td><a href="http://www.cnblogs.com/liusuqi/p/3735491.html" target="_blank" rel="external">http://www.cnblogs.com/liusuqi/p/3735491.html</a></td>
</tr>
<tr>
<td>angularjs nodejs</td>
<td><a href="https://github.com/zensh/jsgen" target="_blank" rel="external">https://github.com/zensh/jsgen</a></td>
</tr>
<tr>
<td>从零开始nodejs系列文章</td>
<td><a href="http://blog.fens.me/series-nodejs" target="_blank" rel="external">http://blog.fens.me/series-nodejs</a></td>
</tr>
<tr>
<td>理解nodejs</td>
<td><a href="http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb" target="_blank" rel="external">http://debuggable.com/posts/understanding-node-js:4bd98440-45e4-4a9a-8ef7-0f7ecbdd56cb</a></td>
</tr>
<tr>
<td>nodejs事件轮询</td>
<td><a href="http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop" target="_blank" rel="external">http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop</a></td>
</tr>
<tr>
<td>node入门</td>
<td><a href="http://www.nodebeginner.org/index-zh-cn.html" target="_blank" rel="external">http://www.nodebeginner.org/index-zh-cn.html</a></td>
</tr>
<tr>
<td>nodejs cms</td>
<td><a href="http://ourjs.com/detail/53e1f281c5910a9806000001" target="_blank" rel="external">http://ourjs.com/detail/53e1f281c5910a9806000001</a></td>
</tr>
<tr>
<td>Node初学者入门，一本全面的NodeJS教程</td>
<td><a href="http://ourjs.com/detail/529ca5950cb6498814000005" target="_blank" rel="external">http://ourjs.com/detail/529ca5950cb6498814000005</a></td>
</tr>
<tr>
<td>NodeJS的代码调试和性能调优</td>
<td><a href="http://www.barretlee.com/blog/2015/10/07/debug-nodejs-in-command-line" target="_blank" rel="external">http://www.barretlee.com/blog/2015/10/07/debug-nodejs-in-command-line</a></td>
</tr>
</tbody>
</table>
<h2 id="综合API"><a href="#综合API" class="headerlink" title="综合API"></a><strong>综合API</strong></h2><table>
<thead>
<tr>
<th>综合API</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>OverAPI.com</strong></td>
<td><a href="http://overapi.com/" target="_blank" rel="external">http://overapi.com/</a></td>
</tr>
<tr>
<td>javascripting</td>
<td><a href="http://www.javascripting.com" target="_blank" rel="external">http://www.javascripting.com</a></td>
</tr>
<tr>
<td>各种流行库搜索</td>
<td><a href="http://microjs.com" target="_blank" rel="external">http://microjs.com</a></td>
</tr>
<tr>
<td>runoob.com-包含各种API集合</td>
<td><a href="http://www.runoob.com" target="_blank" rel="external">http://www.runoob.com</a></td>
</tr>
<tr>
<td>开源中国在线API文档合集</td>
<td><a href="http://tool.oschina.net/apidocs" target="_blank" rel="external">http://tool.oschina.net/apidocs</a></td>
</tr>
<tr>
<td>devdocs</td>
<td><a href="http://devdocs.io" target="_blank" rel="external">http://devdocs.io</a> 英文综合API网站</td>
</tr>
</tbody>
</table>
<h2 id="Ecmascript"><a href="#Ecmascript" class="headerlink" title="Ecmascript"></a><strong>Ecmascript</strong></h2><table>
<thead>
<tr>
<th>Ecmascript</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Understanding ECMAScript 6 - Nicholas C. Zakas</td>
<td><a href="https://leanpub.com/understandinges6/read" target="_blank" rel="external">https://leanpub.com/understandinges6/read</a></td>
</tr>
<tr>
<td>exploring-es6</td>
<td><a href="https://leanpub.com/exploring-es6/read" target="_blank" rel="external">https://leanpub.com/exploring-es6/read</a></td>
</tr>
<tr>
<td>exploring-es6翻译</td>
<td><a href="https://github.com/es6-org/exploring-es6" target="_blank" rel="external">https://github.com/es6-org/exploring-es6</a></td>
</tr>
<tr>
<td>exploring-es6翻译后预览</td>
<td><a href="http://es6-org.github.io/exploring-es6" target="_blank" rel="external">http://es6-org.github.io/exploring-es6</a></td>
</tr>
<tr>
<td>阮一峰 es6</td>
<td><a href="http://es6.ruanyifeng.com" target="_blank" rel="external">http://es6.ruanyifeng.com</a></td>
</tr>
<tr>
<td>阮一峰 Javascript</td>
<td><a href="http://javascript.ruanyifeng.com" target="_blank" rel="external">http://javascript.ruanyifeng.com</a></td>
</tr>
<tr>
<td>ECMA-262，第 5 版</td>
<td><a href="http://yanhaijing.com/es5" target="_blank" rel="external">http://yanhaijing.com/es5</a></td>
</tr>
<tr>
<td>es5</td>
<td><a href="http://es5.github.io" target="_blank" rel="external">http://es5.github.io</a></td>
</tr>
</tbody>
</table>
<h2 id="Vue"><a href="#Vue" class="headerlink" title="Vue"></a><strong>Vue</strong></h2><table>
<thead>
<tr>
<th>Vue.js</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Vue2.0</strong></td>
<td><a href="https://vuefe.cn/" target="_blank" rel="external">https://vuefe.cn/</a></td>
</tr>
<tr>
<td>Vue</td>
<td><a href="http://cn.vuejs.org" target="_blank" rel="external">http://cn.vuejs.org</a></td>
</tr>
<tr>
<td>Vue Router</td>
<td><a href="https://router.vuejs.org/" target="_blank" rel="external">https://router.vuejs.org/</a></td>
</tr>
<tr>
<td>Vuex</td>
<td><a href="https://vuex.vuejs.org/" target="_blank" rel="external">https://vuex.vuejs.org/</a></td>
</tr>
<tr>
<td><strong>Vue-Cli</strong></td>
<td><a href="https://github.com/vuejs/vue-cli" target="_blank" rel="external">https://github.com/vuejs/vue-cli</a></td>
</tr>
<tr>
<td>Vue 论坛</td>
<td><a href="http://forum.vuejs.org" target="_blank" rel="external">http://forum.vuejs.org</a></td>
</tr>
<tr>
<td>Vue 聊天室</td>
<td><a href="https://gitter.im/vuejs/vue" target="_blank" rel="external">https://gitter.im/vuejs/vue</a></td>
</tr>
<tr>
<td>Vue 入门指南</td>
<td><a href="http://www.cnblogs.com/aaronjs/p/3660102.html" target="_blank" rel="external">http://www.cnblogs.com/aaronjs/p/3660102.html</a></td>
</tr>
<tr>
<td>Vue 的一些资源索引</td>
<td><a href="http://segmentfault.com/a/1190000000411057" target="_blank" rel="external">http://segmentfault.com/a/1190000000411057</a></td>
</tr>
<tr>
<td>awesome-vue</td>
<td><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="external">https://github.com/vuejs/awesome-vue</a></td>
</tr>
<tr>
<td>vue-syntax-highlight</td>
<td><a href="https://github.com/vuejs/vue-syntax-highlight" target="_blank" rel="external">https://github.com/vuejs/vue-syntax-highlight</a></td>
</tr>
</tbody>
</table>
<h2 id="Angularjs"><a href="#Angularjs" class="headerlink" title="Angularjs"></a><strong>Angularjs</strong></h2><table>
<thead>
<tr>
<th>Angularjs</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Angular.js 的一些学习资源</td>
<td><a href="https://github.com/dolymood/AngularLearning" target="_blank" rel="external">https://github.com/dolymood/AngularLearning</a></td>
</tr>
<tr>
<td>angularjs中文社区</td>
<td><a href="http://angularjs.cn" target="_blank" rel="external">http://angularjs.cn</a></td>
</tr>
<tr>
<td>Angularjs源码学习</td>
<td><a href="http://www.cnblogs.com/xuwenmin888/p/3739096.html" target="_blank" rel="external">http://www.cnblogs.com/xuwenmin888/p/3739096.html</a></td>
</tr>
<tr>
<td>Angularjs源码学习</td>
<td><a href="http://www.ifeenan.com/?c=AngularJS" target="_blank" rel="external">http://www.ifeenan.com/?c=AngularJS</a></td>
</tr>
<tr>
<td>angular对bootstrap的封装</td>
<td><a href="http://angular-ui.github.io/bootstrap" target="_blank" rel="external">http://angular-ui.github.io/bootstrap</a></td>
</tr>
<tr>
<td>angularjs + nodejs</td>
<td><a href="https://cnodejs.org/topic/51404e0f069911196d2e3923" target="_blank" rel="external">https://cnodejs.org/topic/51404e0f069911196d2e3923</a></td>
</tr>
<tr>
<td>吕大豹 Angularjs</td>
<td><a href="http://www.cnblogs.com/lvdabao/tag/AngularJs" target="_blank" rel="external">http://www.cnblogs.com/lvdabao/tag/AngularJs</a></td>
</tr>
<tr>
<td>AngularJS 最佳实践</td>
<td><a href="http://www.infoq.com/cn/news/2013/02/angular-web-app" target="_blank" rel="external">http://www.infoq.com/cn/news/2013/02/angular-web-app</a></td>
</tr>
<tr>
<td>Angular的一些扩展指令</td>
<td><a href="http://www.lovelucy.info/angularjs-best-practices.html" target="_blank" rel="external">http://www.lovelucy.info/angularjs-best-practices.html</a></td>
</tr>
<tr>
<td>Angular数据绑定原理</td>
<td><a href="https://github.com/Pasvaz/bindonce" target="_blank" rel="external">https://github.com/Pasvaz/bindonce</a></td>
</tr>
<tr>
<td>一些扩展Angular UI组件</td>
<td><a href="https://github.com/angular-ui" target="_blank" rel="external">https://github.com/angular-ui</a></td>
</tr>
<tr>
<td>Ember和AngularJS的性能测试</td>
<td><a href="http://voidcanvas.com/emberjs-vs-angularjs-performance-testing" target="_blank" rel="external">http://voidcanvas.com/emberjs-vs-angularjs-performance-testing</a></td>
</tr>
<tr>
<td>带你走近AngularJS - 基本功能介绍</td>
<td><a href="http://www.cnblogs.com/powertoolsteam/p/angularjs-introdection.html" target="_blank" rel="external">http://www.cnblogs.com/powertoolsteam/p/angularjs-introdection.html</a></td>
</tr>
<tr>
<td>Angularjs开发指南</td>
<td><a href="http://angular.duapp.com/docs/guide" target="_blank" rel="external">http://angular.duapp.com/docs/guide</a></td>
</tr>
<tr>
<td>Angularjs学习</td>
<td><a href="http://www.cnblogs.com/amosli/p/3710648.html" target="_blank" rel="external">http://www.cnblogs.com/amosli/p/3710648.html</a></td>
</tr>
<tr>
<td>不要带着jQuery的思维去学习AngularJS</td>
<td><a href="http://www.rainweb.cn/article/angularjs-jquery.html" target="_blank" rel="external">http://www.rainweb.cn/article/angularjs-jquery.html</a></td>
</tr>
<tr>
<td>angularjs 学习笔记</td>
<td><a href="http://wangjiatao.diandian.com/?tag=angularjs" target="_blank" rel="external">http://wangjiatao.diandian.com/?tag=angularjs</a></td>
</tr>
<tr>
<td>angularjs 开发指南</td>
<td><a href="http://www.angularjs.cn/T008" target="_blank" rel="external">http://www.angularjs.cn/T008</a></td>
</tr>
<tr>
<td>angularjs 英文资料</td>
<td><a href="https://github.com/jmcunningham/AngularJS-Learning" target="_blank" rel="external">https://github.com/jmcunningham/AngularJS-Learning</a></td>
</tr>
<tr>
<td>angular bootstrap</td>
<td><a href="http://angular-ui.github.io/bootstrap" target="_blank" rel="external">http://angular-ui.github.io/bootstrap</a></td>
</tr>
<tr>
<td>angular jq mobile</td>
<td><a href="https://github.com/opitzconsulting/jquery-mobile-angular-adapter" target="_blank" rel="external">https://github.com/opitzconsulting/jquery-mobile-angular-adapter</a></td>
</tr>
<tr>
<td>angular ui</td>
<td><a href="http://mgcrea.github.io/angular-strap" target="_blank" rel="external">http://mgcrea.github.io/angular-strap</a></td>
</tr>
<tr>
<td>整合jQuery Mobile+AngularJS经验谈</td>
<td><a href="http://www.tuicool.com/articles/7ZZVr2" target="_blank" rel="external">http://www.tuicool.com/articles/7ZZVr2</a></td>
</tr>
<tr>
<td>有jQuery背景，该如何用AngularJS编程思想</td>
<td><a href="http://blog.jobbole.com/46589/" target="_blank" rel="external">http://blog.jobbole.com/46589/</a></td>
</tr>
<tr>
<td>AngularJS在线教程</td>
<td><a href="http://each.sinaapp.com/angular" target="_blank" rel="external">http://each.sinaapp.com/angular</a></td>
</tr>
<tr>
<td>angular学习笔记</td>
<td><a href="http://www.zouyesheng.com/angular.html" target="_blank" rel="external">http://www.zouyesheng.com/angular.html</a></td>
</tr>
</tbody>
</table>
<h2 id="React"><a href="#React" class="headerlink" title="React"></a><strong>React</strong></h2><table>
<thead>
<tr>
<th>React</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>react.js 中文论坛</td>
<td><a href="http://www.react-china.org" target="_blank" rel="external">http://www.react-china.org</a></td>
</tr>
<tr>
<td>react.js 官方网址</td>
<td><a href="https://facebook.github.io/react/index.html" target="_blank" rel="external">https://facebook.github.io/react/index.html</a></td>
</tr>
<tr>
<td>react.js 官方文档</td>
<td><a href="https://facebook.github.io/react/docs/getting-started.html" target="_blank" rel="external">https://facebook.github.io/react/docs/getting-started.html</a></td>
</tr>
<tr>
<td>react.js material UI</td>
<td><a href="http://material-ui.com/#" target="_blank" rel="external">http://material-ui.com/#</a></td>
</tr>
<tr>
<td>react.js TouchstoneJS UI</td>
<td><a href="http://touchstonejs.io" target="_blank" rel="external">http://touchstonejs.io</a></td>
</tr>
<tr>
<td>react.js amazeui UI</td>
<td><a href="http://amazeui.org/react" target="_blank" rel="external">http://amazeui.org/react</a></td>
</tr>
<tr>
<td>React 入门实例教程 - 阮一峰</td>
<td><a href="http://www.ruanyifeng.com/blog/2015/03/react.html" target="_blank" rel="external">http://www.ruanyifeng.com/blog/2015/03/react.html</a></td>
</tr>
<tr>
<td>React Native 中文版</td>
<td><a href="http://wiki.jikexueyuan.com/project/react-native" target="_blank" rel="external">http://wiki.jikexueyuan.com/project/react-native</a></td>
</tr>
<tr>
<td>Webpack 和 React 小书 - 前端乱炖</td>
<td><a href="http://www.html-js.com/article/Fakefish%203053" target="_blank" rel="external">http://www.html-js.com/article/Fakefish%203053</a></td>
</tr>
<tr>
<td>Webpack 和 React 小书 - gitbook</td>
<td><a href="https://fakefish.github.io/react-webpack-cookbook" target="_blank" rel="external">https://fakefish.github.io/react-webpack-cookbook</a></td>
</tr>
<tr>
<td>webpack</td>
<td><a href="https://github.com/webpack/webpack" target="_blank" rel="external">https://github.com/webpack/webpack</a></td>
</tr>
<tr>
<td>Webpack，101入门体验</td>
<td><a href="http://html-js.com/article/3009" target="_blank" rel="external">http://html-js.com/article/3009</a></td>
</tr>
<tr>
<td>webpack入门教程</td>
<td><a href="http://html-js.com/article/3113" target="_blank" rel="external">http://html-js.com/article/3113</a></td>
</tr>
<tr>
<td>基于webpack搭建前端工程解决方案探索</td>
<td><a href="http://segmentfault.com/a/1190000003499526" target="_blank" rel="external">http://segmentfault.com/a/1190000003499526</a></td>
</tr>
</tbody>
</table>
<h2 id="Js-template"><a href="#Js-template" class="headerlink" title="Js template"></a><strong>Js template</strong></h2><table>
<thead>
<tr>
<th>Js template</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>template-chooser</td>
<td><a href="http://garann.github.io/template-chooser" target="_blank" rel="external">http://garann.github.io/template-chooser</a></td>
</tr>
<tr>
<td>artTemplate</td>
<td><a href="https://github.com/aui/artTemplate" target="_blank" rel="external">https://github.com/aui/artTemplate</a></td>
</tr>
<tr>
<td>tomdjs</td>
<td><a href="https://github.com/aui/tmodjs/blob/master/README.md" target="_blank" rel="external">https://github.com/aui/tmodjs/blob/master/README.md</a></td>
</tr>
<tr>
<td>淘宝模板juicer模板</td>
<td><a href="http://juicer.name/docs/docs_zh_cn.html" target="_blank" rel="external">http://juicer.name/docs/docs_zh_cn.html</a></td>
</tr>
<tr>
<td>Fxtpl v1.0 繁星前端模板引擎</td>
<td><a href="http://koen301.github.io/fxtpl" target="_blank" rel="external">http://koen301.github.io/fxtpl</a></td>
</tr>
<tr>
<td>laytpl</td>
<td><a href="http://laytpl.layui.com" target="_blank" rel="external">http://laytpl.layui.com</a></td>
</tr>
<tr>
<td>mozilla - nunjucks</td>
<td><a href="https://github.com/mozilla/nunjucks" target="_blank" rel="external">https://github.com/mozilla/nunjucks</a></td>
</tr>
<tr>
<td>Juicer</td>
<td><a href="https://github.com/PaulGuo/Juicer" target="_blank" rel="external">https://github.com/PaulGuo/Juicer</a></td>
</tr>
<tr>
<td>dustjs</td>
<td><a href="http://akdubya.github.io/dustjs" target="_blank" rel="external">http://akdubya.github.io/dustjs</a></td>
</tr>
<tr>
<td>etpl</td>
<td><a href="http://ecomfe.github.io/etpl" target="_blank" rel="external">http://ecomfe.github.io/etpl</a></td>
</tr>
</tbody>
</table>
<h2 id="HTML5-HTML"><a href="#HTML5-HTML" class="headerlink" title="HTML5(HTML)"></a><strong>HTML5(HTML)</strong></h2><table>
<thead>
<tr>
<th>HTML(HTML5)</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>深入理解HTML5标签</td>
<td><a href="https://segmentfault.com/a/1190000002695791" target="_blank" rel="external">https://segmentfault.com/a/1190000002695791</a></td>
</tr>
<tr>
<td>如何写出高效率的HTML</td>
<td><a href="https://segmentfault.com/a/1190000002680822" target="_blank" rel="external">https://segmentfault.com/a/1190000002680822</a></td>
</tr>
<tr>
<td>HTML meta标签总结与属性使用介绍</td>
<td><a href="https://segmentfault.com/a/1190000004279791" target="_blank" rel="external">https://segmentfault.com/a/1190000004279791</a></td>
</tr>
<tr>
<td>戏说HTML5</td>
<td><a href="http://www.cnblogs.com/dojo-lzz/p/5059316.html" target="_blank" rel="external">http://www.cnblogs.com/dojo-lzz/p/5059316.html</a></td>
</tr>
</tbody>
</table>
<h2 id="CSS3-CSS"><a href="#CSS3-CSS" class="headerlink" title="CSS3(CSS)"></a><strong>CSS3(CSS)</strong></h2><table>
<thead>
<tr>
<th>CSS</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>CSS 语法参考</td>
<td><a href="http://tympanus.net/codrops/css_reference" target="_blank" rel="external">http://tympanus.net/codrops/css_reference</a></td>
</tr>
<tr>
<td><strong>如何编写可维护的CSS</strong></td>
<td><a href="https://github.com/chadluo/CSS-Guidelines/blob/master/README.md" target="_blank" rel="external">https://github.com/chadluo/CSS-Guidelines/blob/master/README.md</a></td>
</tr>
<tr>
<td>CSS3动画手册</td>
<td><a href="http://isux.tencent.com/css3/index.html" target="_blank" rel="external">http://isux.tencent.com/css3/index.html</a></td>
</tr>
<tr>
<td>腾讯css3动画制作工具</td>
<td><a href="http://isux.tencent.com/css3/tools.html" target="_blank" rel="external">http://isux.tencent.com/css3/tools.html</a></td>
</tr>
<tr>
<td>志爷css小工具集合</td>
<td><a href="http://linxz.github.io/tianyizone" target="_blank" rel="external">http://linxz.github.io/tianyizone</a></td>
</tr>
<tr>
<td>css3 js 移动大杂烩</td>
<td><a href="http://www.note12.com/category/blog/2014-6-5/538fe0a9f786f1b7019a4dfb" target="_blank" rel="external">http://www.note12.com/category/blog/2014-6-5/538fe0a9f786f1b7019a4dfb</a></td>
</tr>
<tr>
<td>bouncejs 触摸库</td>
<td><a href="http://bouncejs.com" target="_blank" rel="external">http://bouncejs.com</a></td>
</tr>
<tr>
<td>animate.css</td>
<td><a href="http://daneden.github.io/animate.css" target="_blank" rel="external">http://daneden.github.io/animate.css</a></td>
</tr>
<tr>
<td>全局CSS的终结(狗带 [译]</td>
<td><a href="http://www.alloyteam.com/2015/10/8536" target="_blank" rel="external">http://www.alloyteam.com/2015/10/8536</a></td>
</tr>
<tr>
<td>browserhacks</td>
<td><a href="http://browserhacks.com" target="_blank" rel="external">http://browserhacks.com</a></td>
</tr>
</tbody>
</table>
<h2 id="移动端API"><a href="#移动端API" class="headerlink" title="移动端API"></a><strong>移动端API</strong></h2><table>
<thead>
<tr>
<th>移动端API</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>99移动端知识集合</td>
<td><a href="https://github.com/jtyjty99999/mobileTech" target="_blank" rel="external">https://github.com/jtyjty99999/mobileTech</a></td>
</tr>
<tr>
<td>移动端前端开发知识库</td>
<td><a href="https://github.com/AlloyTeam/Mars" target="_blank" rel="external">https://github.com/AlloyTeam/Mars</a></td>
</tr>
<tr>
<td>移动前端的一些坑和解决方法（外观表现）</td>
<td><a href="http://caibaojian.com/mobile-web-bug.html" target="_blank" rel="external">http://caibaojian.com/mobile-web-bug.html</a></td>
</tr>
<tr>
<td>【原】移动web资源整理</td>
<td><a href="http://www.cnblogs.com/PeunZhang/p/3407453.html" target="_blank" rel="external">http://www.cnblogs.com/PeunZhang/p/3407453.html</a></td>
</tr>
<tr>
<td>zepto 1.0 中文手册</td>
<td><a href="http://mweb.baidu.com/zeptoapi" target="_blank" rel="external">http://mweb.baidu.com/zeptoapi</a></td>
</tr>
<tr>
<td>zepto 1.0 中文手册</td>
<td><a href="http://www.html-5.cn/Manual/Zepto" target="_blank" rel="external">http://www.html-5.cn/Manual/Zepto</a></td>
</tr>
<tr>
<td>zepto 1.1.2</td>
<td><a href="http://www.css88.com/doc/zeptojs_api" target="_blank" rel="external">http://www.css88.com/doc/zeptojs_api</a></td>
</tr>
<tr>
<td>zepto 中文注释</td>
<td><a href="http://www.cnblogs.com/sky000/archive/2013/03/29/2988952.html" target="_blank" rel="external">http://www.cnblogs.com/sky000/archive/2013/03/29/2988952.html</a></td>
</tr>
<tr>
<td>jqmobile 手册</td>
<td><a href="http://app-framework-software.intel.com/api.php" target="_blank" rel="external">http://app-framework-software.intel.com/api.php</a></td>
</tr>
<tr>
<td>移动浏览器开发集合</td>
<td><a href="https://github.com/maxzhang/maxzhang.github.com/issues" target="_blank" rel="external">https://github.com/maxzhang/maxzhang.github.com/issues</a></td>
</tr>
<tr>
<td>移动开发大杂烩</td>
<td><a href="https://github.com/hoosin/mobile-web-favorites" target="_blank" rel="external">https://github.com/hoosin/mobile-web-favorites</a></td>
</tr>
</tbody>
</table>
<h2 id="jQuery"><a href="#jQuery" class="headerlink" title="jQuery"></a><strong>jQuery</strong></h2><table>
<thead>
<tr>
<th>jQuery</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>YOU MIGHT NOT NEED JQUERY</strong></td>
<td><a href="http://youmightnotneedjquery.com/" target="_blank" rel="external">http://youmightnotneedjquery.com/</a></td>
</tr>
<tr>
<td>jQuery API 中文文档</td>
<td><a href="http://www.jquery123.com" target="_blank" rel="external">http://www.jquery123.com</a></td>
</tr>
<tr>
<td>hemin 在线版</td>
<td><a href="http://hemin.cn/jq" target="_blank" rel="external">http://hemin.cn/jq</a></td>
</tr>
<tr>
<td>css88 jq api</td>
<td><a href="http://www.css88.com/jqapi-1.9/on" target="_blank" rel="external">http://www.css88.com/jqapi-1.9/on</a></td>
</tr>
<tr>
<td>css88 jqui api</td>
<td><a href="http://www.css88.com/jquery-ui-api" target="_blank" rel="external">http://www.css88.com/jquery-ui-api</a></td>
</tr>
<tr>
<td>学习jquery</td>
<td><a href="http://learn.jquery.com" target="_blank" rel="external">http://learn.jquery.com</a></td>
</tr>
<tr>
<td>jquery 源码查找</td>
<td><a href="http://james.padolsey.com/jquery" target="_blank" rel="external">http://james.padolsey.com/jquery</a></td>
</tr>
<tr>
<td>Web前端资源汇总(jQuery,Js,Css3等)</td>
<td><a href="http://www.cnblogs.com/jihua/p/webfront.html" target="_blank" rel="external">http://www.cnblogs.com/jihua/p/webfront.html</a></td>
</tr>
</tbody>
</table>
<h2 id="D3"><a href="#D3" class="headerlink" title="D3"></a><strong>D3</strong></h2><table>
<thead>
<tr>
<th>D3</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>d3 Tutorials</td>
<td><a href="https://github.com/mbostock/d3/wiki/Tutorials" target="_blank" rel="external">https://github.com/mbostock/d3/wiki/Tutorials</a></td>
</tr>
<tr>
<td>Gallery</td>
<td><a href="https://github.com/mbostock/d3/wiki/Gallery" target="_blank" rel="external">https://github.com/mbostock/d3/wiki/Gallery</a></td>
</tr>
<tr>
<td>lofter</td>
<td><a href="http://datavisual.lofter.com/post/40cf3a_188e535" target="_blank" rel="external">http://datavisual.lofter.com/post/40cf3a_188e535</a></td>
</tr>
<tr>
<td>iteye</td>
<td><a href="http://alanland.iteye.com/blog/1878595" target="_blank" rel="external">http://alanland.iteye.com/blog/1878595</a></td>
</tr>
<tr>
<td>ruanyifeng</td>
<td><a href="http://javascript.ruanyifeng.com/library/d3.html" target="_blank" rel="external">http://javascript.ruanyifeng.com/library/d3.html</a></td>
</tr>
</tbody>
</table>
<h2 id="Requriejs"><a href="#Requriejs" class="headerlink" title="Requriejs"></a><strong>Requriejs</strong></h2><table>
<thead>
<tr>
<th>Requriejs</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Javascript模块化编程（一）：模块的写法</td>
<td><a href="http://www.ruanyifeng.com/blog/2012/10/javascript_module.html" target="_blank" rel="external">http://www.ruanyifeng.com/blog/2012/10/javascript_module.html</a></td>
</tr>
<tr>
<td>Javascript模块化编程（二）：AMD规范</td>
<td><a href="http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_definition.html" target="_blank" rel="external">http://www.ruanyifeng.com/blog/2012/10/asynchronous_module_definition.html</a></td>
</tr>
<tr>
<td>Javascript模块化编程（三）：require.js的用法</td>
<td><a href="http://www.ruanyifeng.com/blog/2012/11/require_js.html" target="_blank" rel="external">http://www.ruanyifeng.com/blog/2012/11/require_js.html</a></td>
</tr>
<tr>
<td>RequireJS入门（一）</td>
<td><a href="http://www.cnblogs.com/snandy/archive/2012/05/22/2513652.html" target="_blank" rel="external">http://www.cnblogs.com/snandy/archive/2012/05/22/2513652.html</a></td>
</tr>
<tr>
<td>RequireJS入门（二）</td>
<td><a href="http://www.cnblogs.com/snandy/archive/2012/05/23/2513712.html" target="_blank" rel="external">http://www.cnblogs.com/snandy/archive/2012/05/23/2513712.html</a></td>
</tr>
<tr>
<td>RequireJS进阶（三）</td>
<td><a href="http://www.cnblogs.com/snandy/archive/2012/06/08/2538001.html" target="_blank" rel="external">http://www.cnblogs.com/snandy/archive/2012/06/08/2538001.html</a></td>
</tr>
<tr>
<td>requrie源码学习</td>
<td><a href="http://www.cnblogs.com/yexiaochai/p/3632580.html" target="_blank" rel="external">http://www.cnblogs.com/yexiaochai/p/3632580.html</a></td>
</tr>
<tr>
<td>requrie 入门指南</td>
<td><a href="http://www.oschina.net/translate/getting-started-with-the-requirejs-library" target="_blank" rel="external">http://www.oschina.net/translate/getting-started-with-the-requirejs-library</a></td>
</tr>
<tr>
<td>requrieJS 学习笔记</td>
<td><a href="http://www.cnblogs.com/yexiaochai/p/3214926.html" target="_blank" rel="external">http://www.cnblogs.com/yexiaochai/p/3214926.html</a></td>
</tr>
<tr>
<td>requriejs 其一</td>
<td><a href="http://cyj.me/why-seajs/requirejs/" target="_blank" rel="external">http://cyj.me/why-seajs/requirejs/</a></td>
</tr>
<tr>
<td>require backbone结合</td>
<td><a href="http://www.cnblogs.com/yexiaochai/p/3221081.html" target="_blank" rel="external">http://www.cnblogs.com/yexiaochai/p/3221081.html</a></td>
</tr>
</tbody>
</table>
<h2 id="Seajs"><a href="#Seajs" class="headerlink" title="Seajs"></a><strong>Seajs</strong></h2><table>
<thead>
<tr>
<th>Seajs</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>seajs</td>
<td><a href="http://seajs.org" target="_blank" rel="external">http://seajs.org</a></td>
</tr>
<tr>
<td>seajs 中文手册</td>
<td><a href="http://cyj.me/why-seajs/zh" target="_blank" rel="external">http://cyj.me/why-seajs/zh</a></td>
</tr>
</tbody>
</table>
<h2 id="Less-sass"><a href="#Less-sass" class="headerlink" title="Less,sass"></a><strong>Less,sass</strong></h2><table>
<thead>
<tr>
<th>Less,sass</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>sass</td>
<td><a href="http://www.w3cplus.com/sassguide" target="_blank" rel="external">http://www.w3cplus.com/sassguide</a></td>
</tr>
<tr>
<td>sass教程-sass中国</td>
<td><a href="http://www.sass.hk" target="_blank" rel="external">http://www.sass.hk</a></td>
</tr>
<tr>
<td>Sass 中文文档</td>
<td><a href="http://sass.bootcss.com" target="_blank" rel="external">http://sass.bootcss.com</a></td>
</tr>
<tr>
<td>less</td>
<td><a href="http://less.bootcss.com" target="_blank" rel="external">http://less.bootcss.com</a></td>
</tr>
</tbody>
</table>
<h2 id="Markdown"><a href="#Markdown" class="headerlink" title="Markdown"></a><strong>Markdown</strong></h2><table>
<thead>
<tr>
<th>Markdown</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Markdown 语法说明 (简体中文版</td>
<td><a href="http://wowubuntu.com/markdown" target="_blank" rel="external">http://wowubuntu.com/markdown</a></td>
</tr>
<tr>
<td>markdown入门参考</td>
<td><a href="https://github.com/LearnShare/Learning-Markdown/blob/master/README.md" target="_blank" rel="external">https://github.com/LearnShare/Learning-Markdown/blob/master/README.md</a></td>
</tr>
<tr>
<td>gitbook</td>
<td><a href="https://www.gitbook.com" target="_blank" rel="external">https://www.gitbook.com</a> 国外的在线markdown可编辑成书</td>
</tr>
<tr>
<td>mdeditor</td>
<td><a href="https://www.zybuluo.com/mdeditor" target="_blank" rel="external">https://www.zybuluo.com/mdeditor</a> 一款国内的在线markdown编辑器</td>
</tr>
<tr>
<td>stackedit</td>
<td><a href="https://stackedit.io" target="_blank" rel="external">https://stackedit.io</a> 国外的在线markdown编辑器，功能强大，同步云盘</td>
</tr>
<tr>
<td>mditor</td>
<td><a href="http://bh-lay.github.io/mditor" target="_blank" rel="external">http://bh-lay.github.io/mditor</a> 一款轻量级的markdown编辑器</td>
</tr>
<tr>
<td>lepture-editor</td>
<td><a href="https://github.com/lepture/editor" target="_blank" rel="external">https://github.com/lepture/editor</a></td>
</tr>
<tr>
<td>markdown-editor</td>
<td><a href="https://github.com/jbt/markdown-editor" target="_blank" rel="external">https://github.com/jbt/markdown-editor</a></td>
</tr>
<tr>
<td>作业部落</td>
<td><a href="https://www.zybuluo.com" target="_blank" rel="external">https://www.zybuluo.com</a> 功能强大，速度流畅，全平台同步</td>
</tr>
</tbody>
</table>
<h2 id="兼容性"><a href="#兼容性" class="headerlink" title="兼容性"></a><strong>兼容性</strong></h2><table>
<thead>
<tr>
<th>兼容性</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>esma 兼容列表</td>
<td><a href="http://kangax.github.io/compat-table/es6" target="_blank" rel="external">http://kangax.github.io/compat-table/es6</a></td>
</tr>
<tr>
<td>W3C CSS验证服务</td>
<td><a href="http://jigsaw.w3.org/css-validator/validator.html.zh-cn" target="_blank" rel="external">http://jigsaw.w3.org/css-validator/validator.html.zh-cn</a></td>
</tr>
<tr>
<td>caniuse</td>
<td><a href="http://caniuse.com/#index" target="_blank" rel="external">http://caniuse.com/#index</a></td>
</tr>
<tr>
<td>csscreator</td>
<td><a href="http://csscreator.com/properties" target="_blank" rel="external">http://csscreator.com/properties</a></td>
</tr>
<tr>
<td>microsoft</td>
<td><a href="https://msdn.microsoft.com/zh-cn/library/cc351024(v=vs.85.aspx" target="_blank" rel="external">https://msdn.microsoft.com/zh-cn/library/cc351024(v=vs.85.aspx</a></td>
</tr>
<tr>
<td>在线测兼容-移动端</td>
<td><a href="http://www.responsinator.com" target="_blank" rel="external">http://www.responsinator.com</a></td>
</tr>
<tr>
<td>emulators</td>
<td><a href="https://www.manymo.com/emulators" target="_blank" rel="external">https://www.manymo.com/emulators</a></td>
</tr>
</tbody>
</table>
<h2 id="UI相关"><a href="#UI相关" class="headerlink" title="UI相关"></a><strong>UI相关</strong></h2><table>
<thead>
<tr>
<th>UI相关</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Foundation</strong></td>
<td><a href="http://foundation.zurb.com/?form=jeffjade.com" target="_blank" rel="external">http://foundation.zurb.com/?form=jeffjade.com</a></td>
</tr>
<tr>
<td>Bootcss</td>
<td><a href="http://v3.bootcss.com/?form=jeffjade.com" target="_blank" rel="external">http://v3.bootcss.com/?form=jeffjade.com</a></td>
</tr>
<tr>
<td><strong>Element UI</strong></td>
<td><a href="http://element.eleme.io/#/zh-CN" target="_blank" rel="external">http://element.eleme.io/#/zh-CN</a> 基于Vue</td>
</tr>
<tr>
<td><strong>ANT DESIGN</strong></td>
<td><a href="http://ant.design" target="_blank" rel="external">http://ant.design</a> 一个 UI 设计语言</td>
</tr>
<tr>
<td>Smart UI</td>
<td><a href="http://smartui.chinamzz.com" target="_blank" rel="external">http://smartui.chinamzz.com</a></td>
</tr>
<tr>
<td>MetroUICSS</td>
<td><a href="http://www.w3cplus.com/MetroUICSS" target="_blank" rel="external">http://www.w3cplus.com/MetroUICSS</a></td>
</tr>
<tr>
<td>Semantic</td>
<td><a href="http://semantic-ui.com" target="_blank" rel="external">http://semantic-ui.com</a></td>
</tr>
<tr>
<td><strong>Layui</strong></td>
<td><a href="http://www.layui.com/?form=jeffjade.com" target="_blank" rel="external">http://www.layui.com/?form=jeffjade.com</a></td>
</tr>
<tr>
<td>Buttons</td>
<td><a href="http://alexwolfe.github.io/Buttons" target="_blank" rel="external">http://alexwolfe.github.io/Buttons</a></td>
</tr>
<tr>
<td>kitecss</td>
<td><a href="http://hiloki.github.io/kitecss" target="_blank" rel="external">http://hiloki.github.io/kitecss</a></td>
</tr>
<tr>
<td>pintuer</td>
<td><a href="http://www.pintuer.com" target="_blank" rel="external">http://www.pintuer.com</a></td>
</tr>
<tr>
<td>amazeui</td>
<td><a href="http://amazeui.org" target="_blank" rel="external">http://amazeui.org</a></td>
</tr>
<tr>
<td>worldhello</td>
<td><a href="http://www.worldhello.net/gotgithub/index.html" target="_blank" rel="external">http://www.worldhello.net/gotgithub/index.html</a></td>
</tr>
<tr>
<td>linuxtoy</td>
<td><a href="http://igit.linuxtoy.org/contents.html" target="_blank" rel="external">http://igit.linuxtoy.org/contents.html</a></td>
</tr>
<tr>
<td>gitmagic</td>
<td><a href="http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/zh_cn" target="_blank" rel="external">http://www-cs-students.stanford.edu/~blynn/gitmagic/intl/zh_cn</a></td>
</tr>
<tr>
<td>rogerdudler</td>
<td><a href="http://rogerdudler.github.io/git-guide/index.zh.html" target="_blank" rel="external">http://rogerdudler.github.io/git-guide/index.zh.html</a></td>
</tr>
<tr>
<td>gitref</td>
<td><a href="http://gitref.justjavac.com" target="_blank" rel="external">http://gitref.justjavac.com</a></td>
</tr>
<tr>
<td>book</td>
<td><a href="http://git-scm.com/book/zh" target="_blank" rel="external">http://git-scm.com/book/zh</a></td>
</tr>
<tr>
<td>gogojimmy</td>
<td><a href="http://gogojimmy.net/2012/01/17/how-to-use-git-1-git-basic" target="_blank" rel="external">http://gogojimmy.net/2012/01/17/how-to-use-git-1-git-basic</a></td>
</tr>
</tbody>
</table>
<h2 id="其它API"><a href="#其它API" class="headerlink" title="其它API"></a><strong>其它API</strong></h2><table>
<thead>
<tr>
<th>其它API</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>HTTP API 设计指南</td>
<td><a href="http://segmentfault.com/bookmark/1230000002521721" target="_blank" rel="external">http://segmentfault.com/bookmark/1230000002521721</a></td>
</tr>
<tr>
<td>javascript流行库汇总</td>
<td>javascriptoo</td>
</tr>
<tr>
<td>验证api</td>
<td><a href="http://niceue.com/validator/demo/index.php" target="_blank" rel="external">http://niceue.com/validator/demo/index.php</a></td>
</tr>
<tr>
<td>underscore 中文手册</td>
<td><a href="http://www.css88.com/doc/underscore" target="_blank" rel="external">http://www.css88.com/doc/underscore</a></td>
</tr>
<tr>
<td>underscore源码分析</td>
<td><a href="http://www.html-js.com/article/Underscorejs-source-code-analysis-of-underscorejs-source-code-analysis%203031" target="_blank" rel="external">http://www.html-js.com/article/Underscorejs-source-code-analysis-of-underscorejs-source-code-analysis%203031</a></td>
</tr>
<tr>
<td>underscore源码分析-亚里士朱德的博客</td>
<td><a href="http://yalishizhude.github.io/tags/underscore" target="_blank" rel="external">http://yalishizhude.github.io/tags/underscore</a></td>
</tr>
<tr>
<td>underscrejs en api</td>
<td><a href="http://underscorejs.org" target="_blank" rel="external">http://underscorejs.org</a></td>
</tr>
<tr>
<td>lodash - underscore的代替品</td>
<td><a href="https://lodash.com" target="_blank" rel="external">https://lodash.com</a></td>
</tr>
<tr>
<td>ext4api</td>
<td><a href="http://extjs-doc-cn.github.io/ext4api" target="_blank" rel="external">http://extjs-doc-cn.github.io/ext4api</a></td>
</tr>
<tr>
<td>qwrap手册</td>
<td><a href="http://dev.qwrap.com/resource/js/_docs/_youa/#/qw/base/loadJs_.htm" target="_blank" rel="external">http://dev.qwrap.com/resource/js/_docs/<em>youa/#/qw/base/loadJs</em>.htm</a></td>
</tr>
<tr>
<td>缓动函数</td>
<td><a href="http://easings.net/zh-cn" target="_blank" rel="external">http://easings.net/zh-cn</a></td>
</tr>
<tr>
<td>svg 中文参考</td>
<td><a href="http://www.w3school.com.cn/svg/svg_reference.asp" target="_blank" rel="external">http://www.w3school.com.cn/svg/svg_reference.asp</a></td>
</tr>
<tr>
<td>svg mdn参考</td>
<td><a href="https://developer.mozilla.org/en-US/docs/Web/SVG" target="_blank" rel="external">https://developer.mozilla.org/en-US/docs/Web/SVG</a></td>
</tr>
<tr>
<td>svg 导出 canvas</td>
<td><a href="https://github.com/gabelerner/canvg" target="_blank" rel="external">https://github.com/gabelerner/canvg</a></td>
</tr>
<tr>
<td>svg 导出 png</td>
<td><a href="https://github.com/exupero/saveSvgAsPng" target="_blank" rel="external">https://github.com/exupero/saveSvgAsPng</a></td>
</tr>
<tr>
<td>ai-to-svg</td>
<td><a href="http://www.zamzar.com/convert/ai-to-svg" target="_blank" rel="external">http://www.zamzar.com/convert/ai-to-svg</a></td>
</tr>
<tr>
<td>localStorage 库</td>
<td><a href="https://github.com/machao/localStorage" target="_blank" rel="external">https://github.com/machao/localStorage</a></td>
</tr>
</tbody>
</table>
<h2 id="图表类"><a href="#图表类" class="headerlink" title="图表类"></a><strong>图表类</strong></h2><table>
<thead>
<tr>
<th>图表类</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Highcharts 中文API</td>
<td><a href="http://www.hcharts.cn/api/index.php" target="_blank" rel="external">http://www.hcharts.cn/api/index.php</a></td>
</tr>
<tr>
<td>Highcharts 英文API</td>
<td><a href="http://api.highcharts.com/highcharts" target="_blank" rel="external">http://api.highcharts.com/highcharts</a></td>
</tr>
<tr>
<td>ECharts 百度的图表软件</td>
<td><a href="http://echarts.baidu.com/" target="_blank" rel="external">http://echarts.baidu.com/</a></td>
</tr>
<tr>
<td>高德地图</td>
<td><a href="http://lbs.amap.com/api" target="_blank" rel="external">http://lbs.amap.com/api</a></td>
</tr>
<tr>
<td>开源的矢量图脚本框架</td>
<td><a href="http://paperjs.org" target="_blank" rel="external">http://paperjs.org</a></td>
</tr>
<tr>
<td>svg 地图</td>
<td><a href="http://jvectormap.com" target="_blank" rel="external">http://jvectormap.com</a></td>
</tr>
</tbody>
</table>
<h2 id="正则"><a href="#正则" class="headerlink" title="正则"></a><strong>正则</strong></h2><table>
<thead>
<tr>
<th>正则</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>JS正则表达式元字符</td>
<td><a href="http://segmentfault.com/a/1190000002471140" target="_blank" rel="external">http://segmentfault.com/a/1190000002471140</a></td>
</tr>
<tr>
<td>正则表达式30分钟入门教程</td>
<td><a href="http://deerchao.net/tutorials/regex/regex.htm" target="_blank" rel="external">http://deerchao.net/tutorials/regex/regex.htm</a></td>
</tr>
<tr>
<td>MDN-正则表达式</td>
<td><a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions" target="_blank" rel="external">https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions</a></td>
</tr>
<tr>
<td>ruanyifeng - RegExp对象</td>
<td><a href="http://javascript.ruanyifeng.com/stdlib/regexp.html" target="_blank" rel="external">http://javascript.ruanyifeng.com/stdlib/regexp.html</a></td>
</tr>
<tr>
<td>小胡子哥 - 进阶正则表达式</td>
<td><a href="http://div.io/topic/764?page=1" target="_blank" rel="external">http://div.io/topic/764?page=1</a></td>
</tr>
<tr>
<td>is.js</td>
<td><a href="https://github.com/Cedriking/is.js/blob/master/is.js" target="_blank" rel="external">https://github.com/Cedriking/is.js/blob/master/is.js</a></td>
</tr>
<tr>
<td>正则在线测试</td>
<td><a href="http://regexper.com" target="_blank" rel="external">http://regexper.com</a></td>
</tr>
</tbody>
</table>
<h2 id="前端规范"><a href="#前端规范" class="headerlink" title="前端规范"></a><strong>前端规范</strong></h2><table>
<thead>
<tr>
<th>前端规范</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>通过分析github代码库总结出来的工程师代码书写习惯</td>
<td><a href="http://alloyteam.github.io/CodeGuide" target="_blank" rel="external">http://alloyteam.github.io/CodeGuide</a></td>
</tr>
<tr>
<td>HTML&amp;CSS编码规范 by @mdo</td>
<td><a href="http://codeguide.bootcss.com" target="_blank" rel="external">http://codeguide.bootcss.com</a></td>
</tr>
<tr>
<td>团队合作的css命名规范-腾讯AlloyTeam前端团队</td>
<td><a href="http://www.alloyteam.com/2011/10/css-on-team-naming/" target="_blank" rel="external">http://www.alloyteam.com/2011/10/css-on-team-naming/</a></td>
</tr>
<tr>
<td>前端编码规范之js - by yuwenhui</td>
<td><a href="http://yuwenhui.github.io" target="_blank" rel="external">http://yuwenhui.github.io</a></td>
</tr>
<tr>
<td>前端编码规范之js - by 李靖</td>
<td><a href="http://www.cnblogs.com/hustskyking/p/javascript-spec.html" target="_blank" rel="external">http://www.cnblogs.com/hustskyking/p/javascript-spec.html</a></td>
</tr>
<tr>
<td>前端开发规范手册</td>
<td><a href="http://zhibimo.com/read/Ashu/front-end-style-guide" target="_blank" rel="external">http://zhibimo.com/read/Ashu/front-end-style-guide</a></td>
</tr>
<tr>
<td>Airbnb JavaScript 编码规范（简体中文版）</td>
<td><a href="https://github.com/yuche/javascript#table-of-contents" target="_blank" rel="external">https://github.com/yuche/javascript#table-of-contents</a></td>
</tr>
<tr>
<td>AMD与CMD规范的区别</td>
<td><a href="http://www.zhihu.com/question/20351507" target="_blank" rel="external">http://www.zhihu.com/question/20351507</a></td>
</tr>
<tr>
<td>AMD与CMD规范的区别</td>
<td><a href="http://www.cnblogs.com/tugenhua0707/p/3507957.html" target="_blank" rel="external">http://www.cnblogs.com/tugenhua0707/p/3507957.html</a></td>
</tr>
<tr>
<td>KISSY 源码规范</td>
<td><a href="http://docs.kissyui.com/1.4/docs/html/tutorials/style-guide/kissy-source-style.html" target="_blank" rel="external">http://docs.kissyui.com/1.4/docs/html/tutorials/style-guide/kissy-source-style.html</a></td>
</tr>
<tr>
<td>bt编码规范</td>
<td><a href="http://codeguide.bootcss.com" target="_blank" rel="external">http://codeguide.bootcss.com</a></td>
</tr>
<tr>
<td>规范加强版</td>
<td><a href="https://github.com/Suxiaogang/Code_Guide" target="_blank" rel="external">https://github.com/Suxiaogang/Code_Guide</a></td>
</tr>
<tr>
<td>前端代码规范 及 最佳实践</td>
<td><a href="http://blog.jobbole.com/79075" target="_blank" rel="external">http://blog.jobbole.com/79075</a></td>
</tr>
<tr>
<td>百度前端规范</td>
<td><a href="http://coderlmn.github.io/code-standards" target="_blank" rel="external">http://coderlmn.github.io/code-standards</a></td>
</tr>
<tr>
<td>百度前端规范</td>
<td><a href="http://isobar-idev.github.io/code-standards" target="_blank" rel="external">http://isobar-idev.github.io/code-standards</a></td>
</tr>
<tr>
<td>百度前端规范</td>
<td><a href="http://zhuanlan.zhihu.com/fuyun/19884834" target="_blank" rel="external">http://zhuanlan.zhihu.com/fuyun/19884834</a></td>
</tr>
<tr>
<td>ECMAScript6 编码规范–广发证券前端团队</td>
<td><a href="https://github.com/gf-rd/es6-coding-style" target="_blank" rel="external">https://github.com/gf-rd/es6-coding-style</a></td>
</tr>
<tr>
<td>JavaScript 风格指南/编码规范（Airbnb公司版）</td>
<td><a href="http://blog.jobbole.com/79484" target="_blank" rel="external">http://blog.jobbole.com/79484</a></td>
</tr>
<tr>
<td>网易前端开发规范</td>
<td><a href="http://nec.netease.com/standard" target="_blank" rel="external">http://nec.netease.com/standard</a></td>
</tr>
<tr>
<td>css模块</td>
<td><a href="http://www.75team.com/archives/1049" target="_blank" rel="external">http://www.75team.com/archives/1049</a></td>
</tr>
<tr>
<td>前端规范资源列表</td>
<td><a href="https://github.com/ecomfe/spec" target="_blank" rel="external">https://github.com/ecomfe/spec</a></td>
</tr>
</tbody>
</table>
<h2 id="PHP"><a href="#PHP" class="headerlink" title="PHP"></a><strong>PHP</strong></h2><table>
<thead>
<tr>
<th>PHP</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>最流行的PHP 代码规范</td>
<td><a href="http://segmentfault.com/a/1190000000443795" target="_blank" rel="external">http://segmentfault.com/a/1190000000443795</a></td>
</tr>
<tr>
<td>最流行的PHP 代码规范</td>
<td><a href="https://github.com/hfcorriez/fig-standards/blob/zh_CN/%E6%8E%A5%E5%8F%97/PSR-2-coding-style-guide.md" target="_blank" rel="external">https://github.com/hfcorriez/fig-standards/blob/zh_CN/%E6%8E%A5%E5%8F%97/PSR-2-coding-style-guide.md</a></td>
</tr>
</tbody>
</table>
<h2 id="各大公司开源项目"><a href="#各大公司开源项目" class="headerlink" title="各大公司开源项目"></a><strong>各大公司开源项目</strong></h2><table>
<thead>
<tr>
<th>各大公司开源项目</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Facebook Projects</td>
<td><a href="https://code.facebook.com/projects/web" target="_blank" rel="external">https://code.facebook.com/projects/web</a></td>
</tr>
<tr>
<td>百度web前端研发部</td>
<td><a href="http://fex.baidu.com" target="_blank" rel="external">http://fex.baidu.com</a></td>
</tr>
<tr>
<td>百度EFE</td>
<td><a href="http://efe.baidu.com" target="_blank" rel="external">http://efe.baidu.com</a></td>
</tr>
<tr>
<td>百度github</td>
<td><a href="https://github.com/fex-team" target="_blank" rel="external">https://github.com/fex-team</a></td>
</tr>
<tr>
<td>alloyteam</td>
<td><a href="http://www.alloyteam.com" target="_blank" rel="external">http://www.alloyteam.com</a></td>
</tr>
<tr>
<td>alloyteam-github</td>
<td><a href="http://alloyteam.github.io" target="_blank" rel="external">http://alloyteam.github.io</a></td>
</tr>
<tr>
<td>alloyteam-AlloyGameEngine</td>
<td><a href="https://github.com/AlloyTeam/AlloyGameEngine" target="_blank" rel="external">https://github.com/AlloyTeam/AlloyGameEngine</a></td>
</tr>
<tr>
<td>AlloyDesigner</td>
<td><a href="http://alloyteam.github.io/AlloyDesigner" target="_blank" rel="external">http://alloyteam.github.io/AlloyDesigner</a> 即时修改，即时保存，设计稿较正，其它开发辅助工具</td>
</tr>
<tr>
<td>H5交互页编辑器AEditor介绍</td>
<td><a href="http://www.alloyteam.com/2015/06/h5-jiao-hu-ye-bian-ji-qi-aeditor-jie-shao" target="_blank" rel="external">http://www.alloyteam.com/2015/06/h5-jiao-hu-ye-bian-ji-qi-aeditor-jie-shao</a> H5动画交互页开发的工具介绍</td>
</tr>
<tr>
<td>AEditor</td>
<td><a href="http://aeditor.alloyteam.com" target="_blank" rel="external">http://aeditor.alloyteam.com</a> H5动画交互页开发的工具</td>
</tr>
<tr>
<td>值得订阅的weekly</td>
<td><a href="https://github.com/fenbility/weekly-feed" target="_blank" rel="external">https://github.com/fenbility/weekly-feed</a></td>
</tr>
<tr>
<td>奇舞团开源项目</td>
<td><a href="http://75team.github.io" target="_blank" rel="external">http://75team.github.io</a></td>
</tr>
<tr>
<td>Qunar UED</td>
<td><a href="http://ued.qunar.com" target="_blank" rel="external">http://ued.qunar.com</a></td>
</tr>
<tr>
<td>Scrat</td>
<td><a href="http://scrat.io" target="_blank" rel="external">http://scrat.io</a></td>
</tr>
</tbody>
</table>
<h2 id="常用"><a href="#常用" class="headerlink" title="常用"></a><strong>常用</strong></h2><table>
<thead>
<tr>
<th>常用</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>ieBetter.js-让IE6-IE8拥有IE9+,Chrome等浏览器特性</td>
<td><a href="http://www.zhangxinxu.com/wordpress/2013/12/iebetter-js-make-ie6-ie8-like-modern-browser-ie9-chrome" target="_blank" rel="external">http://www.zhangxinxu.com/wordpress/2013/12/iebetter-js-make-ie6-ie8-like-modern-browser-ie9-chrome</a></td>
</tr>
<tr>
<td>模拟键盘</td>
<td><a href="http://mottie.github.io/Keyboard" target="_blank" rel="external">http://mottie.github.io/Keyboard</a></td>
</tr>
<tr>
<td>拼音</td>
<td><a href="https://github.com/hotoo/pinyin" target="_blank" rel="external">https://github.com/hotoo/pinyin</a></td>
</tr>
<tr>
<td>中国个人身份证号验证</td>
<td><a href="https://github.com/mc-zone/IDValidator" target="_blank" rel="external">https://github.com/mc-zone/IDValidator</a></td>
</tr>
</tbody>
</table>
<h2 id="算法"><a href="#算法" class="headerlink" title="算法"></a><strong>算法</strong></h2><table>
<thead>
<tr>
<th>算法</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>数据结构与算法 JavaScript 描述. 章节练习</td>
<td><a href="https://github.com/Ralph-Wang/algorithm.in.js" target="_blank" rel="external">https://github.com/Ralph-Wang/algorithm.in.js</a></td>
</tr>
<tr>
<td>常见排序算法（JS版）</td>
<td><a href="https://github.com/twobin/twobinSort" target="_blank" rel="external">https://github.com/twobin/twobinSort</a></td>
</tr>
<tr>
<td>经典排序</td>
<td><a href="https://github.com/luofei2011/jsAgm/blob/master/js/sort.js" target="_blank" rel="external">https://github.com/luofei2011/jsAgm/blob/master/js/sort.js</a></td>
</tr>
<tr>
<td>常见排序算法-js版本</td>
<td><a href="https://github.com/hechangmin/jssort" target="_blank" rel="external">https://github.com/hechangmin/jssort</a></td>
</tr>
<tr>
<td>JavaScript 算法与数据结构 精华集</td>
<td><a href="https://github.com/lightningtgc/JavaScript-Algorithms" target="_blank" rel="external">https://github.com/lightningtgc/JavaScript-Algorithms</a></td>
</tr>
<tr>
<td>面试常考算法题精讲</td>
<td><a href="http://www.nowcoder.com/live/courses" target="_blank" rel="external">http://www.nowcoder.com/live/courses</a></td>
</tr>
</tbody>
</table>
<h2 id="移动端"><a href="#移动端" class="headerlink" title="移动端"></a><strong>移动端</strong></h2><table>
<thead>
<tr>
<th>移动端</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>fastclick</td>
<td><a href="https://github.com/ftlabs/fastclick" target="_blank" rel="external">https://github.com/ftlabs/fastclick</a></td>
</tr>
<tr>
<td>no-click-delay</td>
<td><a href="https://github.com/mmastrac/jquery-noclickdelay" target="_blank" rel="external">https://github.com/mmastrac/jquery-noclickdelay</a></td>
</tr>
<tr>
<td>【敏捷开发】Android团队开发规范</td>
<td><a href="http://www.cnblogs.com/lcw/p/3619181.html" target="_blank" rel="external">http://www.cnblogs.com/lcw/p/3619181.html</a></td>
</tr>
<tr>
<td>Android 开发规范与应用</td>
<td><a href="http://www.jianshu.com/p/4390f4fe19b3" target="_blank" rel="external">http://www.jianshu.com/p/4390f4fe19b3</a></td>
</tr>
<tr>
<td><strong>ionic</strong></td>
<td><a href="https://github.com/ychow/ionic-guide" target="_blank" rel="external">https://github.com/ychow/ionic-guide</a></td>
</tr>
</tbody>
</table>
<h2 id="JSON"><a href="#JSON" class="headerlink" title="JSON"></a><strong>JSON</strong></h2><table>
<thead>
<tr>
<th>JSON</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>模拟生成JSON数据</td>
<td><a href="http://beta.json-generator.com" target="_blank" rel="external">http://beta.json-generator.com</a></td>
</tr>
</tbody>
</table>
<h2 id="焦点图"><a href="#焦点图" class="headerlink" title="焦点图"></a><strong>焦点图</strong></h2><table>
<thead>
<tr>
<th>焦点图</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>myfocus</td>
<td><a href="https://github.com/koen301/myfocus" target="_blank" rel="external">https://github.com/koen301/myfocus</a></td>
</tr>
<tr>
<td>myfocus-官方演示站</td>
<td><a href="http://www.chhua.com/myfocus" target="_blank" rel="external">http://www.chhua.com/myfocus</a></td>
</tr>
<tr>
<td>SuperSlidev2.1 – 大话主席</td>
<td><a href="http://www.superslide2.com" target="_blank" rel="external">http://www.superslide2.com</a></td>
</tr>
<tr>
<td>soChange</td>
<td><a href="http://www.bujichong.com/sojs/soChange/index.html" target="_blank" rel="external">http://www.bujichong.com/sojs/soChange/index.html</a></td>
</tr>
</tbody>
</table>
<h2 id="Ext-EasyUI-J-UI-及其它各种UI方案"><a href="#Ext-EasyUI-J-UI-及其它各种UI方案" class="headerlink" title="Ext, EasyUI, J-UI 及其它各种UI方案"></a><strong>Ext, EasyUI, J-UI 及其它各种UI方案</strong></h2><table>
<thead>
<tr>
<th>Ext, EasyUI, J-UI 及其它各种UI方案</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>雅虎UI - CSS UI</td>
<td><a href="http://developer.yahoo.com/yui/grids" target="_blank" rel="external">http://developer.yahoo.com/yui/grids</a></td>
</tr>
<tr>
<td>extjs</td>
<td><a href="https://www.sencha.com/products/extjs" target="_blank" rel="external">https://www.sencha.com/products/extjs</a></td>
</tr>
<tr>
<td>ext4英文api</td>
<td><a href="http://docs.sencha.com/extjs/4.0.7" target="_blank" rel="external">http://docs.sencha.com/extjs/4.0.7</a></td>
</tr>
<tr>
<td>ext4中文api</td>
<td><a href="http://extjs-doc-cn.github.io/ext4api" target="_blank" rel="external">http://extjs-doc-cn.github.io/ext4api</a></td>
</tr>
<tr>
<td>jquery easyui 未压缩源代码</td>
<td><a href="http://jquery-easyui.googlecode.com/svn/trunk/src" target="_blank" rel="external">http://jquery-easyui.googlecode.com/svn/trunk/src</a></td>
</tr>
<tr>
<td>J-UI</td>
<td><a href="http://jui.org" target="_blank" rel="external">http://jui.org</a></td>
</tr>
<tr>
<td>MUI-最接近原生APP体验的高性能前端框架</td>
<td><a href="http://dcloudio.github.io/mui" target="_blank" rel="external">http://dcloudio.github.io/mui</a></td>
</tr>
<tr>
<td>Amaze UI(中国首个开源 HTML5 跨屏前端框架)</td>
<td><a href="http://amazeui.org" target="_blank" rel="external">http://amazeui.org</a></td>
</tr>
<tr>
<td>淘宝 HTML5 前端框架</td>
<td><a href="http://m.sui.taobao.org" target="_blank" rel="external">http://m.sui.taobao.org</a></td>
</tr>
<tr>
<td>KISSY - 阿里前端JavaScript库</td>
<td><a href="http://docs.kissyui.com" target="_blank" rel="external">http://docs.kissyui.com</a></td>
</tr>
<tr>
<td>网易Nej - Nice Easy Javascript</td>
<td><a href="http://nej.netease.com" target="_blank" rel="external">http://nej.netease.com</a></td>
</tr>
<tr>
<td>Kendo UI MVVM Demo</td>
<td><a href="http://demos.telerik.com/kendo-ui/mvvm/index" target="_blank" rel="external">http://demos.telerik.com/kendo-ui/mvvm/index</a></td>
</tr>
</tbody>
</table>
<h2 id="页面-社会化-分享功能"><a href="#页面-社会化-分享功能" class="headerlink" title="页面 社会化 分享功能"></a><strong>页面 社会化 分享功能</strong></h2><table>
<thead>
<tr>
<th>页面 社会化 分享功能</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>百度分享</td>
<td><a href="http://share.baidu.com" target="_blank" rel="external">http://share.baidu.com</a> pc端</td>
</tr>
<tr>
<td>JiaThis</td>
<td><a href="http://jiathis.com" target="_blank" rel="external">http://jiathis.com</a> pc端</td>
</tr>
<tr>
<td>社会化分享组件</td>
<td><a href="http://developer.baidu.com/soc/share" target="_blank" rel="external">http://developer.baidu.com/soc/share</a> 移动端</td>
</tr>
<tr>
<td>ShareSDK 轻松实现社会化功能</td>
<td><a href="http://www.mob.com/#/index" target="_blank" rel="external">http://www.mob.com/#/index</a> 移动端</td>
</tr>
<tr>
<td>友盟分享</td>
<td><a href="http://dev.umeng.com/social/android/quick-integration" target="_blank" rel="external">http://dev.umeng.com/social/android/quick-integration</a> 移动端</td>
</tr>
</tbody>
</table>
<h2 id="富文本编辑器"><a href="#富文本编辑器" class="headerlink" title="富文本编辑器"></a><strong>富文本编辑器</strong></h2><table>
<thead>
<tr>
<th>富文本编辑器</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>功能齐全 tinymce</td>
<td><a href="https://www.tinymce.com" target="_blank" rel="external">https://www.tinymce.com</a></td>
</tr>
<tr>
<td>百度 ueditor</td>
<td><a href="http://ueditor.baidu.com/website" target="_blank" rel="external">http://ueditor.baidu.com/website</a></td>
</tr>
<tr>
<td>经典的ckeditor</td>
<td><a href="http://ckeditor.com" target="_blank" rel="external">http://ckeditor.com</a></td>
</tr>
<tr>
<td>经典的kindeditor</td>
<td><a href="http://kindeditor.net" target="_blank" rel="external">http://kindeditor.net</a></td>
</tr>
<tr>
<td>wysiwyg</td>
<td><a href="http://www.bootcss.com/p/bootstrap-wysiwyg" target="_blank" rel="external">http://www.bootcss.com/p/bootstrap-wysiwyg</a></td>
</tr>
<tr>
<td>一个有情怀的编辑器。Bach’s Editor</td>
<td><a href="http://integ.github.io/BachEditor" target="_blank" rel="external">http://integ.github.io/BachEditor</a></td>
</tr>
<tr>
<td>tower用的编辑器</td>
<td><a href="https://github.com/mycolorway/simditor" target="_blank" rel="external">https://github.com/mycolorway/simditor</a></td>
</tr>
<tr>
<td>summernote 编辑器</td>
<td><a href="https://github.com/summernote/summernote" target="_blank" rel="external">https://github.com/summernote/summernote</a></td>
</tr>
<tr>
<td>html5编辑器</td>
<td><a href="http://neilj.github.io/Squire" target="_blank" rel="external">http://neilj.github.io/Squire</a></td>
</tr>
<tr>
<td>Quilljs编辑器</td>
<td><a href="http://quilljs.com" target="_blank" rel="external">http://quilljs.com</a></td>
</tr>
<tr>
<td>wangEditor</td>
<td><a href="https://github.com/wangfupeng1988/wangEditor" target="_blank" rel="external">https://github.com/wangfupeng1988/wangEditor</a></td>
</tr>
</tbody>
</table>
<h2 id="前端概述"><a href="#前端概述" class="headerlink" title="前端概述"></a><strong>前端概述</strong></h2><table>
<thead>
<tr>
<th>前端概述</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>前端工具大全</td>
<td><a href="http://www.awesomes.cn" target="_blank" rel="external">http://www.awesomes.cn</a></td>
</tr>
<tr>
<td>什么是前端工程化</td>
<td><a href="https://github.com/fouber/blog/issues/10?from=timeline&amp;isappinstalled=0#" target="_blank" rel="external">https://github.com/fouber/blog/issues/10?from=timeline&amp;isappinstalled=0#</a></td>
</tr>
<tr>
<td>[译] 前端攻略-从路人甲到英雄无敌</td>
<td><a href="https://segmentfault.com/a/1190000005174755" target="_blank" rel="external">https://segmentfault.com/a/1190000005174755</a></td>
</tr>
</tbody>
</table>
<h2 id="Gulp"><a href="#Gulp" class="headerlink" title="Gulp"></a><strong>Gulp</strong></h2><table>
<thead>
<tr>
<th>Gulp</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Gulp官网</td>
<td><a href="http://gulpjs.com" target="_blank" rel="external">http://gulpjs.com</a></td>
</tr>
<tr>
<td>Gulp中文网</td>
<td><a href="http://www.gulpjs.com.cn" target="_blank" rel="external">http://www.gulpjs.com.cn</a></td>
</tr>
<tr>
<td>gulp资料收集</td>
<td><a href="https://github.com/Platform-CUF/use-gulp" target="_blank" rel="external">https://github.com/Platform-CUF/use-gulp</a></td>
</tr>
<tr>
<td>Gulp：任务自动管理工具 - ruanyifeng</td>
<td><a href="http://javascript.ruanyifeng.com/tool/gulp.html" target="_blank" rel="external">http://javascript.ruanyifeng.com/tool/gulp.html</a></td>
</tr>
<tr>
<td>Gulp插件</td>
<td><a href="http://gulpjs.com/plugins" target="_blank" rel="external">http://gulpjs.com/plugins</a></td>
</tr>
<tr>
<td>Gulp探究折腾之路(I)</td>
<td><a href="http://www.jeffjade.com/2015/11/25/2015-11-25-toss-gulp/" target="_blank" rel="external">http://www.jeffjade.com/2015/11/25/2015-11-25-toss-gulp/</a></td>
</tr>
<tr>
<td>Gulp折腾之路(II)</td>
<td><a href="http://www.jeffjade.com/2016/01/19/2016-01-19-toss-gulp/" target="_blank" rel="external">http://www.jeffjade.com/2016/01/19/2016-01-19-toss-gulp/</a></td>
</tr>
<tr>
<td>Gulp不完全入门教程</td>
<td><a href="http://www.ido321.com/1622.html" target="_blank" rel="external">http://www.ido321.com/1622.html</a></td>
</tr>
<tr>
<td>为什么使用gulp?</td>
<td><a href="https://github.com/hjzheng/CUF_meeting_knowledge_share/issues/33" target="_blank" rel="external">https://github.com/hjzheng/CUF_meeting_knowledge_share/issues/33</a></td>
</tr>
<tr>
<td>Gulp安装及配合组件构建前端开发一体化</td>
<td><a href="http://www.dbpoo.com/getting-started-with-gulp" target="_blank" rel="external">http://www.dbpoo.com/getting-started-with-gulp</a></td>
</tr>
<tr>
<td>Gulp 入门指南</td>
<td><a href="https://github.com/nimojs/gulp-book" target="_blank" rel="external">https://github.com/nimojs/gulp-book</a></td>
</tr>
<tr>
<td>Gulp 入门指南 - nimojs</td>
<td><a href="https://github.com/nimojs/blog/issues/19" target="_blank" rel="external">https://github.com/nimojs/blog/issues/19</a></td>
</tr>
<tr>
<td>Gulp in Action</td>
<td><a href="http://www.imooc.com/video/5692" target="_blank" rel="external">http://www.imooc.com/video/5692</a></td>
</tr>
<tr>
<td>Gulp开发教程（翻译）</td>
<td><a href="http://www.w3ctech.com/topic/134" target="_blank" rel="external">http://www.w3ctech.com/topic/134</a></td>
</tr>
<tr>
<td>前端构建工具gulpjs的使用介绍及技巧</td>
<td><a href="http://www.cnblogs.com/2050/p/4198792.html" target="_blank" rel="external">http://www.cnblogs.com/2050/p/4198792.html</a></td>
</tr>
</tbody>
</table>
<h2 id="Grunt"><a href="#Grunt" class="headerlink" title="Grunt"></a><strong>Grunt</strong></h2><table>
<thead>
<tr>
<th>Grunt</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>gruntjs</td>
<td><a href="http://gruntjs.com" target="_blank" rel="external">http://gruntjs.com</a></td>
</tr>
<tr>
<td>Grunt中文网</td>
<td><a href="http://www.gruntjs.net" target="_blank" rel="external">http://www.gruntjs.net</a></td>
</tr>
</tbody>
</table>
<h2 id="Fis"><a href="#Fis" class="headerlink" title="Fis"></a><strong>Fis</strong></h2><table>
<thead>
<tr>
<th>Fis</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>fis 官网</td>
<td><a href="http://fex-team.github.io/fis-site/index.html" target="_blank" rel="external">http://fex-team.github.io/fis-site/index.html</a></td>
</tr>
<tr>
<td>fis</td>
<td><a href="http://fis.baidu.com" target="_blank" rel="external">http://fis.baidu.com</a></td>
</tr>
</tbody>
</table>
<h2 id="pc图轮"><a href="#pc图轮" class="headerlink" title="pc图轮"></a><strong>pc图轮</strong></h2><table>
<thead>
<tr>
<th>pc图轮</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Vue 的图片轮播组件:vue-slider</td>
<td><a href="https://github.com/qusiba/vue-slider" target="_blank" rel="external">https://github.com/qusiba/vue-slider</a></td>
</tr>
<tr>
<td>左右按钮多图切换</td>
<td><a href="http://bxslider.com/examples/carousel-demystified" target="_blank" rel="external">http://bxslider.com/examples/carousel-demystified</a></td>
</tr>
<tr>
<td>fullpage全屏轮播</td>
<td><a href="https://github.com/alvarotrigo/fullPage.js" target="_blank" rel="external">https://github.com/alvarotrigo/fullPage.js</a></td>
</tr>
</tbody>
</table>
<h2 id="移动端图轮"><a href="#移动端图轮" class="headerlink" title="移动端图轮"></a><strong>移动端图轮</strong></h2><table>
<thead>
<tr>
<th>移动端图轮</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>滑屏效果</td>
<td><a href="http://www.idangero.us/swiper" target="_blank" rel="external">http://www.idangero.us/swiper</a></td>
</tr>
<tr>
<td>全屏fullpage</td>
<td><a href="https://github.com/peunzhang/fullpage" target="_blank" rel="external">https://github.com/peunzhang/fullpage</a></td>
</tr>
<tr>
<td>单个图片切换</td>
<td><a href="https://github.com/qiqiboy/touchslider" target="_blank" rel="external">https://github.com/qiqiboy/touchslider</a></td>
</tr>
<tr>
<td>单个全屏切换</td>
<td><a href="https://github.com/peunzhang/slip.js" target="_blank" rel="external">https://github.com/peunzhang/slip.js</a></td>
</tr>
<tr>
<td>百度的切换库</td>
<td><a href="http://touch.code.baidu.com/examples.html?qq-pf-to=pcqq.group" target="_blank" rel="external">http://touch.code.baidu.com/examples.html?qq-pf-to=pcqq.group</a></td>
</tr>
<tr>
<td>单个全屏切换</td>
<td><a href="https://github.com/peunzhang/iSlider" target="_blank" rel="external">https://github.com/peunzhang/iSlider</a></td>
</tr>
<tr>
<td>滑屏效果</td>
<td><a href="https://github.com/saw/touch-interfaces" target="_blank" rel="external">https://github.com/saw/touch-interfaces</a></td>
</tr>
<tr>
<td>旋转拖动设置</td>
<td><a href="http://baijs.com/tinycircleslider" target="_blank" rel="external">http://baijs.com/tinycircleslider</a></td>
</tr>
<tr>
<td>类似于swipe切换</td>
<td><a href="http://touchslider.com" target="_blank" rel="external">http://touchslider.com</a></td>
</tr>
<tr>
<td>支持多种形式的触摸滑动</td>
<td><a href="http://www.swiper.com.cn/demo/index.html" target="_blank" rel="external">http://www.swiper.com.cn/demo/index.html</a></td>
</tr>
<tr>
<td>滑屏效果</td>
<td><a href="https://github.com/joker-ye/main/blob/master/wap/index.html" target="_blank" rel="external">https://github.com/joker-ye/main/blob/master/wap/index.html</a></td>
</tr>
<tr>
<td>大话主席pc移动图片轮换</td>
<td><a href="http://www.superslide2.com" target="_blank" rel="external">http://www.superslide2.com</a></td>
</tr>
<tr>
<td>滑屏效果</td>
<td><a href="https://github.com/hahnzhu/parallax.js" target="_blank" rel="external">https://github.com/hahnzhu/parallax.js</a></td>
</tr>
<tr>
<td>基于zepto的fullpage</td>
<td><a href="https://github.com/yanhaijing/zepto.fullpage" target="_blank" rel="external">https://github.com/yanhaijing/zepto.fullpage</a></td>
</tr>
<tr>
<td>[WebApp]定宽网页设计下，固定宽度布局开发WebApp并实现多终端下WebApp布局自适应</td>
<td><a href="http://www.cnblogs.com/plums/archive/2013/01/10/WebApp-fixed-width-layout-of-multi-terminal-adapter-since.html" target="_blank" rel="external">http://www.cnblogs.com/plums/archive/2013/01/10/WebApp-fixed-width-layout-of-multi-terminal-adapter-since.html</a></td>
</tr>
<tr>
<td>判断微信客户端的那些坑</td>
<td><a href="http://loo2k.com/blog/detecting-wechat-client" target="_blank" rel="external">http://loo2k.com/blog/detecting-wechat-client</a></td>
</tr>
<tr>
<td>可以通过javascript直接调用原生分享的工具</td>
<td><a href="https://github.com/JefferyWang/nativeShare.js" target="_blank" rel="external">https://github.com/JefferyWang/nativeShare.js</a></td>
</tr>
<tr>
<td>JiaThis 分享到微信代码</td>
<td><a href="http://www.jiathis.com/help/html/weixin-share-code" target="_blank" rel="external">http://www.jiathis.com/help/html/weixin-share-code</a></td>
</tr>
<tr>
<td>聊聊移动端跨平台开发的各种技术</td>
<td><a href="http://fex.baidu.com/blog/2015/05/cross-mobile" target="_blank" rel="external">http://fex.baidu.com/blog/2015/05/cross-mobile</a></td>
</tr>
<tr>
<td>前端自动化测试</td>
<td><a href="http://www.zhihu.com/question/29922082" target="_blank" rel="external">http://www.zhihu.com/question/29922082</a></td>
</tr>
<tr>
<td>多种轮换图片</td>
<td><a href="http://ajccom.github.io/niceslider" target="_blank" rel="external">http://ajccom.github.io/niceslider</a></td>
</tr>
<tr>
<td>滑动侧边栏</td>
<td><a href="https://mango.github.io/slideout" target="_blank" rel="external">https://mango.github.io/slideout</a></td>
</tr>
</tbody>
</table>
<h2 id="文件上传"><a href="#文件上传" class="headerlink" title="文件上传"></a><strong>文件上传</strong></h2><table>
<thead>
<tr>
<th>文件上传</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>百度上传组件</td>
<td><a href="http://fex.baidu.com/webuploader" target="_blank" rel="external">http://fex.baidu.com/webuploader</a></td>
</tr>
<tr>
<td>上传</td>
<td><a href="https://blueimp.github.io/jQuery-File-Upload" target="_blank" rel="external">https://blueimp.github.io/jQuery-File-Upload</a></td>
</tr>
<tr>
<td>flash 头像上传</td>
<td><a href="http://www.hdfu.net" target="_blank" rel="external">http://www.hdfu.net</a></td>
</tr>
<tr>
<td>图片上传预览</td>
<td><a href="http://www.dropzonejs.com" target="_blank" rel="external">http://www.dropzonejs.com</a></td>
</tr>
<tr>
<td>图片裁剪</td>
<td><a href="http://elemefe.github.io/image-cropper" target="_blank" rel="external">http://elemefe.github.io/image-cropper</a></td>
</tr>
<tr>
<td>图片裁剪-shearphoto</td>
<td><a href="http://www.shearphoto.com" target="_blank" rel="external">http://www.shearphoto.com</a></td>
</tr>
<tr>
<td>jQuery图片处理</td>
<td><a href="http://www.oschina.net/project/tag/284/jquery-image-tools?lang=0&amp;os=0&amp;sort=view&amp;p=2" target="_blank" rel="external">http://www.oschina.net/project/tag/284/jquery-image-tools?lang=0&amp;os=0&amp;sort=view&amp;p=2</a></td>
</tr>
</tbody>
</table>
<h2 id="模拟select"><a href="#模拟select" class="headerlink" title="模拟select"></a><strong>模拟select</strong></h2><table>
<thead>
<tr>
<th>模拟select</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>糖饼 select</td>
<td><a href="http://aui.github.io/popupjs/doc/selectbox.html" target="_blank" rel="external">http://aui.github.io/popupjs/doc/selectbox.html</a></td>
</tr>
<tr>
<td>flexselect</td>
<td><a href="https://github.com/rmm5t/jquery-flexselect" target="_blank" rel="external">https://github.com/rmm5t/jquery-flexselect</a></td>
</tr>
<tr>
<td>双select</td>
<td><a href="http://loudev.com" target="_blank" rel="external">http://loudev.com</a></td>
</tr>
<tr>
<td>select2</td>
<td><a href="http://select2.github.io" target="_blank" rel="external">http://select2.github.io</a></td>
</tr>
</tbody>
</table>
<h2 id="取色插件"><a href="#取色插件" class="headerlink" title="取色插件"></a><strong>取色插件</strong></h2><table>
<thead>
<tr>
<th>取色插件</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>类似 Photoshop 的界面取色插件</td>
<td><a href="http://www.jq22.com/plugin/367" target="_blank" rel="external">http://www.jq22.com/plugin/367</a></td>
</tr>
<tr>
<td>jquery color</td>
<td><a href="https://github.com/jquery/jquery-color" target="_blank" rel="external">https://github.com/jquery/jquery-color</a></td>
</tr>
<tr>
<td>取色插件集合</td>
<td><a href="http://www.oschina.net/project/tag/287/color-picker" target="_blank" rel="external">http://www.oschina.net/project/tag/287/color-picker</a></td>
</tr>
<tr>
<td>farbtastic 圆环＋正方形</td>
<td><a href="https://github.com/mattfarina/farbtastic" target="_blank" rel="external">https://github.com/mattfarina/farbtastic</a></td>
</tr>
</tbody>
</table>
<h2 id="城市联动"><a href="#城市联动" class="headerlink" title="城市联动"></a><strong>城市联动</strong></h2><table>
<thead>
<tr>
<th>城市联动</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>jquery.cityselect.js基于jQuery+JSON的省市或自定义联动效果</td>
<td><a href="http://www.ijquery.cn/?p=360" target="_blank" rel="external">http://www.ijquery.cn/?p=360</a></td>
</tr>
</tbody>
</table>
<h2 id="剪贴板"><a href="#剪贴板" class="headerlink" title="剪贴板"></a><strong>剪贴板</strong></h2><table>
<thead>
<tr>
<th>剪贴板</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>剪贴板</td>
<td><a href="https://github.com/zeroclipboard/zeroclipboard" target="_blank" rel="external">https://github.com/zeroclipboard/zeroclipboard</a></td>
</tr>
<tr>
<td>clipboard 最新的剪切方案</td>
<td><a href="http://zenorocha.github.io/clipboard.js" target="_blank" rel="external">http://zenorocha.github.io/clipboard.js</a></td>
</tr>
<tr>
<td>不是Flash的剪贴板</td>
<td><a href="https://github.com/zenorocha/clipboard.js" target="_blank" rel="external">https://github.com/zenorocha/clipboard.js</a></td>
</tr>
</tbody>
</table>
<h2 id="简繁转换"><a href="#简繁转换" class="headerlink" title="简繁转换"></a><strong>简繁转换</strong></h2><table>
<thead>
<tr>
<th>简繁转换</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>简繁转换</td>
<td><a href="https://github.com/BYVoid/OpenCC" target="_blank" rel="external">https://github.com/BYVoid/OpenCC</a></td>
</tr>
</tbody>
</table>
<h2 id="表格-Grid"><a href="#表格-Grid" class="headerlink" title="表格 Grid"></a><strong>表格 Grid</strong></h2><table>
<thead>
<tr>
<th>表格 Grid</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>facebook表格</td>
<td><a href="http://facebook.github.io/fixed-data-table" target="_blank" rel="external">http://facebook.github.io/fixed-data-table</a></td>
</tr>
<tr>
<td>类似于Excel编辑表格-handsontable</td>
<td><a href="http://handsontable.com" target="_blank" rel="external">http://handsontable.com</a></td>
</tr>
<tr>
<td>bootstrap-table插件</td>
<td><a href="http://bootstrap-table.wenzhixin.net.cn" target="_blank" rel="external">http://bootstrap-table.wenzhixin.net.cn</a></td>
</tr>
<tr>
<td>datatables</td>
<td><a href="https://www.datatables.net" target="_blank" rel="external">https://www.datatables.net</a></td>
</tr>
</tbody>
</table>
<h2 id="在线演示"><a href="#在线演示" class="headerlink" title="在线演示"></a><strong>在线演示</strong></h2><table>
<thead>
<tr>
<th>在线演示</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>js 在线编辑 - runjs</td>
<td><a href="http://runjs.cn" target="_blank" rel="external">http://runjs.cn</a></td>
</tr>
<tr>
<td>js 在线编辑 - jsbin</td>
<td><a href="http://jsbin.com" target="_blank" rel="external">http://jsbin.com</a></td>
</tr>
<tr>
<td>js 在线编辑 - codepen</td>
<td><a href="http://codepen.io" target="_blank" rel="external">http://codepen.io</a></td>
</tr>
<tr>
<td>js 在线编辑 - jsfiddle</td>
<td><a href="http://jsfiddle.net" target="_blank" rel="external">http://jsfiddle.net</a></td>
</tr>
<tr>
<td>java 在线编辑 - runjs</td>
<td><a href="http://ideone.com" target="_blank" rel="external">http://ideone.com</a></td>
</tr>
<tr>
<td>js 在线编辑 - hcharts</td>
<td><a href="http://code.hcharts.cn" target="_blank" rel="external">http://code.hcharts.cn</a></td>
</tr>
<tr>
<td>js 在线编辑 - jsdm</td>
<td><a href="http://jsdm.com" target="_blank" rel="external">http://jsdm.com</a></td>
</tr>
<tr>
<td>sql 在线编辑 - sqlfiddle</td>
<td><a href="http://sqlfiddle.com" target="_blank" rel="external">http://sqlfiddle.com</a></td>
</tr>
<tr>
<td>mozilla 在线编辑器</td>
<td><a href="https://thimble.mozilla.org" target="_blank" rel="external">https://thimble.mozilla.org</a></td>
</tr>
</tbody>
</table>
<h2 id="常规优化"><a href="#常规优化" class="headerlink" title="常规优化"></a><strong>常规优化</strong></h2><table>
<thead>
<tr>
<th>常规优化</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Javascript高性能动画与页面渲染</td>
<td><a href="http://www.infoq.com/cn/articles/javascript-high-performance-animation-and-page-rendering" target="_blank" rel="external">http://www.infoq.com/cn/articles/javascript-high-performance-animation-and-page-rendering</a></td>
</tr>
<tr>
<td>移动H5前端性能优化指南</td>
<td><a href="http://isux.tencent.com/h5-performance.html" target="_blank" rel="external">http://isux.tencent.com/h5-performance.html</a></td>
</tr>
<tr>
<td>5173首页前端性能优化实践</td>
<td><a href="http://ued.5173.com/?p=1731" target="_blank" rel="external">http://ued.5173.com/?p=1731</a></td>
</tr>
<tr>
<td>给网页设计师和前端开发者看的前端性能优化</td>
<td><a href="http://www.uisdc.com/front-end-performance-for-web-designers-and-front-end-developers" target="_blank" rel="external">http://www.uisdc.com/front-end-performance-for-web-designers-and-front-end-developers</a></td>
</tr>
<tr>
<td>复杂应用的 CSS 性能分析和优化建议</td>
<td><a href="http://www.orzpoint.com/profiling-css-and-optimization-notes" target="_blank" rel="external">http://www.orzpoint.com/profiling-css-and-optimization-notes</a></td>
</tr>
<tr>
<td>张鑫旭——前端性能</td>
<td><a href="http://www.zhangxinxu.com/wordpress/tag/%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD" target="_blank" rel="external">张鑫旭——前端性能</a></td>
</tr>
<tr>
<td>前端性能监控总结</td>
<td><a href="http://www.xiaoqiang.org/javascript/font-end-performance-monitor.html" target="_blank" rel="external">http://www.xiaoqiang.org/javascript/font-end-performance-monitor.html</a></td>
</tr>
<tr>
<td>网站性能优化之CSS无图片技术</td>
<td><a href="http://udc.weibo.com/2013/05/%E7%BD%91%E7%AB%99%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E4%B9%8Bcss%E6%97%A0%E5%9B%BE%E7%89%87%E6%8A%80%E6%9C%AF" target="_blank" rel="external">网站性能优化之CSS无图片技术</a></td>
</tr>
<tr>
<td>web前端性能优化进阶路</td>
<td><a href="http://www.aliued.cn/2013/01/20/web%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96%E8%BF%9B%E9%98%B6%E8%B7%AF.html" target="_blank" rel="external">web前端性能优化进阶路</a></td>
</tr>
<tr>
<td>前端技术：网站性能优化之CSS无图片技术</td>
<td><a href="http://my.eoe.cn/tuwandou/archive/4544.html" target="_blank" rel="external">http://my.eoe.cn/tuwandou/archive/4544.html</a></td>
</tr>
<tr>
<td>浏览器的加载与页面性能优化</td>
<td><a href="http://www.baiduux.com/blog/2011/02/15/browser-loading" target="_blank" rel="external">http://www.baiduux.com/blog/2011/02/15/browser-loading</a></td>
</tr>
<tr>
<td>页面加载中的图片性能优化</td>
<td><a href="http://www.w3ctech.com/p/1503" target="_blank" rel="external">http://www.w3ctech.com/p/1503</a></td>
</tr>
<tr>
<td>Hey——前端性能</td>
<td><a href="http://www.feelcss.com/tag/%E5%89%8D%E7%AB%AF%E6%80%A7%E8%83%BD" target="_blank" rel="external">Hey——前端性能</a></td>
</tr>
<tr>
<td>html优化</td>
<td><a href="http://www.baiduux.com/blog/2010/03/15/html%E4%BC%98%E5%8C%96-2" target="_blank" rel="external">html优化</a></td>
</tr>
<tr>
<td>99css——性能</td>
<td><a href="http://www.99css.com/tag/%e6%80%a7%e8%83%bd" target="_blank" rel="external">99css——性能</a></td>
</tr>
<tr>
<td>YSLOW中文介绍</td>
<td><a href="http://www.cnblogs.com/yslow" target="_blank" rel="external">http://www.cnblogs.com/yslow</a></td>
</tr>
<tr>
<td>转一篇Yahoo关于网站性能优化的文章，兼谈本站要做的优化</td>
<td><a href="http://www.360ito.com/article/40.html" target="_blank" rel="external">http://www.360ito.com/article/40.html</a></td>
</tr>
<tr>
<td>Yahoo!团队实践分享：网站性能</td>
<td><a href="http://www.360doc.com/content/10/0928/09/2588264_56971287.shtml" target="_blank" rel="external">http://www.360doc.com/content/10/0928/09/2588264_56971287.shtml</a></td>
</tr>
<tr>
<td>网站性能优化指南：什么使我们的网站变慢？</td>
<td><a href="http://blog.jiasule.com/i/153" target="_blank" rel="external">http://blog.jiasule.com/i/153</a></td>
</tr>
<tr>
<td>网站性能优化实践，减少加载时间，提高用户体验</td>
<td><a href="http://www.powereasy.net/helpyou/knowledge/ecommerce/9593.html" target="_blank" rel="external">http://www.powereasy.net/helpyou/knowledge/ecommerce/9593.html</a></td>
</tr>
<tr>
<td>浅谈网站性能优化 前端篇</td>
<td><a href="http://www.umtry.com/archives/747.html" target="_blank" rel="external">http://www.umtry.com/archives/747.html</a></td>
</tr>
<tr>
<td>前端重构实践之如何对网站性能优化？</td>
<td><a href="http://www.adinnet.cn/blog/designview/2012-7-12/678.html" target="_blank" rel="external">http://www.adinnet.cn/blog/designview/2012-7-12/678.html</a></td>
</tr>
<tr>
<td>前端性能优化：使用媒体查询加载指定大小的背景图片</td>
<td><a href="http://www.gbin1.com/technology/javascript/20130708-front-end-performance-optimization-9" target="_blank" rel="external">http://www.gbin1.com/technology/javascript/20130708-front-end-performance-optimization-9</a></td>
</tr>
<tr>
<td>网站性能系列博文</td>
<td><a href="http://www.mykuer.com/post/factors-that-affect-the-speed-of-web-site-open.html" target="_blank" rel="external">http://www.mykuer.com/post/factors-that-affect-the-speed-of-web-site-open.html</a></td>
</tr>
<tr>
<td>加载，不只是少一点点</td>
<td><a href="http://tgideas.qq.com/webplat/info/news_version3/804/808/811/m579/201109/41355.shtml" target="_blank" rel="external">http://tgideas.qq.com/webplat/info/news_version3/804/808/811/m579/201109/41355.shtml</a></td>
</tr>
<tr>
<td>前端性能的测试与优化</td>
<td><a href="http://mzhou.me/article/95310" target="_blank" rel="external">http://mzhou.me/article/95310</a></td>
</tr>
<tr>
<td>分享网页加载速度优化的一些技巧？</td>
<td><a href="http://www.gbin1.com/technology/html/20130217-tips-for-speed-up-page-loading" target="_blank" rel="external">http://www.gbin1.com/technology/html/20130217-tips-for-speed-up-page-loading</a></td>
</tr>
<tr>
<td>web前端优化(基于Yslow</td>
<td><a href="http://www.tcreator.info/webSchool/website/Front-end-Opt-Yslow.html" target="_blank" rel="external">http://www.tcreator.info/webSchool/website/Front-end-Opt-Yslow.html</a></td>
</tr>
<tr>
<td>网站性能优化工具大全</td>
<td><a href="https://www.qianduan.net/website-performance-optimization-tool.html" target="_blank" rel="external">https://www.qianduan.net/website-performance-optimization-tool.html</a></td>
</tr>
<tr>
<td>【高性能前端1】高性能HTML</td>
<td><a href="http://www.alloyteam.com/2012/10/high-performance-html" target="_blank" rel="external">http://www.alloyteam.com/2012/10/high-performance-html</a></td>
</tr>
<tr>
<td>【高性能前端2】高性能CSS</td>
<td><a href="http://www.alloyteam.com/2012/10/high-performance-css" target="_blank" rel="external">http://www.alloyteam.com/2012/10/high-performance-css</a></td>
</tr>
<tr>
<td>由12306谈谈网站前端性能和后端性能优化</td>
<td><a href="http://coolshell.cn/articles/6470.html" target="_blank" rel="external">http://coolshell.cn/articles/6470.html</a></td>
</tr>
<tr>
<td>AlloyTeam——前端优化</td>
<td><a href="http://www.alloyteam.com/webfrontend/%E5%89%8D%E7%AB%AF%E4%BC%98%E5%8C%96" target="_blank" rel="external">AlloyTeam——前端优化</a></td>
</tr>
<tr>
<td>毫秒必争，前端网页性能最佳实践</td>
<td><a href="http://www.cnblogs.com/developersupport/p/3248695.html" target="_blank" rel="external">http://www.cnblogs.com/developersupport/p/3248695.html</a></td>
</tr>
<tr>
<td>网站性能工具Yslow的使用方法</td>
<td><a href="http://blog.sina.com.cn/s/blog_6e9d2e0701017kvu.html" target="_blank" rel="external">http://blog.sina.com.cn/s/blog_6e9d2e0701017kvu.html</a></td>
</tr>
<tr>
<td>前端工程与性能优化（上）：静态资源版本更新与缓存</td>
<td><a href="http://www.infoq.com/cn/articles/front-end-engineering-and-performance-optimization-part1" target="_blank" rel="external">http://www.infoq.com/cn/articles/front-end-engineering-and-performance-optimization-part1</a></td>
</tr>
<tr>
<td>前端工程与性能优化（下）：静态资源管理与模板框架</td>
<td><a href="http://www.infoq.com/cn/articles/front-end-engineering-and-performance-optimization-part2" target="_blank" rel="external">http://www.infoq.com/cn/articles/front-end-engineering-and-performance-optimization-part2</a></td>
</tr>
<tr>
<td>HTTPS连接的前几毫秒发生了什么</td>
<td><a href="http://blog.jobbole.com/48369" target="_blank" rel="external">http://blog.jobbole.com/48369</a></td>
</tr>
<tr>
<td>Yslow</td>
<td><a href="http://uicss.cn/yslow/#more-12319" target="_blank" rel="external">http://uicss.cn/yslow/#more-12319</a></td>
</tr>
<tr>
<td>Essential Web Performance Metrics — A Primer, Part 1</td>
<td><a href="http://blog.smartbear.com/web-performance/essential-web-performance-metrics-a-primer-part-1" target="_blank" rel="external">http://blog.smartbear.com/web-performance/essential-web-performance-metrics-a-primer-part-1</a></td>
</tr>
<tr>
<td>Essential Web Performance Metrics — Part 2</td>
<td><a href="http://blog.smartbear.com/performance/essential-web-performance-metrics-part-2" target="_blank" rel="external">http://blog.smartbear.com/performance/essential-web-performance-metrics-part-2</a></td>
</tr>
<tr>
<td>YUISlide,针对移动设备的动画性能优化</td>
<td><a href="http://jayli.github.io/blog/data/2011/12/23/yuislide.html" target="_blank" rel="external">http://jayli.github.io/blog/data/2011/12/23/yuislide.html</a></td>
</tr>
<tr>
<td>Improving Site Performance</td>
<td><a href="http://joelglovier.com/improving-site-performance" target="_blank" rel="external">http://joelglovier.com/improving-site-performance</a></td>
</tr>
<tr>
<td>让网站提速的最佳前端实践</td>
<td><a href="http://segmentfault.com/a/1190000000367899" target="_blank" rel="external">http://segmentfault.com/a/1190000000367899</a></td>
</tr>
<tr>
<td>Why Website Speed is Important</td>
<td><a href="http://sixrevisions.com/web-development/why-website-speed-is-important" target="_blank" rel="external">http://sixrevisions.com/web-development/why-website-speed-is-important</a></td>
</tr>
<tr>
<td>Need for Speed – How to Improve your Website Performance</td>
<td><a href="https://www.devbridge.com/articles/need-for-speed-how-to-improve-your-website-performance" target="_blank" rel="external">https://www.devbridge.com/articles/need-for-speed-how-to-improve-your-website-performance</a></td>
</tr>
<tr>
<td>阿里无线前端性能优化指南 (Pt.1 加载期优化</td>
<td><a href="https://github.com/amfe/article/issues/1" target="_blank" rel="external">https://github.com/amfe/article/issues/1</a></td>
</tr>
</tbody>
</table>
<h2 id="优化工具"><a href="#优化工具" class="headerlink" title="优化工具"></a><strong>优化工具</strong></h2><table>
<thead>
<tr>
<th>优化工具</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>JavaScript 性能分析新工具 OneProfile</td>
<td><a href="http://www.html-js.com/article/3083" target="_blank" rel="external">http://www.html-js.com/article/3083</a></td>
</tr>
<tr>
<td>JavaScript 堆内存分析新工具 OneHeap</td>
<td><a href="http://www.html-js.com/article/3091" target="_blank" rel="external">http://www.html-js.com/article/3091</a></td>
</tr>
</tbody>
</table>
<h2 id="在线工具"><a href="#在线工具" class="headerlink" title="在线工具"></a><strong>在线工具</strong></h2><table>
<thead>
<tr>
<th>在线工具</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>google在线工具</td>
<td><a href="https://developers.google.com/speed/pagespeed/insights" target="_blank" rel="external">https://developers.google.com/speed/pagespeed/insights</a></td>
</tr>
<tr>
<td>阿里-免费测试服务</td>
<td><a href="http://itest.aliyun.com" target="_blank" rel="external">http://itest.aliyun.com</a></td>
</tr>
<tr>
<td>阿里-F2etest多浏览器兼容性测试解决方案</td>
<td><a href="https://github.com/alibaba/f2etest" target="_blank" rel="external">https://github.com/alibaba/f2etest</a></td>
</tr>
<tr>
<td>js性能测试</td>
<td><a href="http://jsperf.com" target="_blank" rel="external">http://jsperf.com</a></td>
</tr>
</tbody>
</table>
<h2 id="前端架构"><a href="#前端架构" class="headerlink" title="前端架构"></a><strong>前端架构</strong></h2><table>
<thead>
<tr>
<th>前端架构</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>技术架构</td>
<td><a href="http://www.zhihu.com/topic/19612641" target="_blank" rel="external">http://www.zhihu.com/topic/19612641</a></td>
</tr>
<tr>
<td>前端架构</td>
<td><a href="http://saito.im/note/The-Architecture-of-F2E" target="_blank" rel="external">http://saito.im/note/The-Architecture-of-F2E</a></td>
</tr>
<tr>
<td>如何成为前端架构师</td>
<td><a href="http://www.zhihu.com/question/24092572" target="_blank" rel="external">http://www.zhihu.com/question/24092572</a></td>
</tr>
<tr>
<td>关于前端架构-张克军</td>
<td><a href="http://hikejun.com/sharing/2010webrebuild/?file=fe-infrastructure.html" target="_blank" rel="external">http://hikejun.com/sharing/2010webrebuild/?file=fe-infrastructure.html</a></td>
</tr>
<tr>
<td>百度腾讯offer比较（腾讯游戏VS百度基础架构）</td>
<td><a href="http://www.zhihu.com/question/25583350" target="_blank" rel="external">http://www.zhihu.com/question/25583350</a></td>
</tr>
</tbody>
</table>
<h2 id="推荐作品"><a href="#推荐作品" class="headerlink" title="推荐作品"></a><strong>推荐作品</strong></h2><table>
<thead>
<tr>
<th>推荐作品</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>winter代码片段需要翻墙</td>
<td><a href="https://gist.github.com/wintercn" target="_blank" rel="external">https://gist.github.com/wintercn</a></td>
</tr>
<tr>
<td>fgm</td>
<td><a href="http://www.fgm.cc/learn" target="_blank" rel="external">http://www.fgm.cc/learn</a></td>
</tr>
<tr>
<td>岑安作品集</td>
<td><a href="https://github.com/hongru/hongru.github.com" target="_blank" rel="external">https://github.com/hongru/hongru.github.com</a></td>
</tr>
<tr>
<td>当耐特demo集合</td>
<td><a href="http://kmdjs.github.io" target="_blank" rel="external">http://kmdjs.github.io</a></td>
</tr>
<tr>
<td>米空格 js作品</td>
<td><a href="http://www.laoshu133.com/Lab" target="_blank" rel="external">http://www.laoshu133.com/Lab</a></td>
</tr>
<tr>
<td>myFocus</td>
<td><a href="http://koen301.github.io" target="_blank" rel="external">http://koen301.github.io</a></td>
</tr>
<tr>
<td>SeaJS组件库</td>
<td><a href="http://panxuepeng.github.io/seajslib" target="_blank" rel="external">http://panxuepeng.github.io/seajslib</a></td>
</tr>
<tr>
<td>颜海镜作品</td>
<td><a href="http://yanhaijing.com/myProject" target="_blank" rel="external">http://yanhaijing.com/myProject</a></td>
</tr>
<tr>
<td>脚儿网作品</td>
<td><a href="http://jo2.org/category/myworks" target="_blank" rel="external">http://jo2.org/category/myworks</a></td>
</tr>
<tr>
<td>javascript个人作品</td>
<td><a href="http://www.cnitblog.com/yemoo/category/3107.html" target="_blank" rel="external">http://www.cnitblog.com/yemoo/category/3107.html</a></td>
</tr>
<tr>
<td>妙味的雷东升游戏作品</td>
<td><a href="http://bbs.miaov.com/forum.php?mod=viewthread&amp;tid=7790" target="_blank" rel="external">http://bbs.miaov.com/forum.php?mod=viewthread&amp;tid=7790</a></td>
</tr>
<tr>
<td>javascript作品集</td>
<td><a href="http://bbs.csdn.net/topics/380227212" target="_blank" rel="external">http://bbs.csdn.net/topics/380227212</a></td>
</tr>
<tr>
<td>云五笔，灰度产生生成工具</td>
<td><a href="https://github.com/TooBug/works" target="_blank" rel="external">https://github.com/TooBug/works</a></td>
</tr>
<tr>
<td>项目主页</td>
<td><a href="http://koen301.github.io" target="_blank" rel="external">http://koen301.github.io</a></td>
</tr>
<tr>
<td>个性的作品主页</td>
<td><a href="http://zaole.net" target="_blank" rel="external">http://zaole.net</a></td>
</tr>
<tr>
<td>ucren js demos 集</td>
<td><a href="http://ucren.com/blog/demos" target="_blank" rel="external">http://ucren.com/blog/demos</a></td>
</tr>
<tr>
<td>智能社</td>
<td><a href="http://www.zhinengshe.com/works_list.html" target="_blank" rel="external">http://www.zhinengshe.com/works_list.html</a></td>
</tr>
<tr>
<td>实例陈列架</td>
<td><a href="http://demos.shizuwu.cn" target="_blank" rel="external">http://demos.shizuwu.cn</a></td>
</tr>
<tr>
<td>zoye demo</td>
<td><a href="http://zoye.sinaapp.com/demo" target="_blank" rel="external">http://zoye.sinaapp.com/demo</a></td>
</tr>
<tr>
<td>王员外</td>
<td><a href="http://lab.yuanwai.wang" target="_blank" rel="external">http://lab.yuanwai.wang</a></td>
</tr>
<tr>
<td>平凡</td>
<td><a href="http://pingfan1990.sinaapp.com" target="_blank" rel="external">http://pingfan1990.sinaapp.com</a></td>
</tr>
<tr>
<td>jyg 游戏案例</td>
<td><a href="http://www.lovewebgames.com" target="_blank" rel="external">http://www.lovewebgames.com</a></td>
</tr>
<tr>
<td>很多jquery插件</td>
<td><a href="http://www.helloweba.com/list.html" target="_blank" rel="external">http://www.helloweba.com/list.html</a></td>
</tr>
<tr>
<td>不羁虫 - soJs 作品系列</td>
<td><a href="http://www.bujichong.com/sojs/api/index.html" target="_blank" rel="external">http://www.bujichong.com/sojs/api/index.html</a></td>
</tr>
<tr>
<td>frozenui</td>
<td><a href="http://frozenui.github.io/case.html" target="_blank" rel="external">http://frozenui.github.io/case.html</a></td>
</tr>
<tr>
<td>黑白棋</td>
<td><a href="http://js-game.github.io/othello" target="_blank" rel="external">http://js-game.github.io/othello</a></td>
</tr>
<tr>
<td>fromone</td>
<td><a href="http://yansm.github.io/fromone/index.html" target="_blank" rel="external">http://yansm.github.io/fromone/index.html</a></td>
</tr>
<tr>
<td>pazguille</td>
<td><a href="http://pazguille.me" target="_blank" rel="external">http://pazguille.me</a></td>
</tr>
<tr>
<td><strong>Html5 VideoPlayer</strong></td>
<td><a href="https://github.com/zmmbreeze/DeadSimpleVideoPlayer" target="_blank" rel="external">https://github.com/zmmbreeze/DeadSimpleVideoPlayer</a></td>
</tr>
<tr>
<td><strong>Proton 烟花</strong></td>
<td><a href="http://a-jie.github.io/Proton/#example" target="_blank" rel="external">http://a-jie.github.io/Proton/#example</a></td>
</tr>
</tbody>
</table>
<h2 id="简历模板"><a href="#简历模板" class="headerlink" title="简历模板"></a><strong>简历模板</strong></h2><table>
<thead>
<tr>
<th>简历模板</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>简历</td>
<td><a href="http://hcy2367.github.io/resume" target="_blank" rel="external">http://hcy2367.github.io/resume</a></td>
</tr>
<tr>
<td>张伦</td>
<td><a href="http://ncuey.sinaapp.com/CrispElite/" target="_blank" rel="external">http://ncuey.sinaapp.com/CrispElite/</a></td>
</tr>
<tr>
<td>简历</td>
<td><a href="https://github.com/hacke2/ResumeSample" target="_blank" rel="external">https://github.com/hacke2/ResumeSample</a></td>
</tr>
<tr>
<td>马斯特</td>
<td><a href="http://pinkyjie.com/resume" target="_blank" rel="external">http://pinkyjie.com/resume</a></td>
</tr>
<tr>
<td>张秋怡</td>
<td><a href="https://joyeecheung.github.io/resume/" target="_blank" rel="external">https://joyeecheung.github.io/resume/</a></td>
</tr>
<tr>
<td>翁天信</td>
<td><a href="http://blog.dandyweng.com/2013/07/how-my-website-was-created" target="_blank" rel="external">http://blog.dandyweng.com/2013/07/how-my-website-was-created</a></td>
</tr>
<tr>
<td>动画方式的简历</td>
<td><a href="http://www.webhek.com/misc/interactive-resume" target="_blank" rel="external">http://www.webhek.com/misc/interactive-resume</a></td>
</tr>
<tr>
<td>组件丰富简历</td>
<td><a href="http://www.linqing07.com/resume.html" target="_blank" rel="external">http://www.linqing07.com/resume.html</a></td>
</tr>
<tr>
<td>haorooms博客</td>
<td><a href="http://www.haorooms.com/about" target="_blank" rel="external">http://www.haorooms.com/about</a></td>
</tr>
</tbody>
</table>
<h2 id="面试题"><a href="#面试题" class="headerlink" title="面试题"></a><strong>面试题</strong></h2><table>
<thead>
<tr>
<th>面试题</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>那几个月在找工作（百度，网易游戏）</td>
<td><a href="http://www.nowcoder.com/discuss/3196" target="_blank" rel="external">http://www.nowcoder.com/discuss/3196</a></td>
</tr>
<tr>
<td>2014最新面试题</td>
<td><a href="http://www.html-js.com/article/1743" target="_blank" rel="external">http://www.html-js.com/article/1743</a></td>
</tr>
<tr>
<td>2016校招内推 – 阿里巴巴前端 – 三面面试经历</td>
<td><a href="http://www.cnblogs.com/imwtr/p/4685546.html" target="_blank" rel="external">http://www.cnblogs.com/imwtr/p/4685546.html</a></td>
</tr>
<tr>
<td>年后跳槽那点事：乐视+金山+360面试之行</td>
<td><a href="http://www.cnblogs.com/lvdabao/p/3660707.html" target="_blank" rel="external">http://www.cnblogs.com/lvdabao/p/3660707.html</a></td>
</tr>
<tr>
<td>Interviewing a front-end developer</td>
<td><a href="http://blog.sourcing.io/interview-questions" target="_blank" rel="external">http://blog.sourcing.io/interview-questions</a></td>
</tr>
<tr>
<td>拉勾网js面试题</td>
<td><a href="http://www.cnblogs.com/52cik/p/js-question-lg.html" target="_blank" rel="external">http://www.cnblogs.com/52cik/p/js-question-lg.html</a></td>
</tr>
<tr>
<td>前端面试</td>
<td><a href="http://www.cnblogs.com/allenxing/p/3724382.html" target="_blank" rel="external">http://www.cnblogs.com/allenxing/p/3724382.html</a></td>
</tr>
<tr>
<td>Web开发笔试面试题 大全</td>
<td><a href="http://mianshiti.diandian.com" target="_blank" rel="external">http://mianshiti.diandian.com</a></td>
</tr>
<tr>
<td>前端开发面试题</td>
<td><a href="http://segmentfault.com/a/1190000000465431" target="_blank" rel="external">http://segmentfault.com/a/1190000000465431</a></td>
</tr>
<tr>
<td>2014最新前端面试题</td>
<td><a href="https://github.com/markyun/My-blog/tree/master/Front-end-Developer-Questions" target="_blank" rel="external">https://github.com/markyun/My-blog/tree/master/Front-end-Developer-Questions</a></td>
</tr>
<tr>
<td>百度面试</td>
<td><a href="https://github.com/fex-team/interview-questions" target="_blank" rel="external">https://github.com/fex-team/interview-questions</a></td>
</tr>
<tr>
<td>前端工作面试问题</td>
<td><a href="https://github.com/darcyclarke/Front-end-Developer-Interview-Questions/tree/master/Chinese" target="_blank" rel="external">https://github.com/darcyclarke/Front-end-Developer-Interview-Questions/tree/master/Chinese</a></td>
</tr>
<tr>
<td>前端开发面试题</td>
<td><a href="http://segmentfault.com/a/1190000000465431" target="_blank" rel="external">http://segmentfault.com/a/1190000000465431</a></td>
</tr>
<tr>
<td>5个经典的前端面试问题</td>
<td><a href="http://ourjs.com/detail/5%E4%B8%AA%E7%BB%8F%E5%85%B8%E7%9A%84%E5%89%8D%E7%AB%AF%E9%9D%A2%E8%AF%95%E9%97%AE%E9%A2%98" target="_blank" rel="external">5个经典的前端面试问题</a></td>
</tr>
<tr>
<td>最全前端面试问题及答案总结</td>
<td><a href="http://segmentfault.com/a/1190000002562454" target="_blank" rel="external">http://segmentfault.com/a/1190000002562454</a></td>
</tr>
<tr>
<td>如何面试一名前端开发工程师？</td>
<td><a href="http://www.html-js.com/article/Large-search-front-team-column%202961" target="_blank" rel="external">http://www.html-js.com/article/Large-search-front-team-column%202961</a></td>
</tr>
<tr>
<td>史上最全 前端开发面试问题及答案整理</td>
<td><a href="https://github.com/hawx1993/Front-end-Interview-questions" target="_blank" rel="external">https://github.com/hawx1993/Front-end-Interview-questions</a></td>
</tr>
<tr>
<td>前端实习生面试总结</td>
<td><a href="http://www.cnblogs.com/xiaoruo/p/4665163.html" target="_blank" rel="external">http://www.cnblogs.com/xiaoruo/p/4665163.html</a></td>
</tr>
<tr>
<td>史上最全 前端开发面试问题及答案整理</td>
<td><a href="https://github.com/hawx1993/Front-end-Interview-questions" target="_blank" rel="external">https://github.com/hawx1993/Front-end-Interview-questions</a></td>
</tr>
<tr>
<td>BAT及各大互联网公司2014前端笔试面试题：JavaScript篇</td>
<td><a href="http://blog.jobbole.com/78738" target="_blank" rel="external">http://blog.jobbole.com/78738</a></td>
</tr>
<tr>
<td>前端开发面试题大收集</td>
<td><a href="https://github.com/paddingme/Front-end-Web-Development-Interview-Question" target="_blank" rel="external">https://github.com/paddingme/Front-end-Web-Development-Interview-Question</a></td>
</tr>
<tr>
<td>收集的前端面试题和答案</td>
<td><a href="https://github.com/qiu-deqing/FE-interview" target="_blank" rel="external">https://github.com/qiu-deqing/FE-interview</a></td>
</tr>
<tr>
<td>如何面试前端工程师</td>
<td><a href="http://www.zhihu.com/question/19568008" target="_blank" rel="external">http://www.zhihu.com/question/19568008</a></td>
</tr>
<tr>
<td>前端开发面试题</td>
<td><a href="https://github.com/markyun/My-blog/blob/master/Front-end-Developer-Questions/Questions-and-Answers/README.md" target="_blank" rel="external">https://github.com/markyun/My-blog/blob/master/Front-end-Developer-Questions/Questions-and-Answers/README.md</a></td>
</tr>
<tr>
<td>牛客网-笔试面经</td>
<td><a href="http://www.nowcoder.com/discuss?type=2" target="_blank" rel="external">http://www.nowcoder.com/discuss?type=2</a></td>
</tr>
</tbody>
</table>
<h2 id="iconfont"><a href="#iconfont" class="headerlink" title="iconfont"></a><strong>iconfont</strong></h2><table>
<thead>
<tr>
<th>iconfont</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>中文字体</td>
<td><a href="http://www.zhihu.com/question/21253343" target="_blank" rel="external">http://www.zhihu.com/question/21253343</a></td>
</tr>
<tr>
<td>淘宝字库</td>
<td><a href="http://iconfont.cn" target="_blank" rel="external">http://iconfont.cn</a></td>
</tr>
<tr>
<td>字体</td>
<td><a href="http://mux.alimama.com/fonts" target="_blank" rel="external">http://mux.alimama.com/fonts</a></td>
</tr>
<tr>
<td>制作教程</td>
<td><a href="http://iconfont.cn/help/platform.html" target="_blank" rel="external">http://iconfont.cn/help/platform.html</a></td>
</tr>
<tr>
<td>zhangxinxu-icommon</td>
<td><a href="http://www.zhangxinxu.com/wordpress/?s=icomoon" target="_blank" rel="external">http://www.zhangxinxu.com/wordpress/?s=icomoon</a></td>
</tr>
<tr>
<td>icommon</td>
<td><a href="https://icomoon.io/app" target="_blank" rel="external">https://icomoon.io/app</a></td>
</tr>
<tr>
<td>用字体在网页中画ICON图标(推荐教程</td>
<td><a href="http://imooc.com/learn/243" target="_blank" rel="external">http://imooc.com/learn/243</a></td>
</tr>
<tr>
<td>字体压缩工具</td>
<td><a href="http://font-spider.org" target="_blank" rel="external">http://font-spider.org</a></td>
</tr>
</tbody>
</table>
<h2 id="Fiddler"><a href="#Fiddler" class="headerlink" title="Fiddler"></a><strong>Fiddler</strong></h2><table>
<thead>
<tr>
<th>Fiddler</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Fiddler调式使用知多少(一深入研究</td>
<td><a href="http://www.cnblogs.com/tugenhua0707/p/4623317.html" target="_blank" rel="external">http://www.cnblogs.com/tugenhua0707/p/4623317.html</a></td>
</tr>
<tr>
<td>微信fiddle</td>
<td><a href="http://www.cnblogs.com/strick/p/4570006.html" target="_blank" rel="external">http://www.cnblogs.com/strick/p/4570006.html</a></td>
</tr>
<tr>
<td>微信fiddle</td>
<td><a href="http://gaoboy.com/article/26.html" target="_blank" rel="external">http://gaoboy.com/article/26.html</a></td>
</tr>
</tbody>
</table>
<h2 id="Chrome"><a href="#Chrome" class="headerlink" title="Chrome"></a><strong>Chrome</strong></h2><table>
<thead>
<tr>
<th>Chrome</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Google Chrome 官方</td>
<td><a href="https://developer.chrome.com/devtools" target="_blank" rel="external">https://developer.chrome.com/devtools</a></td>
</tr>
<tr>
<td>Chrome - 基础</td>
<td><a href="http://www.cnblogs.com/constantince/p/4565261.html" target="_blank" rel="external">http://www.cnblogs.com/constantince/p/4565261.html</a></td>
</tr>
<tr>
<td>Chrome - 进阶</td>
<td><a href="http://www.cnblogs.com/constantince/p/4579121.html" target="_blank" rel="external">http://www.cnblogs.com/constantince/p/4579121.html</a></td>
</tr>
<tr>
<td>Chrome - 性能</td>
<td><a href="http://www.cnblogs.com/constantince/p/4585983.html" target="_blank" rel="external">http://www.cnblogs.com/constantince/p/4585983.html</a></td>
</tr>
<tr>
<td>Chrome - 性能进阶</td>
<td><a href="http://www.cnblogs.com/constantince/p/4607497.html" target="_blank" rel="external">http://www.cnblogs.com/constantince/p/4607497.html</a></td>
</tr>
<tr>
<td>Chrome - 移动</td>
<td><a href="http://www.cnblogs.com/constantince/p/4624241.html" target="_blank" rel="external">http://www.cnblogs.com/constantince/p/4624241.html</a></td>
</tr>
<tr>
<td>Chrome - 使用技巧</td>
<td><a href="http://www.cnblogs.com/liyunhua/p/4544738.html" target="_blank" rel="external">http://www.cnblogs.com/liyunhua/p/4544738.html</a></td>
</tr>
<tr>
<td>Chrome - Console控制台不完全指南</td>
<td><a href="http://www.cnblogs.com/Wayou/p/chrome-console-tips-and-tricks.html" target="_blank" rel="external">http://www.cnblogs.com/Wayou/p/chrome-console-tips-and-tricks.html</a></td>
</tr>
<tr>
<td>Chrome - Workspace使浏览器变成IDE</td>
<td><a href="http://c7sky.com/chrome-devtools-workspace.html" target="_blank" rel="external">http://c7sky.com/chrome-devtools-workspace.html</a></td>
</tr>
<tr>
<td>network面板</td>
<td><a href="http://www.html-js.com/article/Nothing-blind%202975" target="_blank" rel="external">http://www.html-js.com/article/Nothing-blind%202975</a></td>
</tr>
<tr>
<td>chrome开发工具快捷键</td>
<td><a href="http://anti-code.com/devtools-cheatsheet" target="_blank" rel="external">http://anti-code.com/devtools-cheatsheet</a></td>
</tr>
<tr>
<td>chrome调试工具常用功能整理</td>
<td><a href="http://www.html-js.com/article/2327" target="_blank" rel="external">http://www.html-js.com/article/2327</a></td>
</tr>
<tr>
<td>Chrome 开发工具 Workspace 使用</td>
<td><a href="http://www.iinterest.net/2014/05/09/chrome-dev-tool-workspace" target="_blank" rel="external">http://www.iinterest.net/2014/05/09/chrome-dev-tool-workspace</a></td>
</tr>
<tr>
<td>Chrome神器Vimium快捷键学习记录</td>
<td><a href="http://www.cppblog.com/deercoder/archive/2011/10/22/158886.html" target="_blank" rel="external">http://www.cppblog.com/deercoder/archive/2011/10/22/158886.html</a></td>
</tr>
<tr>
<td>sass调试-w3cplus</td>
<td><a href="http://www.w3cplus.com/sassguide/debug.html" target="_blank" rel="external">http://www.w3cplus.com/sassguide/debug.html</a></td>
</tr>
<tr>
<td>如何更专业的使用Chrome开发者工具-w3cplus</td>
<td><a href="http://www.w3cplus.com/tools/how-to-use-chrome-devtools-like-a-pro.html" target="_blank" rel="external">http://www.w3cplus.com/tools/how-to-use-chrome-devtools-like-a-pro.html</a></td>
</tr>
<tr>
<td>chrome调试canvas</td>
<td><a href="http://sentsin.com/web/253.html" target="_blank" rel="external">http://sentsin.com/web/253.html</a></td>
</tr>
<tr>
<td>chrome profiles1</td>
<td><a href="https://developer.chrome.com/devtools/index" target="_blank" rel="external">https://developer.chrome.com/devtools/index</a></td>
</tr>
<tr>
<td>chrome profiles3</td>
<td><a href="http://www.oschina.net/translate/performance-optimisation-with-timeline-profiles" target="_blank" rel="external">http://www.oschina.net/translate/performance-optimisation-with-timeline-profiles</a></td>
</tr>
<tr>
<td>chrome移动版调试</td>
<td><a href="https://developer.chrome.com/devtools/docs/mobile-emulation" target="_blank" rel="external">https://developer.chrome.com/devtools/docs/mobile-emulation</a></td>
</tr>
<tr>
<td>chrome调试</td>
<td><a href="http://ued.taobao.org/blog/2012/06/debug-with-chrome-dev-tool" target="_blank" rel="external">http://ued.taobao.org/blog/2012/06/debug-with-chrome-dev-tool</a></td>
</tr>
<tr>
<td>chrome的调试</td>
<td><a href="http://www.cnblogs.com/QLeelulu/archive/2011/08/28/2156402.html" target="_blank" rel="external">http://www.cnblogs.com/QLeelulu/archive/2011/08/28/2156402.html</a></td>
</tr>
<tr>
<td>chrome console 命令详解</td>
<td><a href="https://developer.chrome.com/devtools/docs/commandline-api" target="_blank" rel="external">https://developer.chrome.com/devtools/docs/commandline-api</a></td>
</tr>
<tr>
<td>查看事件绑定1</td>
<td><a href="http://www.cnblogs.com/leonkao/p/3809655.html" target="_blank" rel="external">http://www.cnblogs.com/leonkao/p/3809655.html</a></td>
</tr>
<tr>
<td>查看事件绑定2</td>
<td><a href="http://www.cnblogs.com/xiaoyao2011/p/3447421.html" target="_blank" rel="external">http://www.cnblogs.com/xiaoyao2011/p/3447421.html</a></td>
</tr>
<tr>
<td>神器——Chrome开发者工具(一</td>
<td><a href="http://segmentfault.com/a/1190000000683599" target="_blank" rel="external">http://segmentfault.com/a/1190000000683599</a></td>
</tr>
<tr>
<td>奇趣百科性能优化(Chrome DevTools 中的 Timeline Profils 等工具使用介绍</td>
<td><a href="https://xinranliu.me/2015-05-22-qiqu-performance" target="_blank" rel="external">https://xinranliu.me/2015-05-22-qiqu-performance</a></td>
</tr>
<tr>
<td>chrome 开发者工具的 15 个小技巧</td>
<td><a href="http://frontenddev.org/link/15-tips-of-chrome-developer-tools.html" target="_blank" rel="external">http://frontenddev.org/link/15-tips-of-chrome-developer-tools.html</a></td>
</tr>
<tr>
<td>Chrome开发者工具不完全指南</td>
<td><a href="http://1ke.co/course/361" target="_blank" rel="external">http://1ke.co/course/361</a></td>
</tr>
<tr>
<td>Chrome 开发者工具使用技巧</td>
<td><a href="http://segmentfault.com/a/1190000003882567" target="_blank" rel="external">http://segmentfault.com/a/1190000003882567</a></td>
</tr>
</tbody>
</table>
<h2 id="Firebug"><a href="#Firebug" class="headerlink" title="Firebug"></a><strong>Firebug</strong></h2><table>
<thead>
<tr>
<th>Firebug</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>firebug视频教程</td>
<td><a href="http://www.imooc.com/learn/137" target="_blank" rel="external">http://www.imooc.com/learn/137</a></td>
</tr>
<tr>
<td>firefox 模拟器</td>
<td><a href="https://developer.mozilla.org/zh-CN/docs/Tools/WebIDE" target="_blank" rel="external">https://developer.mozilla.org/zh-CN/docs/Tools/WebIDE</a></td>
</tr>
<tr>
<td>console.log 命令详解</td>
<td><a href="http://www.cnblogs.com/ctriphire/p/4116207.html" target="_blank" rel="external">http://www.cnblogs.com/ctriphire/p/4116207.html</a></td>
</tr>
<tr>
<td>Firebug入门指南</td>
<td><a href="http://www.ruanyifeng.com/blog/2008/06/firebug_tutorial.html" target="_blank" rel="external">http://www.ruanyifeng.com/blog/2008/06/firebug_tutorial.html</a></td>
</tr>
<tr>
<td>Firebug控制台详解</td>
<td><a href="http://www.ruanyifeng.com/blog/2011/03/firebug_console_tutorial.html" target="_blank" rel="external">http://www.ruanyifeng.com/blog/2011/03/firebug_console_tutorial.html</a></td>
</tr>
</tbody>
</table>
<h2 id="移动-微信调试"><a href="#移动-微信调试" class="headerlink" title="移动,微信调试"></a><strong>移动,微信调试</strong></h2><table>
<thead>
<tr>
<th>移动,微信调试</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>浏览器端调试安卓</td>
<td><a href="https://openstf.github.io" target="_blank" rel="external">https://openstf.github.io</a></td>
</tr>
<tr>
<td>移动端前端开发调试</td>
<td><a href="http://yujiangshui.com/multidevice-frontend-debug" target="_blank" rel="external">http://yujiangshui.com/multidevice-frontend-debug</a></td>
</tr>
<tr>
<td>使用 Chrome 远程调试 Android 设备</td>
<td><a href="https://github.com/yujiangshui/CN-Chrome-DevTools/blob/remote-debugging/md/Use-Tools/remote-debugging.md" target="_blank" rel="external">https://github.com/yujiangshui/CN-Chrome-DevTools/blob/remote-debugging/md/Use-Tools/remote-debugging.md</a></td>
</tr>
<tr>
<td>mac移动端调试</td>
<td><a href="http://plus.uc.cn/document/webapp/doc5.html" target="_blank" rel="external">http://plus.uc.cn/document/webapp/doc5.html</a></td>
</tr>
<tr>
<td>mac移动端调试</td>
<td><a href="http://www.mihtool.com" target="_blank" rel="external">http://www.mihtool.com</a></td>
</tr>
<tr>
<td>无线调试攻略</td>
<td><a href="http://thx.github.io/mobile/debugging-in-mobile" target="_blank" rel="external">http://thx.github.io/mobile/debugging-in-mobile</a></td>
</tr>
<tr>
<td>无线调试攻略</td>
<td><a href="http://yanhaijing.com/mobile/2014/12/17/web-debug-for-mobile" target="_blank" rel="external">http://yanhaijing.com/mobile/2014/12/17/web-debug-for-mobile</a></td>
</tr>
<tr>
<td>屌爆了,完美调试 微信webview(x5</td>
<td><a href="http://www.jianshu.com/p/ccf124f1f74b" target="_blank" rel="external">http://www.jianshu.com/p/ccf124f1f74b</a></td>
</tr>
<tr>
<td>微信调试的那些事</td>
<td><a href="http://liyaodong.com/2015/07/06/%E5%BE%AE%E4%BF%A1%E8%B0%83%E8%AF%95%E7%9A%84%E9%82%A3%E4%BA%9B%E4%BA%8B" target="_blank" rel="external">微信调试的那些事</a></td>
</tr>
<tr>
<td>远程console</td>
<td><a href="http://jsconsole.com" target="_blank" rel="external">http://jsconsole.com</a></td>
</tr>
<tr>
<td>微信调试工具</td>
<td><a href="http://blog.qqbrowser.cc" target="_blank" rel="external">http://blog.qqbrowser.cc</a></td>
</tr>
<tr>
<td>各种真机远程调试方法汇总</td>
<td><a href="https://github.com/jieyou/remote_inspect_web_on_real_device" target="_blank" rel="external">https://github.com/jieyou/remote_inspect_web_on_real_device</a></td>
</tr>
</tbody>
</table>
<h2 id="iOS-Simulator"><a href="#iOS-Simulator" class="headerlink" title="iOS Simulator"></a><strong>iOS Simulator</strong></h2><table>
<thead>
<tr>
<th>iOS Simulator</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Simulator</td>
<td><a href="https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/iOS_Simulator_Guide/Introduction/Introduction.html" target="_blank" rel="external">iOS_Simulator_Guide-Introduction</a></td>
</tr>
<tr>
<td>iOS Simulator的介绍和使用心得</td>
<td><a href="http://www.crifan.com/intro_ios_simulator_in_xcode_and_usage_summary" target="_blank" rel="external">http://www.crifan.com/intro_ios_simulator_in_xcode_and_usage_summary</a></td>
</tr>
</tbody>
</table>
<h2 id="Image"><a href="#Image" class="headerlink" title="Image"></a><strong>Image</strong></h2><table>
<thead>
<tr>
<th>img</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>loading img</td>
<td><a href="http://preloaders.net/en/circular" target="_blank" rel="external">http://preloaders.net/en/circular</a></td>
</tr>
<tr>
<td>智图-图片优化平台</td>
<td><a href="http://zhitu.isux.us" target="_blank" rel="external">http://zhitu.isux.us</a></td>
</tr>
<tr>
<td>在线png优化</td>
<td><a href="https://tinypng.com" target="_blank" rel="external">https://tinypng.com</a></td>
</tr>
<tr>
<td>SM.MS(图床工具～简易好用)</td>
<td><a href="https://sm.ms/" target="_blank" rel="external">https://sm.ms/</a></td>
</tr>
<tr>
<td>yutuku：极简图床</td>
<td><a href="http://yotuku.cn/" target="_blank" rel="external">http://yotuku.cn/</a></td>
</tr>
<tr>
<td>Qchan图床</td>
<td><a href="http://tuchuang.org/" target="_blank" rel="external">http://tuchuang.org/</a></td>
</tr>
</tbody>
</table>
<h2 id="浏览器同步"><a href="#浏览器同步" class="headerlink" title="浏览器同步"></a><strong>浏览器同步</strong></h2><table>
<thead>
<tr>
<th>浏览器同步</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>puer</td>
<td><a href="https://github.com/leeluolee/puer" target="_blank" rel="external">https://github.com/leeluolee/puer</a></td>
</tr>
<tr>
<td>liveReload</td>
<td><a href="http://livereload.com" target="_blank" rel="external">http://livereload.com</a></td>
</tr>
<tr>
<td>f5</td>
<td><a href="http://getf5.com" target="_blank" rel="external">http://getf5.com</a></td>
</tr>
<tr>
<td>File Watchers</td>
<td><a href="http://geek100.com/2608" target="_blank" rel="external">http://geek100.com/2608</a></td>
</tr>
</tbody>
</table>
<h2 id="在线PPT制作"><a href="#在线PPT制作" class="headerlink" title="在线PPT制作"></a><strong>在线PPT制作</strong></h2><table>
<thead>
<tr>
<th>在线PPT制作</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>nodePPT</td>
<td><a href="http://js8.in/2013/11/16/%E6%8E%A8%E8%8D%90nodeppt%EF%BC%9A%E4%BD%BF%E7%94%A8markdown%E8%AF%AD%E6%B3%95%E6%9D%A5%E5%86%99%E7%BD%91%E9%A1%B5ppt" target="_blank" rel="external">nodePPT</a></td>
</tr>
<tr>
<td><strong>Cleaver快速制作网页PPT</strong></td>
<td><a href="http://www.jeffjade.com/2015/10/15/2015-10-16-cleaver-make-ppt/" target="_blank" rel="external">http://www.jeffjade.com/2015/10/15/2015-10-16-cleaver-make-ppt/</a></td>
</tr>
<tr>
<td><strong>impress.js</strong></td>
<td><a href="http://www.cnblogs.com/Darren_code/archive/2013/01/04/impressjs.html" target="_blank" rel="external">http://www.cnblogs.com/Darren_code/archive/2013/01/04/impressjs.html</a></td>
</tr>
<tr>
<td>PPT</td>
<td><a href="https://github.com/ksky521/nodePPT" target="_blank" rel="external">https://github.com/ksky521/nodePPT</a></td>
</tr>
<tr>
<td><strong>reveal</strong></td>
<td><a href="https://github.com/hakimel/reveal.js" target="_blank" rel="external">https://github.com/hakimel/reveal.js</a></td>
</tr>
<tr>
<td>bespoke-fx</td>
<td><a href="https://github.com/ebow/bespoke-fx" target="_blank" rel="external">https://github.com/ebow/bespoke-fx</a></td>
</tr>
<tr>
<td>slippy</td>
<td><a href="https://github.com/Seldaek/slippy" target="_blank" rel="external">https://github.com/Seldaek/slippy</a></td>
</tr>
</tbody>
</table>
<h2 id="前端导航网站"><a href="#前端导航网站" class="headerlink" title="前端导航网站"></a><strong>前端导航网站</strong></h2><table>
<thead>
<tr>
<th>前端导航网站</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>界面清爽的前端导航</td>
<td><a href="http://uxbees.com/index.html" target="_blank" rel="external">http://uxbees.com/index.html</a></td>
</tr>
<tr>
<td>前端导航</td>
<td><a href="http://whycss.com" target="_blank" rel="external">http://whycss.com</a></td>
</tr>
<tr>
<td>前端网址导航</td>
<td><a href="http://www.daqianduan.com/nav" target="_blank" rel="external">http://www.daqianduan.com/nav</a></td>
</tr>
<tr>
<td>前端名录</td>
<td><a href="http://sentsin.com/daohang" target="_blank" rel="external">http://sentsin.com/daohang</a></td>
</tr>
<tr>
<td>前端导航</td>
<td><a href="http://123.jser.us" target="_blank" rel="external">http://123.jser.us</a></td>
</tr>
<tr>
<td>前端开发资源</td>
<td><a href="http://www.css88.com/nav" target="_blank" rel="external">http://www.css88.com/nav</a></td>
</tr>
<tr>
<td>前端开发仓库 - 众多效果的收集地</td>
<td><a href="http://code.ciaoca.com" target="_blank" rel="external">http://code.ciaoca.com</a></td>
</tr>
<tr>
<td>前端资源导航</td>
<td><a href="https://github.com/jnoodle/f2e-collect" target="_blank" rel="external">https://github.com/jnoodle/f2e-collect</a></td>
</tr>
<tr>
<td>F2E 前端导航</td>
<td><a href="http://f2e.im/static/pages/nav/index.html" target="_blank" rel="external">http://f2e.im/static/pages/nav/index.html</a></td>
</tr>
</tbody>
</table>
<h2 id="常用CDN"><a href="#常用CDN" class="headerlink" title="常用CDN"></a><strong>常用CDN</strong></h2><table>
<thead>
<tr>
<th>常用CDN</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>新浪CDN</td>
<td><a href="http://lib.sinaapp.com" target="_blank" rel="external">http://lib.sinaapp.com</a></td>
</tr>
<tr>
<td>百度静态资源公共库</td>
<td><a href="http://cdn.code.baidu.com" target="_blank" rel="external">http://cdn.code.baidu.com</a></td>
</tr>
<tr>
<td>360网站卫士常用前端公共库CDN服务</td>
<td><a href="http://libs.useso.com" target="_blank" rel="external">http://libs.useso.com</a></td>
</tr>
<tr>
<td>Bootstrap中文网开源项目免费 CDN 服务</td>
<td><a href="http://www.bootcdn.cn" target="_blank" rel="external">http://www.bootcdn.cn</a></td>
</tr>
<tr>
<td>开放静态文件 CDN - 七牛</td>
<td><a href="http://staticfile.org" target="_blank" rel="external">http://staticfile.org</a></td>
</tr>
<tr>
<td>CDN加速 - jq22</td>
<td><a href="http://www.jq22.com/cdn" target="_blank" rel="external">http://www.jq22.com/cdn</a></td>
</tr>
<tr>
<td>jQuery CDN</td>
<td><a href="http://code.jquery.com" target="_blank" rel="external">http://code.jquery.com</a></td>
</tr>
<tr>
<td>微软CDN</td>
<td><a href="http://www.asp.net/ajax/cdn" target="_blank" rel="external">http://www.asp.net/ajax/cdn</a></td>
</tr>
</tbody>
</table>
<h2 id="Git"><a href="#Git" class="headerlink" title="Git"></a><strong>Git</strong></h2><table>
<thead>
<tr>
<th>Git</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>git-scm</td>
<td><a href="http://git-scm.com" target="_blank" rel="external">http://git-scm.com</a></td>
</tr>
<tr>
<td>廖雪峰-Git教程</td>
<td><a href="http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000" target="_blank" rel="external">廖雪峰-Git教程</a></td>
</tr>
<tr>
<td>git-for-windows</td>
<td><a href="https://git-for-windows.github.io" target="_blank" rel="external">https://git-for-windows.github.io</a></td>
</tr>
<tr>
<td>GitHub 添加 SSH keys</td>
<td><a href="http://daemon369.github.io/git/2015/03/10/add-ssh-keys-for-github" target="_blank" rel="external">http://daemon369.github.io/git/2015/03/10/add-ssh-keys-for-github</a></td>
</tr>
<tr>
<td>gogithub</td>
<td><a href="http://www.worldhello.net/gotgithub/index.html" target="_blank" rel="external">http://www.worldhello.net/gotgithub/index.html</a></td>
</tr>
<tr>
<td>git常规命令练习</td>
<td><a href="http://pcottle.github.io/learnGitBranching" target="_blank" rel="external">http://pcottle.github.io/learnGitBranching</a></td>
</tr>
<tr>
<td>git的资料整理</td>
<td><a href="https://github.com/xirong/my-git" target="_blank" rel="external">https://github.com/xirong/my-git</a></td>
</tr>
<tr>
<td>我所记录的git命令（非常实用）</td>
<td><a href="http://www.cnblogs.com/fanfan259/p/4810517.html" target="_blank" rel="external">http://www.cnblogs.com/fanfan259/p/4810517.html</a></td>
</tr>
<tr>
<td>企业开发git工作流模式探索部分休整</td>
<td><a href="https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md" target="_blank" rel="external">https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md</a></td>
</tr>
<tr>
<td>GitHub 漫游指南</td>
<td><a href="https://github.com/phodal/github-roam" target="_blank" rel="external">https://github.com/phodal/github-roam</a></td>
</tr>
<tr>
<td>GitHub秘籍</td>
<td><a href="https://github.com/tiimgreen/github-cheat-sheet/blob/master/README.zh-cn.md" target="_blank" rel="external">https://github.com/tiimgreen/github-cheat-sheet/blob/master/README.zh-cn.md</a></td>
</tr>
<tr>
<td>使用git和github进行协同开发流程</td>
<td><a href="http://livoras.com/post/28" target="_blank" rel="external">http://livoras.com/post/28</a></td>
</tr>
<tr>
<td>动画方式练习git</td>
<td><a href="http://onlywei.github.io/explain-git-with-d3" target="_blank" rel="external">http://onlywei.github.io/explain-git-with-d3</a></td>
</tr>
</tbody>
</table>
<h2 id="各种日期日历"><a href="#各种日期日历" class="headerlink" title="各种日期日历"></a><strong>各种日期日历</strong></h2><table>
<thead>
<tr>
<th>各种日期日历</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>经典my97</td>
<td><a href="http://www.my97.net/dp/demo/index.htm" target="_blank" rel="external">http://www.my97.net/dp/demo/index.htm</a></td>
</tr>
<tr>
<td>强大的独立日期选择器</td>
<td><a href="http://www.cnblogs.com/gbin1/archive/2012/04/16/2452105.html" target="_blank" rel="external">http://www.cnblogs.com/gbin1/archive/2012/04/16/2452105.html</a></td>
</tr>
<tr>
<td>fullcalendar</td>
<td><a href="http://fullcalendar.io" target="_blank" rel="external">http://fullcalendar.io</a></td>
</tr>
<tr>
<td>fullcalendar日历控件知识点集合</td>
<td><a href="http://blog.csdn.net/francislaw/article/details/7740630" target="_blank" rel="external">http://blog.csdn.net/francislaw/article/details/7740630</a></td>
</tr>
<tr>
<td>中文api</td>
<td><a href="http://blog.sina.com.cn/s/blog_9475b1c101012c5f.html" target="_blank" rel="external">http://blog.sina.com.cn/s/blog_9475b1c101012c5f.html</a></td>
</tr>
<tr>
<td>农历日历</td>
<td><a href="https://github.com/zzyss86/LunarCalendar" target="_blank" rel="external">https://github.com/zzyss86/LunarCalendar</a></td>
</tr>
<tr>
<td>超酷的仿百度带节日日历老黄历控件</td>
<td><a href="http://www.sucaisj.com/jiaoben/date/201509/16856.html" target="_blank" rel="external">http://www.sucaisj.com/jiaoben/date/201509/16856.html</a></td>
</tr>
<tr>
<td>日期格式化</td>
<td><a href="http://momentjs.com" target="_blank" rel="external">http://momentjs.com</a></td>
</tr>
<tr>
<td>大牛日历控件</td>
<td><a href="https://github.com/Johnqing/QPAYCalendar" target="_blank" rel="external">https://github.com/Johnqing/QPAYCalendar</a></td>
</tr>
<tr>
<td>我群某管理作品</td>
<td><a href="https://github.com/Iamlars/dateMarker" target="_blank" rel="external">https://github.com/Iamlars/dateMarker</a></td>
</tr>
<tr>
<td>input按位替换-官网</td>
<td><a href="http://digitalbush.com/projects/masked-input-plugin" target="_blank" rel="external">http://digitalbush.com/projects/masked-input-plugin</a></td>
</tr>
<tr>
<td>input按位替换-github</td>
<td><a href="https://github.com/digitalBush/jquery.maskedinput/tree/1.2.2" target="_blank" rel="external">https://github.com/digitalBush/jquery.maskedinput/tree/1.2.2</a></td>
</tr>
<tr>
<td>bootstrap-daterangepicker</td>
<td><a href="https://github.com/dangrossman/bootstrap-daterangepicker" target="_blank" rel="external">https://github.com/dangrossman/bootstrap-daterangepicker</a></td>
</tr>
<tr>
<td>国外30个插件集合</td>
<td><a href="http://www.vandelaydesign.com/30-best-free-jquery-plugins" target="_blank" rel="external">http://www.vandelaydesign.com/30-best-free-jquery-plugins</a></td>
</tr>
<tr>
<td>JavaScript datepicker</td>
<td><a href="http://dbushell.com/2012/10/09/pikaday-javascript-datepicker" target="_blank" rel="external">http://dbushell.com/2012/10/09/pikaday-javascript-datepicker</a></td>
</tr>
<tr>
<td>Datepair.js</td>
<td><a href="http://jonthornton.github.io/Datepair.js" target="_blank" rel="external">http://jonthornton.github.io/Datepair.js</a></td>
</tr>
<tr>
<td>一个风格多样的日历</td>
<td><a href="https://github.com/glad/glDatePicker" target="_blank" rel="external">https://github.com/glad/glDatePicker</a></td>
</tr>
<tr>
<td>弹出层式的全日历</td>
<td><a href="http://amsul.ca/pickadate.js/date" target="_blank" rel="external">http://amsul.ca/pickadate.js/date</a></td>
</tr>
<tr>
<td>jquery双日历</td>
<td><a href="http://www.daterangepicker.com" target="_blank" rel="external">http://www.daterangepicker.com</a></td>
</tr>
<tr>
<td>大气实用jQuery手机移动端日历日期选择插件</td>
<td><a href="http://www.frankdemo.cn/index.php?c=content&amp;a=show&amp;id=115" target="_blank" rel="external">http://www.frankdemo.cn/index.php?c=content&amp;a=show&amp;id=115</a></td>
</tr>
<tr>
<td>jQuery Mobile 移动开发中的日期插件Mobiscroll</td>
<td><a href="https://mobiscroll.com" target="_blank" rel="external">https://mobiscroll.com</a></td>
</tr>
</tbody>
</table>
<h2 id="Date-library"><a href="#Date-library" class="headerlink" title="Date library"></a><strong>Date library</strong></h2><table>
<thead>
<tr>
<th>Date library</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Datejs</td>
<td><a href="https://github.com/datejs/Datejs" target="_blank" rel="external">https://github.com/datejs/Datejs</a></td>
</tr>
<tr>
<td>sugarjs</td>
<td><a href="http://sugarjs.com/api/Date" target="_blank" rel="external">http://sugarjs.com/api/Date</a></td>
</tr>
</tbody>
</table>
<h2 id="其它"><a href="#其它" class="headerlink" title="其它"></a><strong>其它</strong></h2><table>
<thead>
<tr>
<th>其它</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Mock.js 是一款模拟数据生成器</td>
<td><a href="http://mockjs.com" target="_blank" rel="external">http://mockjs.com</a></td>
</tr>
<tr>
<td>特色的HTML框架可以创建精美的iOS应用</td>
<td><a href="http://framework7.taobao.org" target="_blank" rel="external">http://framework7.taobao.org</a></td>
</tr>
<tr>
<td>淘宝SUI</td>
<td><a href="http://m.sui.taobao.org" target="_blank" rel="external">http://m.sui.taobao.org</a></td>
</tr>
<tr>
<td>avalonjs</td>
<td><a href="http://avalonjs.github.io" target="_blank" rel="external">http://avalonjs.github.io</a></td>
</tr>
<tr>
<td>Avalon新一代UI库： OniUI</td>
<td><a href="http://ued.qunar.com/oniui/index.html" target="_blank" rel="external">http://ued.qunar.com/oniui/index.html</a></td>
</tr>
<tr>
<td>avalon.oniui-基于avalon的组件库</td>
<td><a href="https://github.com/RubyLouvre/avalon.oniui" target="_blank" rel="external">https://github.com/RubyLouvre/avalon.oniui</a></td>
</tr>
<tr>
<td>生成二维码(草料)</td>
<td><a href="http://cli.im" target="_blank" rel="external">http://cli.im</a></td>
</tr>
</tbody>
</table>
<h2 id="效果类"><a href="#效果类" class="headerlink" title="效果类"></a><strong>效果类</strong></h2><table>
<thead>
<tr>
<th>效果类</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>弹出层</td>
<td><a href="http://www.imooc.com/learn/58" target="_blank" rel="external">http://www.imooc.com/learn/58</a></td>
</tr>
<tr>
<td>焦点图轮播特效</td>
<td><a href="http://www.imooc.com/learn/18" target="_blank" rel="external">http://www.imooc.com/learn/18</a></td>
</tr>
<tr>
<td><strong>HTML5 有哪些让你惊艳的 demo？</strong></td>
<td><a href="http://www.zhihu.com/question/24398907" target="_blank" rel="external">http://www.zhihu.com/question/24398907</a></td>
</tr>
</tbody>
</table>
<h2 id="弹出层"><a href="#弹出层" class="headerlink" title="弹出层"></a><strong>弹出层</strong></h2><table>
<thead>
<tr>
<th>弹出层</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>artDialog 最新版</td>
<td><a href="https://github.com/aui/artDialog" target="_blank" rel="external">https://github.com/aui/artDialog</a></td>
</tr>
<tr>
<td>artDialog 文档</td>
<td><a href="http://aui.github.io/artDialog/doc/index.html" target="_blank" rel="external">http://aui.github.io/artDialog/doc/index.html</a></td>
</tr>
<tr>
<td>google code 下载地址</td>
<td><a href="https://code.google.com/p/artdialog/downloads/list" target="_blank" rel="external">https://code.google.com/p/artdialog/downloads/list</a></td>
</tr>
<tr>
<td>贤心弹出层</td>
<td><a href="http://layer.layui.com" target="_blank" rel="external">http://layer.layui.com</a></td>
</tr>
<tr>
<td>响应式用户交互组件库</td>
<td><a href="https://github.com/bh-lay/UI" target="_blank" rel="external">https://github.com/bh-lay/UI</a></td>
</tr>
<tr>
<td>sweetalert-有css3动画弹出层</td>
<td><a href="http://t4t5.github.io/sweetalert" target="_blank" rel="external">http://t4t5.github.io/sweetalert</a></td>
</tr>
</tbody>
</table>
<h2 id="优秀JavaScript项目"><a href="#优秀JavaScript项目" class="headerlink" title="优秀JavaScript项目"></a><strong>优秀JavaScript项目</strong></h2><table>
<thead>
<tr>
<th>优秀JavaScript项目</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>Angular和Webpack种子文件</td>
<td><a href="https://github.com/AngularClass/angular2-webpack-starter" target="_blank" rel="external">https://github.com/AngularClass/angular2-webpack-starter</a></td>
</tr>
<tr>
<td>Fis3面向前端的工程构建系统</td>
<td><a href="https://github.com/fex-team/fis3" target="_blank" rel="external">https://github.com/fex-team/fis3</a></td>
</tr>
<tr>
<td>Fis3 DEMO</td>
<td><a href="https://github.com/fex-team/fis3-demo" target="_blank" rel="external">https://github.com/fex-team/fis3-demo</a></td>
</tr>
<tr>
<td>前端JQuery系列:源码剖析</td>
<td><a href="https://github.com/JsAaron/jQuery" target="_blank" rel="external">https://github.com/JsAaron/jQuery</a></td>
</tr>
<tr>
<td>avalon框架</td>
<td><a href="https://github.com/RubyLouvre/avalon" target="_blank" rel="external">https://github.com/RubyLouvre/avalon</a></td>
</tr>
<tr>
<td>Microsoft ChakraCore 微软的Chakra引擎</td>
<td><a href="https://github.com/Microsoft/ChakraCore" target="_blank" rel="external">https://github.com/Microsoft/ChakraCore</a></td>
</tr>
<tr>
<td>Quintus HTML游戏引擎</td>
<td><a href="https://github.com/cykod/Quintus" target="_blank" rel="external">https://github.com/cykod/Quintus</a></td>
</tr>
<tr>
<td>一个用node.js搭建的有趣博客</td>
<td><a href="https://github.com/STRML/strml.net" target="_blank" rel="external">https://github.com/STRML/strml.net</a></td>
</tr>
<tr>
<td>Web前端助手–FeHelper（Chrome扩展）</td>
<td><a href="https://github.com/zxlie/FeHelper" target="_blank" rel="external">https://github.com/zxlie/FeHelper</a></td>
</tr>
<tr>
<td>百度前端技术学院</td>
<td><a href="https://github.com/baidu-ife/ife" target="_blank" rel="external">https://github.com/baidu-ife/ife</a></td>
</tr>
<tr>
<td>Cheerio（node.js中的jQuery）</td>
<td><a href="https://github.com/cheeriojs/cheerio" target="_blank" rel="external">https://github.com/cheeriojs/cheerio</a></td>
</tr>
<tr>
<td>nodejs的一个聊天软件 类似微信</td>
<td><a href="https://github.com/BryanYang/freechat" target="_blank" rel="external">https://github.com/BryanYang/freechat</a></td>
</tr>
<tr>
<td>使用html5和node.js构建的网易云音乐</td>
<td><a href="https://github.com/stkevintan/Cube" target="_blank" rel="external">https://github.com/stkevintan/Cube</a></td>
</tr>
<tr>
<td>babel ES6转换为ES5</td>
<td><a href="https://github.com/babel/babel" target="_blank" rel="external">https://github.com/babel/babel</a></td>
</tr>
<tr>
<td>一个JS富文本编辑器</td>
<td><a href="https://github.com/fex-team/ueditor" target="_blank" rel="external">https://github.com/fex-team/ueditor</a></td>
</tr>
<tr>
<td>一个JS脑图可视化工具</td>
<td><a href="https://github.com/fex-team/kityminder-core" target="_blank" rel="external">https://github.com/fex-team/kityminder-core</a></td>
</tr>
<tr>
<td>一个JS写的Flappy Bird Game</td>
<td><a href="https://github.com/ellisonleao/clumsy-bird" target="_blank" rel="external">https://github.com/ellisonleao/clumsy-bird</a></td>
</tr>
<tr>
<td>一个JS写的GBA模拟器</td>
<td><a href="https://github.com/taisel/IodineGBA" target="_blank" rel="external">https://github.com/taisel/IodineGBA</a></td>
</tr>
<tr>
<td>SegmentFault写的Markdown解析器</td>
<td><a href="https://github.com/SegmentFault/HyperDown.js" target="_blank" rel="external">https://github.com/SegmentFault/HyperDown.js</a></td>
</tr>
<tr>
<td>基于node.js的Ghost博客</td>
<td><a href="https://github.com/TryGhost/Ghost" target="_blank" rel="external">https://github.com/TryGhost/Ghost</a></td>
</tr>
<tr>
<td>学习react的demos</td>
<td><a href="https://github.com/ruanyf/react-demos" target="_blank" rel="external">https://github.com/ruanyf/react-demos</a></td>
</tr>
</tbody>
</table>
<blockquote>
<p>转载请保留原链接：<a href="http://www.jeffjade.com/2016/03/30/104-front-end-tutorial/" target="_blank" rel="external">http://www.jeffjade.com/2016/03/30/104-front-end-tutorial/</a></p>
</blockquote>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/Resources/2017/02/24/前端资源汇集.html">http://lucylc.com/Resources/2017/02/24/前端资源汇集.html</a></p>
]]></content>
    
    <summary type="html">
    
      『引』最全前端资源链接汇集『引』
    
    </summary>
    
      <category term="Resources" scheme="http://lucylc.com/categories/Resources/"/>
    
    
      <category term="JavaScript" scheme="http://lucylc.com/tags/JavaScript/"/>
    
      <category term="chm" scheme="http://lucylc.com/tags/chm/"/>
    
      <category term="HTML5" scheme="http://lucylc.com/tags/HTML5/"/>
    
      <category term="CSS" scheme="http://lucylc.com/tags/CSS/"/>
    
      <category term="vue" scheme="http://lucylc.com/tags/vue/"/>
    
      <category term="Jquery" scheme="http://lucylc.com/tags/Jquery/"/>
    
  </entry>
  
  <entry>
    <title>MarkDown简明语法</title>
    <link href="http://lucylc.com/Editor/2017/02/22/MarkDown%E7%AE%80%E6%98%8E%E8%AF%AD%E6%B3%95.html"/>
    <id>http://lucylc.com/Editor/2017/02/22/MarkDown简明语法.html</id>
    <published>2017-02-22T01:15:55.000Z</published>
    <updated>2017-08-20T10:15:40.945Z</updated>
    
    <content type="html"><![CDATA[<p><a href="https://www.zybuluo.com/mdeditor" title="作业部落旗下 Cmd 在线 Markdown 编辑阅读器" target="_blank" rel="external">『Cmd 技术渲染的沙箱页面，点击此处编写自己的文档』</a></p>
<h2 id="Cmd-Markdown-简明语法手册"><a href="#Cmd-Markdown-简明语法手册" class="headerlink" title="Cmd Markdown 简明语法手册"></a>Cmd Markdown 简明语法手册</h2><p>标签： Cmd-Markdown</p>
<hr>
<h3 id="1-斜体和粗体"><a href="#1-斜体和粗体" class="headerlink" title="1. 斜体和粗体"></a>1. 斜体和粗体</h3><p>使用 一个<em>号 和 2个*</em>号 表示斜体和粗体。</p>
<p>示例：</p>
<p>这是 <em>斜体</em>，这是 <strong>粗体</strong>。</p>
<a id="more"></a>
<h3 id="2-分级标题"><a href="#2-分级标题" class="headerlink" title="2. 分级标题"></a>2. 分级标题</h3><p>可以选择在行首加井号表示不同级别的标题 (H1-H6)，例如：# H1, ## H2, ### H3，#### H4。</p>
<p>示例：<code>#一级标题  ##二级标题  以此类推</code></p>
<h3 id="3-外链接"><a href="#3-外链接" class="headerlink" title="3. 外链接"></a>3. 外链接</h3><p>使用 [描述](链接地址) 为文字增加外链接。</p>
<p>示例：</p>
<p>这是去往 <a href="http://lucylc.com">本人博客</a> 的链接。</p>
<h3 id="4-无序列表"><a href="#4-无序列表" class="headerlink" title="4. 无序列表"></a>4. 无序列表</h3><p>使用 *，+，- 表示无序列表。</p>
<p>示例：</p>
<ul>
<li>无序列表项 一</li>
<li>无序列表项 二</li>
<li>无序列表项 三</li>
</ul>
<h3 id="5-有序列表"><a href="#5-有序列表" class="headerlink" title="5. 有序列表"></a>5. 有序列表</h3><p>使用数字和点表示有序列表。</p>
<p>示例：</p>
<ol>
<li>有序列表项 一</li>
<li>有序列表项 二</li>
<li>有序列表项 三</li>
</ol>
<h3 id="6-文字引用"><a href="#6-文字引用" class="headerlink" title="6. 文字引用"></a>6. 文字引用</h3><p>使用 &gt; 表示文字引用。</p>
<p>示例：</p>
<blockquote>
<p>野火烧不尽，春风吹又生。</p>
</blockquote>
<h3 id="7-行内代码块"><a href="#7-行内代码块" class="headerlink" title="7. 行内代码块"></a>7. 行内代码块</h3><p>使用 `代码` 表示行内代码块。</p>
<p>示例：</p>
<p>让我们聊聊 <code>html</code>。</p>
<h3 id="8-代码块"><a href="#8-代码块" class="headerlink" title="8.  代码块"></a>8.  代码块</h3><p>使用 四个缩进空格 表示代码块。</p>
<p>示例：</p>
<pre><code>这是一个代码块，此行左侧有四个不可见的空格。
</code></pre><h3 id="9-插入图像"><a href="#9-插入图像" class="headerlink" title="9.  插入图像"></a>9.  插入图像</h3><p>使用 ![描述](图片链接地址) 插入图像。</p>
<hr>
<h2 id="Cmd-Markdown-高阶语法手册"><a href="#Cmd-Markdown-高阶语法手册" class="headerlink" title="Cmd Markdown 高阶语法手册"></a>Cmd Markdown 高阶语法手册</h2><h3 id="1-内容目录"><a href="#1-内容目录" class="headerlink" title="1. 内容目录"></a>1. 内容目录</h3><p>在段落中填写 <code>[TOC]</code> 以显示全文内容的目录结构。</p>
<p>[TOC]</p>
<h3 id="2-标签分类"><a href="#2-标签分类" class="headerlink" title="2. 标签分类"></a>2. 标签分类</h3><p>在编辑区任意行的列首位置输入以下代码给文稿标签：</p>
<p>标签： 数学 英语 Markdown</p>
<p>或者</p>
<p>Tags： 数学 英语 Markdown</p>
<h3 id="3-删除线"><a href="#3-删除线" class="headerlink" title="3. 删除线"></a>3. 删除线</h3><p>使用 ~~ 表示删除线。</p>
<p><del>这是一段错误的文本。</del></p>
<h3 id="4-注脚"><a href="#4-注脚" class="headerlink" title="4. 注脚"></a>4. 注脚</h3><p>使用 [^keyword] 表示注脚。</p>
<p>这是一个注脚[^footnote]的样例。</p>
<p>这是第二个注脚[^footnote2]的样例。</p>
<h3 id="5-LaTeX-公式"><a href="#5-LaTeX-公式" class="headerlink" title="5. LaTeX 公式"></a>5. LaTeX 公式</h3><p>$ 表示行内公式：</p>
<p>质能守恒方程可以用一个很简洁的方程式 $E=mc^2$ 来表达。</p>
<p>$$ 表示整行公式：</p>
<p>$$\sum_{i=1}^n a_i=0$$</p>
<p>$$f(x_1,x_x,\ldots,x_n) = x_1^2 + x_2^2 + \cdots + x_n^2 $$</p>
<p>$$\sum^{j-1}<em>{k=0}{\widehat{\gamma}</em>{kj} z_k}$$</p>
<p>访问 <a href="http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference" target="_blank" rel="external">MathJax</a> 参考更多使用方法。</p>
<h3 id="6-加强的代码块"><a href="#6-加强的代码块" class="headerlink" title="6. 加强的代码块"></a>6. 加强的代码块</h3><p>支持四十一种编程语言的语法高亮的显示，行号显示。</p>
<p>非代码示例：</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">$ sudo apt-get install vim-gnome</div></pre></td></tr></table></figure>
<p>Python 示例：</p>
<figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"><span class="meta">@requires_authorization</span></div><div class="line"><span class="function"><span class="keyword">def</span> <span class="title">somefunc</span><span class="params">(param1=<span class="string">''</span>, param2=<span class="number">0</span>)</span>:</span></div><div class="line">    <span class="string">'''A docstring'''</span></div><div class="line">    <span class="keyword">if</span> param1 &gt; param2: <span class="comment"># interesting</span></div><div class="line">        <span class="keyword">print</span> <span class="string">'Greater'</span></div><div class="line">    <span class="keyword">return</span> (param2 - param1 + <span class="number">1</span>) <span class="keyword">or</span> <span class="keyword">None</span></div><div class="line"></div><div class="line"><span class="class"><span class="keyword">class</span> <span class="title">SomeClass</span>:</span></div><div class="line">    <span class="keyword">pass</span></div><div class="line"></div><div class="line"><span class="meta">&gt;&gt;&gt; </span>message = <span class="string">'''interpreter</span></div><div class="line"><span class="string"><span class="meta">... </span>prompt'''</span></div></pre></td></tr></table></figure>
<p>JavaScript 示例：</p>
<figure class="highlight javascript"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div></pre></td><td class="code"><pre><div class="line"><span class="comment">/**</span></div><div class="line"><span class="comment">* nth element in the fibonacci series.</span></div><div class="line"><span class="comment">* @param n &gt;= 0</span></div><div class="line"><span class="comment">* @return the nth element, &gt;= 0.</span></div><div class="line"><span class="comment">*/</span></div><div class="line"><span class="function"><span class="keyword">function</span> <span class="title">fib</span>(<span class="params">n</span>) </span>&#123;</div><div class="line">  <span class="keyword">var</span> a = <span class="number">1</span>, b = <span class="number">1</span>;</div><div class="line">  <span class="keyword">var</span> tmp;</div><div class="line">  <span class="keyword">while</span> (--n &gt;= <span class="number">0</span>) &#123;</div><div class="line">    tmp = a;</div><div class="line">    a += b;</div><div class="line">    b = tmp;</div><div class="line">  &#125;</div><div class="line">  <span class="keyword">return</span> a;</div><div class="line">&#125;</div><div class="line"></div><div class="line"><span class="built_in">document</span>.write(fib(<span class="number">10</span>));</div></pre></td></tr></table></figure>
<h3 id="7-流程图"><a href="#7-流程图" class="headerlink" title="7. 流程图"></a>7. 流程图</h3><h4 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div></pre></td><td class="code"><pre><div class="line">st=&gt;start: Start:&gt;https://www.zybuluo.com</div><div class="line">io=&gt;inputoutput: verification</div><div class="line">op=&gt;operation: Your Operation</div><div class="line">cond=&gt;condition: Yes or No?</div><div class="line">sub=&gt;subroutine: Your Subroutine</div><div class="line">e=&gt;end</div><div class="line"></div><div class="line">st-&gt;io-&gt;op-&gt;cond</div><div class="line">cond(yes)-&gt;e</div><div class="line">cond(no)-&gt;sub-&gt;io</div></pre></td></tr></table></figure>
<h4 id="更多语法参考：流程图语法参考"><a href="#更多语法参考：流程图语法参考" class="headerlink" title="更多语法参考：流程图语法参考"></a>更多语法参考：<a href="http://adrai.github.io/flowchart.js/" target="_blank" rel="external">流程图语法参考</a></h4><h3 id="8-序列图"><a href="#8-序列图" class="headerlink" title="8. 序列图"></a>8. 序列图</h3><h4 id="示例-1"><a href="#示例-1" class="headerlink" title="示例 1"></a>示例 1</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">Alice-&gt;Bob: Hello Bob, how are you?</div><div class="line">Note right of Bob: Bob thinks</div><div class="line">Bob--&gt;Alice: I am good thanks!</div></pre></td></tr></table></figure>
<h4 id="示例-2"><a href="#示例-2" class="headerlink" title="示例 2"></a>示例 2</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line">Title: Here is a title</div><div class="line">A-&gt;B: Normal line</div><div class="line">B--&gt;C: Dashed line</div><div class="line">C-&gt;&gt;D: Open arrow</div><div class="line">D--&gt;&gt;A: Dashed open arrow</div></pre></td></tr></table></figure>
<h4 id="更多语法参考：序列图语法参考"><a href="#更多语法参考：序列图语法参考" class="headerlink" title="更多语法参考：序列图语法参考"></a>更多语法参考：<a href="http://bramp.github.io/js-sequence-diagrams/" target="_blank" rel="external">序列图语法参考</a></h4><h3 id="9-甘特图"><a href="#9-甘特图" class="headerlink" title="9. 甘特图"></a>9. 甘特图</h3><p>甘特图内在思想简单。基本是一条线条图，横轴表示时间，纵轴表示活动（项目），线条表示在整个期间上计划和实际的活动完成情况。它直观地表明任务计划在什么时候进行，及实际进展与计划要求的对比。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">title 项目开发流程</div><div class="line">section 项目确定</div><div class="line">    需求分析       :a1, 2016-06-22, 3d</div><div class="line">    可行性报告     :after a1, 5d</div><div class="line">    概念验证       : 5d</div><div class="line">section 项目实施</div><div class="line">    概要设计      :2016-07-05  , 5d</div><div class="line">    详细设计      :2016-07-08, 10d</div><div class="line">    编码          :2016-07-15, 10d</div><div class="line">    测试          :2016-07-22, 5d</div><div class="line">section 发布验收</div><div class="line">    发布: 2d</div><div class="line">    验收: 3d</div></pre></td></tr></table></figure>
<h4 id="更多语法参考：甘特图语法参考"><a href="#更多语法参考：甘特图语法参考" class="headerlink" title="更多语法参考：甘特图语法参考"></a>更多语法参考：<a href="https://knsv.github.io/mermaid/#gant-diagrams" target="_blank" rel="external">甘特图语法参考</a></h4><h3 id="10-Mermaid-流程图"><a href="#10-Mermaid-流程图" class="headerlink" title="10. Mermaid 流程图"></a>10. Mermaid 流程图</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">A[Hard edge] --&gt;|Link text| B(Round edge)</div><div class="line">B --&gt; C&#123;Decision&#125;</div><div class="line">C --&gt;|One| D[Result one]</div><div class="line">C --&gt;|Two| E[Result two]</div></pre></td></tr></table></figure>
<h4 id="更多语法参考：Mermaid-流程图语法参考"><a href="#更多语法参考：Mermaid-流程图语法参考" class="headerlink" title="更多语法参考：Mermaid 流程图语法参考"></a>更多语法参考：<a href="https://knsv.github.io/mermaid/#flowcharts-basic-syntax" target="_blank" rel="external">Mermaid 流程图语法参考</a></h4><h3 id="11-Mermaid-序列图"><a href="#11-Mermaid-序列图" class="headerlink" title="11. Mermaid 序列图"></a>11. Mermaid 序列图</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">Alice-&gt;John: Hello John, how are you?</div><div class="line">loop every minute</div><div class="line">    John--&gt;Alice: Great!</div><div class="line">end</div></pre></td></tr></table></figure>
<h4 id="更多语法参考：Mermaid-序列图语法参考"><a href="#更多语法参考：Mermaid-序列图语法参考" class="headerlink" title="更多语法参考：Mermaid 序列图语法参考"></a>更多语法参考：<a href="https://knsv.github.io/mermaid/#sequence-diagrams" target="_blank" rel="external">Mermaid 序列图语法参考</a></h4><h3 id="12-表格支持"><a href="#12-表格支持" class="headerlink" title="12. 表格支持"></a>12. 表格支持</h3><table>
<thead>
<tr>
<th>项目</th>
<th style="text-align:right">价格</th>
<th style="text-align:center">数量</th>
</tr>
</thead>
<tbody>
<tr>
<td>计算机</td>
<td style="text-align:right">\$1600</td>
<td style="text-align:center">5</td>
</tr>
<tr>
<td>手机</td>
<td style="text-align:right">\$12</td>
<td style="text-align:center">12</td>
</tr>
<tr>
<td>管线</td>
<td style="text-align:right">\$1</td>
<td style="text-align:center">234</td>
</tr>
</tbody>
</table>
<h3 id="13-定义型列表"><a href="#13-定义型列表" class="headerlink" title="13. 定义型列表"></a>13. 定义型列表</h3><p>名词 1
:   定义 1（左侧有一个可见的冒号和四个不可见的空格）</p>
<p>代码块 2
:   这是代码块的定义（左侧有一个可见的冒号和四个不可见的空格）</p>
<pre><code>代码块（左侧有八个不可见的空格）
</code></pre><h3 id="14-Html-标签"><a href="#14-Html-标签" class="headerlink" title="14. Html 标签"></a>14. Html 标签</h3><p>本站支持在 Markdown 语法中嵌套 Html 标签，譬如，你可以用 Html 写一个纵跨两行的表格：</p>
<pre><code>&lt;table&gt;
    &lt;tr&gt;
        &lt;th rowspan=&quot;2&quot;&gt;值班人员&lt;/th&gt;
        &lt;th&gt;星期一&lt;/th&gt;
        &lt;th&gt;星期二&lt;/th&gt;
        &lt;th&gt;星期三&lt;/th&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
        &lt;td&gt;李强&lt;/td&gt;
        &lt;td&gt;张明&lt;/td&gt;
        &lt;td&gt;王平&lt;/td&gt;
    &lt;/tr&gt;
&lt;/table&gt;
</code></pre><table>
    <tr>
        <th rowspan="2">值班人员</th>
        <th>星期一</th>
        <th>星期二</th>
        <th>星期三</th>
    </tr>
    <tr>
        <td>李强</td>
        <td>张明</td>
        <td>王平</td>
    </tr>
</table>

<h3 id="15-内嵌图标"><a href="#15-内嵌图标" class="headerlink" title="15. 内嵌图标"></a>15. 内嵌图标</h3><p>本站的图标系统对外开放，在文档中输入</p>
<pre><code>&lt;i class=&quot;icon-weibo&quot;&gt;&lt;/i&gt;
</code></pre><p>即显示微博的图标： <i class="icon-weibo icon-2x"></i></p>
<p>替换 上述 <code>i 标签</code> 内的 <code>icon-weibo</code> 以显示不同的图标，例如：</p>
<pre><code>&lt;i class=&quot;icon-renren&quot;&gt;&lt;/i&gt;
</code></pre><p>即显示人人的图标： <i class="icon-renren icon-2x"></i></p>
<p>更多的图标和玩法可以参看 <a href="http://fortawesome.github.io/Font-Awesome/3.2.1/icons/" target="_blank" rel="external">font-awesome</a> 官方网站。</p>
<h3 id="16-待办事宜-Todo-列表"><a href="#16-待办事宜-Todo-列表" class="headerlink" title="16. 待办事宜 Todo 列表"></a>16. 待办事宜 Todo 列表</h3><p>使用带有 [ ] 或 [x] （未完成或已完成）项的列表语法撰写一个待办事宜列表，并且支持子列表嵌套以及混用Markdown语法，例如：</p>
<pre><code>- [ ] **Cmd Markdown 开发**
    - [ ] 改进 Cmd 渲染算法，使用局部渲染技术提高渲染效率
    - [ ] 支持以 PDF 格式导出文稿
    - [x] 新增Todo列表功能 [语法参考](https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments)
    - [x] 改进 LaTex 功能
        - [x] 修复 LaTex 公式渲染问题
        - [x] 新增 LaTex 公式编号功能 [语法参考](http://docs.mathjax.org/en/latest/tex.html#tex-eq-numbers)
- [ ] **七月旅行准备**
    - [ ] 准备邮轮上需要携带的物品
    - [ ] 浏览日本免税店的物品
    - [x] 购买蓝宝石公主号七月一日的船票
</code></pre><p>对应显示如下待办事宜 Todo 列表：</p>
<ul>
<li>[ ] <strong>Cmd Markdown 开发</strong><ul>
<li>[ ] 改进 Cmd 渲染算法，使用局部渲染技术提高渲染效率</li>
<li>[ ] 支持以 PDF 格式导出文稿</li>
<li>[x] 新增Todo列表功能 <a href="https://github.com/blog/1375-task-lists-in-gfm-issues-pulls-comments" target="_blank" rel="external">语法参考</a></li>
<li>[x] 改进 LaTex 功能<ul>
<li>[x] 修复 LaTex 公式渲染问题</li>
<li>[x] 新增 LaTex 公式编号功能 <a href="http://docs.mathjax.org/en/latest/tex.html#tex-eq-numbers" target="_blank" rel="external">语法参考</a></li>
</ul>
</li>
</ul>
</li>
<li>[ ] <strong>七月旅行准备</strong><ul>
<li>[ ] 准备邮轮上需要携带的物品</li>
<li>[ ] 浏览日本免税店的物品</li>
<li>[x] 购买蓝宝石公主号七月一日的船票</li>
</ul>
</li>
</ul>
<p>[^footnote]: 这是一个 <em>注脚</em> 的 <strong>文本</strong>。</p>
<p>[^footnote2]: 这是另一个 <em>注脚</em> 的 <strong>文本</strong>。</p>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/Editor/2017/02/22/MarkDown简明语法.html">http://lucylc.com/Editor/2017/02/22/MarkDown简明语法.html</a></p>
]]></content>
    
    <summary type="html">
    
      &lt;p&gt;&lt;a href=&quot;https://www.zybuluo.com/mdeditor&quot; title=&quot;作业部落旗下 Cmd 在线 Markdown 编辑阅读器&quot; target=&quot;_blank&quot; rel=&quot;external&quot;&gt;『Cmd 技术渲染的沙箱页面，点击此处编写自己的文档』&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;Cmd-Markdown-简明语法手册&quot;&gt;&lt;a href=&quot;#Cmd-Markdown-简明语法手册&quot; class=&quot;headerlink&quot; title=&quot;Cmd Markdown 简明语法手册&quot;&gt;&lt;/a&gt;Cmd Markdown 简明语法手册&lt;/h2&gt;&lt;p&gt;标签： Cmd-Markdown&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-斜体和粗体&quot;&gt;&lt;a href=&quot;#1-斜体和粗体&quot; class=&quot;headerlink&quot; title=&quot;1. 斜体和粗体&quot;&gt;&lt;/a&gt;1. 斜体和粗体&lt;/h3&gt;&lt;p&gt;使用 一个&lt;em&gt;号 和 2个*&lt;/em&gt;号 表示斜体和粗体。&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;p&gt;这是 &lt;em&gt;斜体&lt;/em&gt;，这是 &lt;strong&gt;粗体&lt;/strong&gt;。&lt;/p&gt;
    
    </summary>
    
      <category term="Editor" scheme="http://lucylc.com/categories/Editor/"/>
    
    
      <category term="Markdown" scheme="http://lucylc.com/tags/Markdown/"/>
    
  </entry>
  
  <entry>
    <title>Cmd Markdown 编辑阅读器</title>
    <link href="http://lucylc.com/Editor/2017/02/20/Cmd%20Markdown.html"/>
    <id>http://lucylc.com/Editor/2017/02/20/Cmd Markdown.html</id>
    <published>2017-02-20T03:29:58.000Z</published>
    <updated>2017-08-20T10:15:40.944Z</updated>
    
    <content type="html"><![CDATA[<h1 id="欢迎使用-Cmd-Markdown-编辑阅读器"><a href="#欢迎使用-Cmd-Markdown-编辑阅读器" class="headerlink" title="欢迎使用 Cmd Markdown 编辑阅读器"></a>欢迎使用 Cmd Markdown 编辑阅读器</h1><hr>
<p>我们理解您需要更便捷更高效的工具记录思想，整理笔记、知识，并将其中承载的价值传播给他人，<strong>Cmd Markdown</strong> 是我们给出的答案 —— 我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown：</p>
<blockquote>
<ul>
<li>整理知识，学习笔记</li>
<li>发布日记，杂文，所见所想</li>
<li>撰写发布技术文稿（代码支持）</li>
<li>撰写发布学术论文（LaTeX 公式支持）</li>
</ul>
</blockquote>
<a id="more"></a>
<p><img src="https://www.zybuluo.com/static/img/logo.png" alt="cmd-markdown-logo"></p>
<p>除了您现在看到的这个 Cmd Markdown 在线版本，您还可以前往以下网址下载：</p>
<h3 id="Windows-Mac-Linux-全平台客户端"><a href="#Windows-Mac-Linux-全平台客户端" class="headerlink" title="Windows/Mac/Linux 全平台客户端"></a><a href="https://www.zybuluo.com/cmd/" target="_blank" rel="external">Windows/Mac/Linux 全平台客户端</a></h3><blockquote>
<p>请保留此份 Cmd Markdown 的欢迎稿兼使用说明，如需撰写新稿件，点击顶部工具栏右侧的 <i class="icon-file"></i> <strong>新文稿</strong> 或者使用快捷键 <code>Ctrl+Alt+N</code>。</p>
</blockquote>
<hr>
<h2 id="什么是-Markdown"><a href="#什么是-Markdown" class="headerlink" title="什么是 Markdown"></a>什么是 Markdown</h2><p>Markdown 是一种方便记忆、书写的纯文本标记语言，用户可以使用这些标记符号以最小的输入代价生成极富表现力的文档：譬如您正在阅读的这份文档。它使用简单的符号标记不同的标题，分割不同的段落，<strong>粗体</strong> 或者 <em>斜体</em> 某些文字，更棒的是，它还可以</p>
<h3 id="1-制作一份待办事宜-Todo-列表"><a href="#1-制作一份待办事宜-Todo-列表" class="headerlink" title="1. 制作一份待办事宜 Todo 列表"></a>1. 制作一份待办事宜 <a href="https://www.zybuluo.com/mdeditor?url=https://www.zybuluo.com/static/editor/md-help.markdown#13-待办事宜-todo-列表" target="_blank" rel="external">Todo 列表</a></h3><ul>
<li>[ ] 支持以 PDF 格式导出文稿</li>
<li>[ ] 改进 Cmd 渲染算法，使用局部渲染技术提高渲染效率</li>
<li>[x] 新增 Todo 列表功能</li>
<li>[x] 修复 LaTex 公式渲染问题</li>
<li>[x] 新增 LaTex 公式编号功能</li>
</ul>
<h3 id="2-书写一个质能守恒公式-LaTeX"><a href="#2-书写一个质能守恒公式-LaTeX" class="headerlink" title="2. 书写一个质能守恒公式[^LaTeX]"></a>2. 书写一个质能守恒公式[^LaTeX]</h3><p>$$E=mc^2$$</p>
<h3 id="3-高亮一段代码-code"><a href="#3-高亮一段代码-code" class="headerlink" title="3. 高亮一段代码[^code]"></a>3. 高亮一段代码[^code]</h3><figure class="highlight python"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div></pre></td><td class="code"><pre><div class="line"><span class="meta">@requires_authorization</span></div><div class="line"><span class="class"><span class="keyword">class</span> <span class="title">SomeClass</span>:</span></div><div class="line">    <span class="keyword">pass</span></div><div class="line"></div><div class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</div><div class="line">    <span class="comment"># A comment</span></div><div class="line">    <span class="keyword">print</span> <span class="string">'hello world'</span></div></pre></td></tr></table></figure>
<h3 id="4-高效绘制-流程图"><a href="#4-高效绘制-流程图" class="headerlink" title="4. 高效绘制 流程图"></a>4. 高效绘制 <a href="https://www.zybuluo.com/mdeditor?url=https://www.zybuluo.com/static/editor/md-help.markdown#7-流程图" target="_blank" rel="external">流程图</a></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div></pre></td><td class="code"><pre><div class="line">st=&gt;start: Start</div><div class="line">op=&gt;operation: Your Operation</div><div class="line">cond=&gt;condition: Yes or No?</div><div class="line">e=&gt;end</div><div class="line"></div><div class="line">st-&gt;op-&gt;cond</div><div class="line">cond(yes)-&gt;e</div><div class="line">cond(no)-&gt;op</div></pre></td></tr></table></figure>
<h3 id="5-高效绘制-序列图"><a href="#5-高效绘制-序列图" class="headerlink" title="5. 高效绘制 序列图"></a>5. 高效绘制 <a href="https://www.zybuluo.com/mdeditor?url=https://www.zybuluo.com/static/editor/md-help.markdown#8-序列图" target="_blank" rel="external">序列图</a></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">Alice-&gt;Bob: Hello Bob, how are you?</div><div class="line">Note right of Bob: Bob thinks</div><div class="line">Bob--&gt;Alice: I am good thanks!</div></pre></td></tr></table></figure>
<h3 id="6-高效绘制-甘特图"><a href="#6-高效绘制-甘特图" class="headerlink" title="6. 高效绘制 甘特图"></a>6. 高效绘制 <a href="https://www.zybuluo.com/mdeditor?url=https://www.zybuluo.com/static/editor/md-help.markdown#9-甘特图" target="_blank" rel="external">甘特图</a></h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div></pre></td><td class="code"><pre><div class="line">title 项目开发流程</div><div class="line">section 项目确定</div><div class="line">    需求分析       :a1, 2016-06-22, 3d</div><div class="line">    可行性报告     :after a1, 5d</div><div class="line">    概念验证       : 5d</div><div class="line">section 项目实施</div><div class="line">    概要设计      :2016-07-05  , 5d</div><div class="line">    详细设计      :2016-07-08, 10d</div><div class="line">    编码          :2016-07-15, 10d</div><div class="line">    测试          :2016-07-22, 5d</div><div class="line">section 发布验收</div><div class="line">    发布: 2d</div><div class="line">    验收: 3d</div></pre></td></tr></table></figure>
<h3 id="7-绘制表格"><a href="#7-绘制表格" class="headerlink" title="7. 绘制表格"></a>7. 绘制表格</h3><table>
<thead>
<tr>
<th>项目</th>
<th style="text-align:right">价格</th>
<th style="text-align:center">数量</th>
</tr>
</thead>
<tbody>
<tr>
<td>计算机</td>
<td style="text-align:right">\$1600</td>
<td style="text-align:center">5</td>
</tr>
<tr>
<td>手机</td>
<td style="text-align:right">\$12</td>
<td style="text-align:center">12</td>
</tr>
<tr>
<td>管线</td>
<td style="text-align:right">\$1</td>
<td style="text-align:center">234</td>
</tr>
</tbody>
</table>
<h3 id="8-更详细语法说明"><a href="#8-更详细语法说明" class="headerlink" title="8. 更详细语法说明"></a>8. 更详细语法说明</h3><p>想要查看更详细的语法说明，可以参考我们准备的 <a href="https://www.zybuluo.com/mdeditor?url=https://www.zybuluo.com/static/editor/md-help.markdown" target="_blank" rel="external">Cmd Markdown 简明语法手册</a>，进阶用户可以参考 <a href="https://www.zybuluo.com/mdeditor?url=https://www.zybuluo.com/static/editor/md-help.markdown#cmd-markdown-高阶语法手册" target="_blank" rel="external">Cmd Markdown 高阶语法手册</a> 了解更多高级功能。</p>
<p>总而言之，不同于其它 <em>所见即所得</em> 的编辑器：你只需使用键盘专注于书写文本内容，就可以生成印刷级的排版格式，省却在键盘和工具栏之间来回切换，调整内容和格式的麻烦。<strong>Markdown 在流畅的书写和印刷级的阅读体验之间找到了平衡。</strong> 目前它已经成为世界上最大的技术分享网站 GitHub 和 技术问答网站 StackOverFlow 的御用书写格式。</p>
<hr>
<h2 id="什么是-Cmd-Markdown"><a href="#什么是-Cmd-Markdown" class="headerlink" title="什么是 Cmd Markdown"></a>什么是 Cmd Markdown</h2><p>您可以使用很多工具书写 Markdown，但是 Cmd Markdown 是这个星球上我们已知的、最好的 Markdown 工具——没有之一 ：）因为深信文字的力量，所以我们和你一样，对流畅书写，分享思想和知识，以及阅读体验有极致的追求，我们把对于这些诉求的回应整合在 Cmd Markdown，并且一次，两次，三次，乃至无数次地提升这个工具的体验，最终将它演化成一个 <strong>编辑/发布/阅读</strong> Markdown 的在线平台——您可以在任何地方，任何系统/设备上管理这里的文字。</p>
<h3 id="1-实时同步预览"><a href="#1-实时同步预览" class="headerlink" title="1. 实时同步预览"></a>1. 实时同步预览</h3><p>我们将 Cmd Markdown 的主界面一分为二，左边为<strong>编辑区</strong>，右边为<strong>预览区</strong>，在编辑区的操作会实时地渲染到预览区方便查看最终的版面效果，并且如果你在其中一个区拖动滚动条，我们有一个巧妙的算法把另一个区的滚动条同步到等价的位置，超酷！</p>
<h3 id="2-编辑工具栏"><a href="#2-编辑工具栏" class="headerlink" title="2. 编辑工具栏"></a>2. 编辑工具栏</h3><p>也许您还是一个 Markdown 语法的新手，在您完全熟悉它之前，我们在 <strong>编辑区</strong> 的顶部放置了一个如下图所示的工具栏，您可以使用鼠标在工具栏上调整格式，不过我们仍旧鼓励你使用键盘标记格式，提高书写的流畅度。</p>
<p><img src="https://www.zybuluo.com/static/img/toolbar-editor.png" alt="tool-editor"></p>
<h3 id="3-编辑模式"><a href="#3-编辑模式" class="headerlink" title="3. 编辑模式"></a>3. 编辑模式</h3><p>完全心无旁骛的方式编辑文字：点击 <strong>编辑工具栏</strong> 最右侧的拉伸按钮或者按下 <code>Ctrl + M</code>，将 Cmd Markdown 切换到独立的编辑模式，这是一个极度简洁的写作环境，所有可能会引起分心的元素都已经被挪除，超清爽！</p>
<h3 id="4-实时的云端文稿"><a href="#4-实时的云端文稿" class="headerlink" title="4. 实时的云端文稿"></a>4. 实时的云端文稿</h3><p>为了保障数据安全，Cmd Markdown 会将您每一次击键的内容保存至云端，同时在 <strong>编辑工具栏</strong> 的最右侧提示 <code>已保存</code> 的字样。无需担心浏览器崩溃，机器掉电或者地震，海啸——在编辑的过程中随时关闭浏览器或者机器，下一次回到 Cmd Markdown 的时候继续写作。</p>
<h3 id="5-离线模式"><a href="#5-离线模式" class="headerlink" title="5. 离线模式"></a>5. 离线模式</h3><p>在网络环境不稳定的情况下记录文字一样很安全！在您写作的时候，如果电脑突然失去网络连接，Cmd Markdown 会智能切换至离线模式，将您后续键入的文字保存在本地，直到网络恢复再将他们传送至云端，即使在网络恢复前关闭浏览器或者电脑，一样没有问题，等到下次开启 Cmd Markdown 的时候，她会提醒您将离线保存的文字传送至云端。简而言之，我们尽最大的努力保障您文字的安全。</p>
<h3 id="6-管理工具栏"><a href="#6-管理工具栏" class="headerlink" title="6. 管理工具栏"></a>6. 管理工具栏</h3><p>为了便于管理您的文稿，在 <strong>预览区</strong> 的顶部放置了如下所示的 <strong>管理工具栏</strong>：</p>
<p><img src="https://www.zybuluo.com/static/img/toolbar-manager.jpg" alt="tool-manager"></p>
<p>通过管理工具栏可以：</p>
<p><i class="icon-share"></i> 发布：将当前的文稿生成固定链接，在网络上发布，分享
<i class="icon-file"></i> 新建：开始撰写一篇新的文稿
<i class="icon-trash"></i> 删除：删除当前的文稿
<i class="icon-cloud"></i> 导出：将当前的文稿转化为 Markdown 文本或者 Html 格式，并导出到本地
<i class="icon-reorder"></i> 列表：所有新增和过往的文稿都可以在这里查看、操作
<i class="icon-pencil"></i> 模式：切换 普通/Vim/Emacs 编辑模式</p>
<h3 id="7-阅读工具栏"><a href="#7-阅读工具栏" class="headerlink" title="7. 阅读工具栏"></a>7. 阅读工具栏</h3><p><img src="https://www.zybuluo.com/static/img/toolbar-reader.jpg" alt="tool-manager"></p>
<p>通过 <strong>预览区</strong> 右上角的 <strong>阅读工具栏</strong>，可以查看当前文稿的目录并增强阅读体验。</p>
<p>工具栏上的五个图标依次为：</p>
<p><i class="icon-list"></i> 目录：快速导航当前文稿的目录结构以跳转到感兴趣的段落
<i class="icon-chevron-sign-left"></i> 视图：互换左边编辑区和右边预览区的位置
<i class="icon-adjust"></i> 主题：内置了黑白两种模式的主题，试试 <strong>黑色主题</strong>，超炫！
<i class="icon-desktop"></i> 阅读：心无旁骛的阅读模式提供超一流的阅读体验
<i class="icon-fullscreen"></i> 全屏：简洁，简洁，再简洁，一个完全沉浸式的写作和阅读环境</p>
<h3 id="8-阅读模式"><a href="#8-阅读模式" class="headerlink" title="8. 阅读模式"></a>8. 阅读模式</h3><p>在 <strong>阅读工具栏</strong> 点击 <i class="icon-desktop"></i> 或者按下 <code>Ctrl+Alt+M</code> 随即进入独立的阅读模式界面，我们在版面渲染上的每一个细节：字体，字号，行间距，前背景色都倾注了大量的时间，努力提升阅读的体验和品质。</p>
<h3 id="9-标签、分类和搜索"><a href="#9-标签、分类和搜索" class="headerlink" title="9. 标签、分类和搜索"></a>9. 标签、分类和搜索</h3><p>在编辑区任意行首位置输入以下格式的文字可以标签当前文档：</p>
<p>标签： 未分类</p>
<p>标签以后的文稿在【文件列表】（Ctrl+Alt+F）里会按照标签分类，用户可以同时使用键盘或者鼠标浏览查看，或者在【文件列表】的搜索文本框内搜索标题关键字过滤文稿，如下图所示：</p>
<p><img src="https://www.zybuluo.com/static/img/file-list.png" alt="file-list"></p>
<h3 id="10-文稿发布和分享"><a href="#10-文稿发布和分享" class="headerlink" title="10. 文稿发布和分享"></a>10. 文稿发布和分享</h3><p>在您使用 Cmd Markdown 记录，创作，整理，阅读文稿的同时，我们不仅希望它是一个有力的工具，更希望您的思想和知识通过这个平台，连同优质的阅读体验，将他们分享给有相同志趣的人，进而鼓励更多的人来到这里记录分享他们的思想和知识，尝试点击 <i class="icon-share"></i> (Ctrl+Alt+P) 发布这份文档给好友吧！</p>
<hr>
<p>再一次感谢您花费时间阅读这份欢迎稿，点击 <i class="icon-file"></i> (Ctrl+Alt+N) 开始撰写新的文稿吧！祝您在这里记录、阅读、分享愉快！</p>
<p>作者 <a href="http://weibo.com/ghosert" target="_blank" rel="external">@ghosert</a>
2016 年 07月 07日</p>
<p>[^LaTeX]: 支持 <strong>LaTeX</strong> 编辑显示支持，例如：$\sum_{i=1}^n a_i=0$， 访问 <a href="http://meta.math.stackexchange.com/questions/5020/mathjax-basic-tutorial-and-quick-reference" target="_blank" rel="external">MathJax</a> 参考更多使用方法。</p>
<p>[^code]: 代码高亮功能支持包括 Java, Python, JavaScript 在内的，<strong>四十一</strong>种主流编程语言。</p>
<hr>
<p>欢迎转载，但转载请注明来自”勿忘初心”的博客，并保持转载后文章内容的完整性。</p>
<p>本文链接：<a href="http://lucylc.com/Editor/2017/02/20/Cmd">http://lucylc.com/Editor/2017/02/20/Cmd</a> Markdown.html</p>
]]></content>
    
    <summary type="html">
    
      &lt;h1 id=&quot;欢迎使用-Cmd-Markdown-编辑阅读器&quot;&gt;&lt;a href=&quot;#欢迎使用-Cmd-Markdown-编辑阅读器&quot; class=&quot;headerlink&quot; title=&quot;欢迎使用 Cmd Markdown 编辑阅读器&quot;&gt;&lt;/a&gt;欢迎使用 Cmd Markdown 编辑阅读器&lt;/h1&gt;&lt;hr&gt;
&lt;p&gt;我们理解您需要更便捷更高效的工具记录思想，整理笔记、知识，并将其中承载的价值传播给他人，&lt;strong&gt;Cmd Markdown&lt;/strong&gt; 是我们给出的答案 —— 我们为记录思想和分享知识提供更专业的工具。 您可以使用 Cmd Markdown：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;整理知识，学习笔记&lt;/li&gt;
&lt;li&gt;发布日记，杂文，所见所想&lt;/li&gt;
&lt;li&gt;撰写发布技术文稿（代码支持）&lt;/li&gt;
&lt;li&gt;撰写发布学术论文（LaTeX 公式支持）&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
    
    </summary>
    
      <category term="Editor" scheme="http://lucylc.com/categories/Editor/"/>
    
    
      <category term="Markdown" scheme="http://lucylc.com/tags/Markdown/"/>
    
  </entry>
  
</feed>
