加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
index.html 74.52 KB
一键复制 编辑 原始数据 按行查看 历史
ljym-246810 提交于 2016-06-01 11:49 . Site updated: 2016-06-01 11:49:04
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>李玉明</title>
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
<meta name="description">
<meta property="og:type" content="website">
<meta property="og:title" content="李玉明">
<meta property="og:url" content="http://yoursite.com/index.html">
<meta property="og:site_name" content="李玉明">
<meta property="og:description">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="李玉明">
<meta name="twitter:description">
<link rel="alternative" href="/atom.xml" title="李玉明" type="application/atom+xml">
<link rel="icon" href="/img/favicon.png">
<link rel="stylesheet" href="//cdn.bootcss.com/animate.css/3.5.0/animate.min.css">
<link rel="stylesheet" href="/css/style.css">
<link rel="stylesheet" href="/font-awesome/css/font-awesome.min.css">
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
<link rel="stylesheet" href="/fancybox/jquery.fancybox.css">
<!-- 加载特效 -->
<script src="/js/pace.js"></script>
<link href="/css/pace/pace-theme-flash.css" rel="stylesheet" />
<script>
var yiliaConfig = {
fancybox: true,
animate: true,
isHome: true,
isPost: false,
isArchive: false,
isTag: false,
isCategory: false,
open_in_new: false
}
</script>
</head>
<body>
<div id="container">
<div class="left-col">
<div class="overlay"></div>
<div class="intrude-less">
<header id="header" class="inner">
<a href="/" class="profilepic">
<img lazy-src="/img/head.jpg" class="js-avatar">
</a>
<hgroup>
<h1 class="header-author"><a href="/">liyuming</a></h1>
</hgroup>
<div id="switch-btn" class="switch-btn">
<div class="icon">
<div class="icon-ctn">
<div class="icon-wrap icon-house" data-idx="0">
<div class="birdhouse"></div>
<div class="birdhouse_holes"></div>
</div>
<div class="icon-wrap icon-ribbon hide" data-idx="1">
<div class="ribbon"></div>
</div>
<div class="icon-wrap icon-link hide" data-idx="2">
<div class="loopback_l"></div>
<div class="loopback_r"></div>
</div>
<div class="icon-wrap icon-me hide" data-idx="3">
<div class="user"></div>
<div class="shoulder"></div>
</div>
</div>
</div>
<div class="tips-box hide">
<div class="tips-arrow"></div>
<ul class="tips-inner">
<li>菜单</li>
<li>标签</li>
<li>友情链接</li>
<li>关于我</li>
</ul>
</div>
</div>
<div id="switch-area" class="switch-area">
<div class="switch-wrap">
<section class="switch-part switch-part1">
<nav class="header-menu">
<ul>
<li><a href="/">博客首页</a></li>
<li><a href="/archives">作品展示</a></li>
<li><a href="/">随笔</a></li>
<li><a href="/archives">静心阅读</a></li>
</ul>
</nav>
<nav class="header-nav">
<ul class="social">
<a class="fl mail" target="_blank" href="http://my.csdn.net/github_35151727" title="mail">mail</a>
<a class="fl github" target="_blank" href="https://github.com/ljym-246810" title="github">github</a>
<a class="fl zhihu" target="_blank" href="https://www.zhihu.com/people/li-yu-ming122" title="zhihu">zhihu</a>
<a class="fl weibo" target="_blank" href="http://weibo.com/3888047260" title="weibo">weibo</a>
<a class="fl google" target="_blank" href="http://weibo.com/u/5089556680?is_all=1" title="google">google</a>
<a class="fl twitter" target="_blank" href="https://wx.qq.com/" title="twitter">twitter</a>
<a class="fl facebook" target="_blank" href="http://t.qq.com/liujia1046408090?setTheme=1" title="facebook">facebook</a>
<a class="fl rss" target="_blank" href="http://www.renren.com/860433942#nogo" title="rss">rss</a>
</ul>
</nav>
</section>
<section class="switch-part switch-part2">
<div class="widget tagcloud" id="js-tagcloud">
</div>
</section>
<section class="switch-part switch-part3">
<div id="js-friends">
<a target="_blank" class="main-nav-link switch-friends-link" href="http://MOxFIVE.github.io/">MOxFIVE</a>
<a target="_blank" class="main-nav-link switch-friends-link" href="http://www.vsay.cn/">DoubleV</a>
<a target="_blank" class="main-nav-link switch-friends-link" href="http://www.ccwebsite.com/">兮兮</a>
<a target="_blank" class="main-nav-link switch-friends-link" href="http://blog.dandyweng.com/">翁天信</a>
<a target="_blank" class="main-nav-link switch-friends-link" href="http://www.plqblog.com/views/index.php">潘利强</a>
<a target="_blank" class="main-nav-link switch-friends-link" href="http://www.hankin.cn/">hankin</a>
<a target="_blank" class="main-nav-link switch-friends-link" href="http://blog.waydrow.com/">waydrow</a>
<a target="_blank" class="main-nav-link switch-friends-link" href="http://silenceport.com">喻南航</a>
<a target="_blank" class="main-nav-link switch-friends-link" href="http://hubojing.coding.me/">胡博靖</a>
<a target="_blank" class="main-nav-link switch-friends-link" href="http://blog.lzkzhiliang.com/">zhiliang</a>
<a target="_blank" class="main-nav-link switch-friends-link" href="http://weilai5432.github.io/">未来部落</a>
<a target="_blank" class="main-nav-link switch-friends-link" href="http://blog.qiujinfeng.com/">qiujinfeng</a>
</div>
</section>
<section class="switch-part switch-part4">
<div id="js-aboutme">编程是一种单调的生活,因此程序员比普通人需要更多的关怀,更多的友情。</div>
</section>
</div>
</div>
</header>
</div>
</div>
<div class="mid-col">
<nav id="mobile-nav">
<div class="overlay">
<div class="slider-trigger"></div>
<h1 class="header-author js-mobile-header hide"><a href="/" title="回到主页">liyuming</a></h1>
</div>
<div class="intrude-less">
<header id="header" class="inner">
<a href="/" class="profilepic">
<img lazy-src="/img/head.jpg" class="js-avatar">
</a>
<hgroup>
<h1 class="header-author"><a href="/" title="回到主页">liyuming</a></h1>
</hgroup>
<nav class="header-menu">
<ul>
<li><a href="/">博客首页</a></li>
<li><a href="/archives">作品展示</a></li>
<li><a href="/">随笔</a></li>
<li><a href="/archives">静心阅读</a></li>
<div class="clearfix"></div>
</ul>
</nav>
<nav class="header-nav">
<div class="social">
<a class="mail" target="_blank" href="http://my.csdn.net/github_35151727" title="mail">mail</a>
<a class="github" target="_blank" href="https://github.com/ljym-246810" title="github">github</a>
<a class="zhihu" target="_blank" href="https://www.zhihu.com/people/li-yu-ming122" title="zhihu">zhihu</a>
<a class="weibo" target="_blank" href="http://weibo.com/3888047260" title="weibo">weibo</a>
<a class="google" target="_blank" href="http://weibo.com/u/5089556680?is_all=1" title="google">google</a>
<a class="twitter" target="_blank" href="https://wx.qq.com/" title="twitter">twitter</a>
<a class="facebook" target="_blank" href="http://t.qq.com/liujia1046408090?setTheme=1" title="facebook">facebook</a>
<a class="rss" target="_blank" href="http://www.renren.com/860433942#nogo" title="rss">rss</a>
</div>
</nav>
</header>
</div>
</nav>
<div class="body-wrap">
<article id="post-Web前端面试题目汇总" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/05/28/Web前端面试题目汇总/" class="article-date">
<time datetime="2016-05-28T01:06:30.000Z" itemprop="datePublished">2016-05-28</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/05/28/Web前端面试题目汇总/">前端面试题</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h1 id="Web前端面试题目汇总"><a href="#Web前端面试题目汇总" class="headerlink" title="Web前端面试题目汇总"></a>Web前端面试题目汇总</h1><hr>
<p>以下是收集一些面试中经常会遇到的经典面试题以及自己面试过程中有一些未解决的问题,通过对知识的整理以及经验的总结,重新巩固自身的前端基础知识,如有错误或更好的答案,欢迎指正,水平有限,望各位不吝指教。<br>阅读目录:</p>
<ul>
<li><a href="http://www.cnblogs.com/bigboyLin/p/5272902.html#_label0" target="_blank" rel="external">HTML/CSS部分</a></li>
</ul>
<ul>
<li><a href="http://www.cnblogs.com/bigboyLin/p/5272902.html#_label1" target="_blank" rel="external">JavaScript部分</a></li>
</ul>
<ul>
<li><a href="http://www.cnblogs.com/bigboyLin/p/5272902.html#_label2" target="_blank" rel="external">HTTP</a></li>
</ul>
<ul>
<li><a href="http://www.cnblogs.com/bigboyLin/p/5272902.html#_label3" target="_blank" rel="external">算法相关</a></li>
</ul>
<ul>
<li><a href="http://www.cnblogs.com/bigboyLin/p/5272902.html#_label4" target="_blank" rel="external">Web安全</a></li>
</ul>
<ul>
<li><a href="http://www.cnblogs.com/bigboyLin/p/5272902.html#_label5" target="_blank" rel="external">前端性能</a></li>
</ul>
<ul>
<li><a href="http://www.cnblogs.com/bigboyLin/p/5272902.html#_label6" target="_blank" rel="external">前端架构</a></li>
</ul>
<ul>
<li><a href="http://www.cnblogs.com/bigboyLin/p/5272902.html#_label7" target="_blank" rel="external">正则表达式</a></li>
</ul>
<ul>
<li><a href="http://www.cnblogs.com/bigboyLin/p/5272902.html#_label8" target="_blank" rel="external">职业规划</a></li>
</ul>
<hr>
<h2 id="HTML-CSS部分"><a href="#HTML-CSS部分" class="headerlink" title="HTML/CSS部分"></a><strong>HTML/CSS部分</strong></h2><blockquote>
<p>1、什么是盒子模型?</p>
</blockquote>
<p>在网页中,一个元素占有空间的大小由几个部分构成,其中包括元素的内容(content),元素的内边距(padding),元素的边框(border),元素的外边距(margin)四个部分。这四个部分占有的空间中,有的部分可以显示相应的内容,而有的部分只用来分隔相邻的区域或区域。4个部分一起构成了css中元素的盒模型。</p>
<blockquote>
<p>2、行内元素有哪些?块级元素有哪些? 空(void)元素有那些?</p>
</blockquote>
<p>行内元素:a、b、span、img、input、strong、select、label、em、button、textarea<br>块级元素:div、ul、li、dl、dt、dd、p、h1-h6、blockquote<br>空元素:即没有内容的HTML元素,例如:br、meta、hr、link、input、img</p>
<blockquote>
<p>3、CSS实现垂直水平居中</p>
</blockquote>
<p>一道经典的问题,实现方法有很多种,以下是其中一种实现:<br>HTML结构:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&lt;div class=&quot;wrapper&quot;&gt;</span><br><span class="line"> &lt;div class=&quot;content&quot;&gt;&lt;/div&gt;</span><br><span class="line">&lt;/div&gt;</span><br></pre></td></tr></table></figure></p>
<p>CSS:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"> .wrapper&#123;position:relative;&#125;</span><br><span class="line"> .content&#123;</span><br><span class="line"> background-color:#6699FF;</span><br><span class="line"> width:200px;</span><br><span class="line"> height:200px;</span><br><span class="line"> position: absolute; //父元素需要相对定位</span><br><span class="line"> top: 50%;</span><br><span class="line"> left: 50%;</span><br><span class="line"> margin-top:-100px ; //二分之一的height,width</span><br><span class="line"> margin-left: -100px;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure></p>
<blockquote>
<p>4、简述一下src与href的区别</p>
</blockquote>
<p>href 是指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,用于超链接。<br>src是指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置;在请求src资源时会将其指向的资源下载并应用到文档内,例如js脚本,img图片和frame等元素。当浏览器解析到该元素时,会暂停其他资源的下载和处理,直到将该资源加载、编译、执行完毕,图片和框架等元素也如此,类似于将所指向资源嵌入当前标签内。这也是为什么将js脚本放在底部而不是头部。</p>
<blockquote>
<p>5、什么是CSS Hack?</p>
</blockquote>
<p>一般来说是针对不同的浏览器写不同的CSS,就是 CSS Hack。<br>IE浏览器Hack一般又分为三种,条件Hack、属性级Hack、选择符Hack(详细参考CSS文档:css文档)。例如:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"> // 1、条件Hack</span><br><span class="line">&lt;!--[if IE]&gt;</span><br><span class="line"> &lt;style&gt;</span><br><span class="line"> .test&#123;color:red;&#125;</span><br><span class="line"> &lt;/style&gt;</span><br><span class="line">&lt;![endif]--&gt;</span><br><span class="line">// 2、属性Hack</span><br><span class="line"> .test&#123;</span><br><span class="line"> color:#090\9; /* For IE8+ */</span><br><span class="line"> *color:#f00; /* For IE7 and earlier */</span><br><span class="line"> _color:#ff0; /* For IE6 and earlier */</span><br><span class="line"> &#125;</span><br><span class="line">// 3、选择符Hack</span><br><span class="line"> * html .test&#123;color:#090;&#125; /* For IE6 and earlier */</span><br><span class="line"> * + html .test&#123;color:#ff0;&#125; /* For IE7 */</span><br></pre></td></tr></table></figure></p>
<blockquote>
<p>6、简述同步和异步的区别</p>
</blockquote>
<p>同步是阻塞模式,异步是非阻塞模式。<br>同步就是指一个进程在执行某个请求的时候,若该请求需要一段时间才能返回信息,那么这个进程将会一直等待下去,直到收到返回信息才继续执行下去;<br>异步是指进程不需要一直等下去,而是继续执行下面的操作,不管其他进程的状态。当有消息返回时系统会通知进程进行处理,这样可以提高执行的效率</p>
<blockquote>
<p>7、px和em的区别</p>
</blockquote>
<p>px和em都是长度单位,区别是,px的值是固定的,指定是多少就是多少,计算比较容易。em得值不是固定的,并且em会继承父级元素的字体大小。<br>浏览器的默认字体高都是16px。所以未经调整的浏览器都符合: 1em=16px。那么12px=0.75em, 10px=0.625em</p>
<blockquote>
<p>8、什么叫优雅降级和渐进增强?</p>
</blockquote>
<p>渐进增强 progressive enhancement:<br>针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果、交互等改进和追加功能达到更好的用户体验。<br>优雅降级 graceful degradation:<br>一开始就构建完整的功能,然后再针对低版本浏览器进行兼容。<br>区别:<br>a. 优雅降级是从复杂的现状开始,并试图减少用户体验的供给<br>b. 渐进增强则是从一个非常基础的,能够起作用的版本开始,并不断扩充,以适应未来环境的需要<br>c. 降级(功能衰减)意味着往回看;而渐进增强则意味着朝前看,同时保证其根基处于安全地带</p>
<blockquote>
<p>9、浏览器的内核分别是什么?</p>
</blockquote>
<p>IE: trident内核<br>Firefox:gecko内核<br>Safari:webkit内核<br>Opera:以前是presto内核,Opera现已改用Google Chrome的Blink内核<br>Chrome:Blink(基于webkit,Google与Opera Software共同开发)</p>
<hr>
<h2 id="JavaScript部分"><a href="#JavaScript部分" class="headerlink" title="JavaScript部分"></a><strong>JavaScript部分</strong></h2><blockquote>
<p>怎样添加、移除、移动、复制、创建和查找节点?</p>
</blockquote>
<p>1)创建新节点<br>createDocumentFragment() //创建一个DOM片段<br>createElement() //创建一个具体的元素<br>createTextNode() //创建一个文本节点<br>2)添加、移除、替换、插入<br>appendChild() //添加<br>removeChild() //移除<br>replaceChild() //替换<br>insertBefore() //插入<br>3)查找<br>getElementsByTagName() //通过标签名称<br>getElementsByName() //通过元素的Name属性的值<br>getElementById() //通过元素Id,唯一性</p>
<blockquote>
<p>实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number、String、Object、Array、Boolean)进行值复制。</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"> /**</span><br><span class="line"> * 对象克隆</span><br><span class="line"> * 支持基本数据类型及对象</span><br><span class="line"> * 递归方法</span><br><span class="line"> */</span><br><span class="line">function clone(obj) &#123;</span><br><span class="line"> var o;</span><br><span class="line"> switch (typeof obj) &#123;</span><br><span class="line"> case &quot;undefined&quot;:</span><br><span class="line"> break;</span><br><span class="line"> case &quot;string&quot;:</span><br><span class="line"> o = obj + &quot;&quot;;</span><br><span class="line"> break;</span><br><span class="line"> case &quot;number&quot;:</span><br><span class="line"> o = obj - 0;</span><br><span class="line"> break;</span><br><span class="line"> case &quot;boolean&quot;:</span><br><span class="line"> o = obj;</span><br><span class="line"> break;</span><br><span class="line"> case &quot;object&quot;: // object 分为两种情况 对象(Object)或数组(Array)</span><br><span class="line"> if (obj === null) &#123;</span><br><span class="line"> o = null;</span><br><span class="line"> &#125; else &#123;</span><br><span class="line"> if (Object.prototype.toString.call(obj).slice(8, -1) === &quot;Array&quot;) &#123;</span><br><span class="line"> o = [];</span><br><span class="line"> for (var i = 0; i &lt; obj.length; i++) &#123;</span><br><span class="line"> o.push(clone(obj[i]));</span><br><span class="line"> &#125;</span><br><span class="line"> &#125; else &#123;</span><br><span class="line"> o = &#123;&#125;;</span><br><span class="line"> for (var k in obj) &#123;</span><br><span class="line"> o[k] = clone(obj[k]);</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> break;</span><br><span class="line"> default:</span><br><span class="line"> o = obj;</span><br><span class="line"> break;</span><br><span class="line"> &#125;</span><br><span class="line"> return o;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>如何消除一个数组里面重复的元素?</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">// 方法一:</span><br><span class="line">var arr1 =[1,2,2,2,3,3,3,4,5,6],</span><br><span class="line"> arr2 = [];</span><br><span class="line">for(var i = 0,len = arr1.length; i&lt; len; i++)&#123;</span><br><span class="line"> if(arr2.indexOf(arr1[i]) &lt; 0)&#123;</span><br><span class="line"> arr2.push(arr1[i]);</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br><span class="line">document.write(arr2); // 1,2,3,4,5,6</span><br></pre></td></tr></table></figure>
<blockquote>
<p>在Javascript中什么是伪数组?如何将伪数组转化为标准数组?</p>
</blockquote>
<p> 伪数组(类数组):无法直接调用数组方法或期望length属性有什么特殊的行为,但仍可以对真正数组遍历方法来遍历它们。典型的是函数的argument参数,还有像调用getElementsByTagName,document.childNodes之类的,它们都返回NodeList对象都属于伪数组。可以使用Array.prototype.slice.call(fakeArray)将数组转化为真正的Array对象</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">function log()&#123;</span><br><span class="line"> var args = Array.prototype.slice.call(arguments); </span><br><span class="line">//为了使用unshift数组方法,将argument转化为真正的数组</span><br><span class="line"> args.unshift(&apos;(app)&apos;);</span><br><span class="line"> </span><br><span class="line"> console.log.apply(console, args);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>段落引用Javascript中callee和caller的作用?</p>
</blockquote>
<p>caller是返回一个对函数的引用,该函数调用了当前函数;<br>callee是返回正在被执行的function函数,也就是所指定的function对象的正文</p>
<blockquote>
<p>请描述一下cookies,sessionStorage和localStorage的区别</p>
</blockquote>
<p>sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁。因此sessionStorage不是一种持久化的本地存储,仅仅是会话级别的存储。而localStorage用于持久化的本地存储,除非主动删除数据,否则数据是永远不会过期的。<br>web storage和cookie的区别<br>Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的。Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外cookie还需要指定作用域,不可以跨域调用。<br>除此之外,Web Storage拥有setItem,getItem,removeItem,clear等方法,不像cookie需要前端开发者自己封装setCookie,getCookie。但是Cookie也是不可以或缺的:Cookie的作用是与服务器进行交互,作为HTTP规范的一部分而存在 ,而Web Storage仅仅是为了在本地“存储”数据而生。</p>
<blockquote>
<p>统计字符串中字母个数或统计最多字母数。</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">var str = &quot;aaaabbbccccddfgh&quot;;</span><br><span class="line">var obj = &#123;&#125;;</span><br><span class="line">for(var i=0;i&lt;str.length;i++)&#123;</span><br><span class="line"> var v = str.charAt(i);</span><br><span class="line"> if(obj[v] &amp;&amp; obj[v].value == v)&#123;</span><br><span class="line"> obj[v].count = ++ obj[v].count;</span><br><span class="line"> &#125;else&#123;</span><br><span class="line"> obj[v] = &#123;&#125;;</span><br><span class="line"> obj[v].count = 1;</span><br><span class="line"> obj[v].value = v;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br><span class="line">for(key in obj)&#123;</span><br><span class="line"> document.write(obj[key].value +&apos;=&apos;+obj[key].count+&apos;&amp;nbsp;&apos;); // a=4 b=3 c=4 d=2 f=1 g=1 h=1 </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<hr>
<h2 id="HTTP"><a href="#HTTP" class="headerlink" title="HTTP"></a><strong>HTTP</strong></h2><blockquote>
<p>一次完整的HTTP事务是怎样的一个过程?</p>
</blockquote>
<p>基本流程:<br>a. 域名解析<br>b. 发起TCP的3次握手<br>c. 建立TCP连接后发起http请求<br>d. 服务器端响应http请求,浏览器得到html代码<br>e. 浏览器解析html代码,并请求html代码中的资源<br>f. 浏览器对页面进行渲染呈现给用户</p>
<blockquote>
<p>HTTP的状态码有哪些?<br>HTTPS是如何实现加密?</p>
</blockquote>
<hr>
<h2 id="算法相关"><a href="#算法相关" class="headerlink" title="算法相关"></a><strong>算法相关</strong></h2><blockquote>
<p>手写数组快速排序</p>
</blockquote>
<p>关于快排算法的详细说明,可以参考阮一峰老师的文章快速排序<br>“快速排序”的思想很简单,整个排序过程只需要三步:<br>(1)在数据集之中,选择一个元素作为”基准”(pivot)。<br>(2)所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。<br>(3)对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。<br>参考代码:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"> var quickSort = function(arr) &#123;</span><br><span class="line">  if (arr.length &lt;= 1) &#123; return arr; &#125;</span><br><span class="line">  var pivotIndex = Math.floor(arr.length / 2);</span><br><span class="line">  var pivot = arr.splice(pivotIndex, 1)[0];</span><br><span class="line">  var left = [];</span><br><span class="line">  var right = [];</span><br><span class="line">  for (var i = 0; i &lt; arr.length; i++)&#123;</span><br><span class="line">    if (arr[i] &lt; pivot) &#123;</span><br><span class="line">      left.push(arr[i]);</span><br><span class="line">    &#125; else &#123;</span><br><span class="line">      right.push(arr[i]);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  return quickSort(left).concat([pivot], quickSort(right));</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>JavaScript实现二分法查找</p>
</blockquote>
<p>二分法查找,也称折半查找,是一种在有序数组中查找特定元素的搜索算法。查找过程可以分为以下步骤:<br>(1)首先,从有序数组的中间的元素开始搜索,如果该元素正好是目标元素(即要查找的元素),则搜索过程结束,否则进行下一步。<br>(2)如果目标元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半区域查找,然后重复第一步的操作。<br>(3)如果某一步数组为空,则表示找不到目标元素。<br>参考代码:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">// 非递归算法</span><br><span class="line"> function binary_search(arr, key) &#123;</span><br><span class="line"> var low = 0,</span><br><span class="line"> high = arr.length - 1;</span><br><span class="line"> while(low &lt;= high)&#123;</span><br><span class="line"> var mid = parseInt((high + low) / 2);</span><br><span class="line"> if(key == arr[mid])&#123;</span><br><span class="line"> return mid;</span><br><span class="line"> &#125;else if(key &gt; arr[mid])&#123;</span><br><span class="line"> low = mid + 1;</span><br><span class="line"> &#125;else if(key &lt; arr[mid])&#123;</span><br><span class="line"> high = mid -1;</span><br><span class="line"> &#125;else&#123;</span><br><span class="line"> return -1;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;;</span><br><span class="line"> var arr = [1,2,3,4,5,6,7,8,9,10,11,23,44,86];</span><br><span class="line"> var result = binary_search(arr,10);</span><br><span class="line"> alert(result); // 9 返回目标元素的索引值</span><br></pre></td></tr></table></figure>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">// 递归算法</span><br><span class="line"> function binary_search(arr,low, high, key) &#123;</span><br><span class="line"> if (low &gt; high)&#123;</span><br><span class="line"> return -1;</span><br><span class="line"> &#125;</span><br><span class="line"> var mid = parseInt((high + low) / 2);</span><br><span class="line"> if(arr[mid] == key)&#123;</span><br><span class="line"> return mid;</span><br><span class="line"> &#125;else if (arr[mid] &gt; key)&#123;</span><br><span class="line"> high = mid - 1;</span><br><span class="line"> return binary_search(arr, low, high, key);</span><br><span class="line"> &#125;else if (arr[mid] &lt; key)&#123;</span><br><span class="line"> low = mid + 1;</span><br><span class="line"> return binary_search(arr, low, high, key);</span><br><span class="line"> &#125;</span><br><span class="line"> &#125;;</span><br><span class="line"> var arr = [1,2,3,4,5,6,7,8,9,10,11,23,44,86];</span><br><span class="line"> var result = binary_search(arr, 0, 13, 10);</span><br><span class="line"> alert(result); // 9 返回目标元素的索引值</span><br></pre></td></tr></table></figure>
<hr>
<h2 id="Web安全"><a href="#Web安全" class="headerlink" title="Web安全"></a><strong>Web安全</strong></h2><blockquote>
<p>你所了解到的Web攻击技术</p>
</blockquote>
<p>(1)XSS(Cross-Site Scripting,跨站脚本攻击):指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或者JavaScript进行的一种攻击。<br>(2)SQL注入攻击<br>(3)CSRF(Cross-Site Request Forgeries,跨站点请求伪造):指攻击者通过设置好的陷阱,强制对已完成的认证用户进行非预期的个人信息或设定信息等某些状态更新。</p>
<hr>
<h2 id="前端性能"><a href="#前端性能" class="headerlink" title="前端性能"></a><strong>前端性能</strong></h2><blockquote>
<p>如何优化图像、图像格式的区别</p>
<p>浏览器是如何渲染页面的?</p>
</blockquote>
<hr>
<h2 id="前端架构"><a href="#前端架构" class="headerlink" title="前端架构"></a><strong>前端架构</strong></h2><blockquote>
<p>对MVC、MVVM的理解</p>
</blockquote>
<hr>
<h2 id="正则表达式"><a href="#正则表达式" class="headerlink" title="正则表达式"></a><strong>正则表达式</strong></h2><blockquote>
<p>写一个function,清除字符串前后的空格。(兼容所有浏览器)</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">function trim(str) &#123;</span><br><span class="line"> if (str &amp;&amp; typeof str === &quot;string&quot;) &#123;</span><br><span class="line"> return str.replace(/(^\s*)|(\s*)$/g,&quot;&quot;); //去除前后空白符</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>
<blockquote>
<p>使用正则表达式验证邮箱格式</p>
</blockquote>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">var reg = /^(\w)+(\.\w+)*@(\w)+((\.\w&#123;2,3&#125;)&#123;1,3&#125;)$/;</span><br><span class="line">var email = &quot;example@qq.com&quot;;</span><br><span class="line">console.log(reg.test(email)); // true</span><br></pre></td></tr></table></figure>
<hr>
<h2 id="职业规划"><a href="#职业规划" class="headerlink" title="职业规划"></a><strong>职业规划</strong></h2><blockquote>
<p>对前端工程师这个职位你是怎么样理解的?</p>
</blockquote>
<p>a. 前端是最贴近用户的程序员,前端的能力就是能让产品从 90分进化到 100 分,甚至更好<br>b. 参与项目,快速高质量完成实现效果图,精确到1px;<br>c. 与团队成员,UI设计,产品经理的沟通;<br>d. 做好的页面结构,页面重构和用户体验;<br>e. 处理hack,兼容、写出优美的代码格式;<br>f. 针对服务器的优化、拥抱最新前端技术。</p>
</div>
<div class="article-info article-info-index">
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-chengxuyuan1md" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/05/27/chengxuyuan1md/" class="article-date">
<time datetime="2016-05-27T06:25:30.000Z" itemprop="datePublished">2016-05-27</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/05/27/chengxuyuan1md/">程序员爱情观</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h2 id="程序员爱情观:"><a href="#程序员爱情观:" class="headerlink" title="程序员爱情观:"></a>程序员爱情观:</h2><blockquote>
<h3 id="爱情就是死循环,一旦执行就陷进去了;爱上一个人,就是内存泄漏–你永远释放不了;真正爱上一个人的时候,那就是常量限定,永远不会改变;女朋友就是私有变量,只有我这个类才能调用;情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。"><a href="#爱情就是死循环,一旦执行就陷进去了;爱上一个人,就是内存泄漏–你永远释放不了;真正爱上一个人的时候,那就是常量限定,永远不会改变;女朋友就是私有变量,只有我这个类才能调用;情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。" class="headerlink" title="爱情就是死循环,一旦执行就陷进去了;爱上一个人,就是内存泄漏–你永远释放不了;真正爱上一个人的时候,那就是常量限定,永远不会改变;女朋友就是私有变量,只有我这个类才能调用;情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。"></a>爱情就是死循环,一旦执行就陷进去了;爱上一个人,就是内存泄漏–你永远释放不了;真正爱上一个人的时候,那就是常量限定,永远不会改变;女朋友就是私有变量,只有我这个类才能调用;情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。</h3></blockquote>
</div>
<div class="article-info article-info-index">
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-一道常被人轻视的前端JS面试题" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/05/27/一道常被人轻视的前端JS面试题/" class="article-date">
<time datetime="2016-05-27T06:25:30.000Z" itemprop="datePublished">2016-05-27</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/05/27/一道常被人轻视的前端JS面试题/">JS篇</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h1 id="一道常被人轻视的前端JS面试题"><a href="#一道常被人轻视的前端JS面试题" class="headerlink" title="一道常被人轻视的前端JS面试题"></a>一道常被人轻视的前端JS面试题</h1><p>标签(空格分隔): JavaScript</p>
<hr>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line">function Foo() &#123;</span><br><span class="line">getName = function () &#123; alert (1); &#125;;</span><br><span class="line">return this;</span><br><span class="line">&#125;</span><br><span class="line">Foo.getName = function () &#123;</span><br><span class="line">alert (2);</span><br><span class="line">&#125;;</span><br><span class="line">Foo.prototype.getName = function () &#123; </span><br><span class="line">alert (3);</span><br><span class="line">&#125;;</span><br><span class="line">var getName = function () &#123;</span><br><span class="line">alert (4);</span><br><span class="line">&#125;;</span><br><span class="line">function getName() &#123; </span><br><span class="line">alert (5);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">//请写出以下输出结果:</span><br><span class="line">Foo.getName();</span><br><span class="line">getName();</span><br><span class="line">Foo().getName();</span><br><span class="line">getName();</span><br><span class="line">new Foo.getName();</span><br><span class="line">new Foo().getName();</span><br><span class="line">new new Foo().getName();</span><br></pre></td></tr></table></figure>
<hr>
<p>答案是:</p>
<hr>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Foo.getName();//2</span><br><span class="line">getName();//4</span><br><span class="line">Foo().getName();//1</span><br><span class="line">getName();//1</span><br><span class="line">new Foo.getName();//2</span><br><span class="line">new Foo().getName();//3</span><br><span class="line">new new Foo().getName();//3</span><br></pre></td></tr></table></figure>
<hr>
<p>此题是我综合之前的开发经验以及遇到的JS各种坑汇集而成。此题涉及的知识点众多,包括变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级等等。</p>
<hr>
<h2 id="第一问"><a href="#第一问" class="headerlink" title="第一问"></a><strong>第一问</strong></h2><p>先看此题的上半部分做了什么,首先定义了一个叫Foo的函数,之后为Foo创建了一个叫getName的静态属性存储了一个匿名函数,之后为Foo的原型对象新创建了一个叫getName的匿名函数。之后又通过函数变量表达式创建了一个getName的函数,最后再声明一个叫getName函数。</p>
<p>第一问的 Foo.getName 自然是访问Foo函数上存储的静态属性,自然是2,没什么可说的。</p>
<hr>
<h2 id="第二问"><a href="#第二问" class="headerlink" title="第二问"></a><strong>第二问</strong></h2><p>第二问,直接调用 getName 函数。既然是直接调用那么就是访问当前上文作用域内的叫getName的函数,所以跟1 2 3都没什么关系。此题有无数面试者回答为5。此处有两个坑,一是变量声明提升,二是函数表达式。</p>
<h2 id="变量声明提升"><a href="#变量声明提升" class="headerlink" title="变量声明提升"></a>变量声明提升</h2><p>即所有声明变量或声明函数都会被提升到当前函数的顶部。<br>例如下代码:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">console.log(&apos;x&apos; in window);//true</span><br><span class="line"> var x;</span><br><span class="line"> x = 0;</span><br></pre></td></tr></table></figure></p>
<p>代码执行时js引擎会将声明语句提升至代码最上方,变为:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">var x;</span><br><span class="line"> console.log(&apos;x&apos; in window);//true</span><br><span class="line"> x = 0;</span><br></pre></td></tr></table></figure></p>
<h2 id="函数表达式"><a href="#函数表达式" class="headerlink" title="函数表达式"></a>函数表达式</h2><p>var getName 与 function getName 都是声明语句,区别在于 var getName 是函数表达式,而 function getName 是函数声明。关于JS中的各种函数创建方式可以看 大部分人都会做错的经典JS闭包面试题 这篇文章有详细说明。</p>
<p>函数表达式最大的问题,在于js会将此代码拆分为两行代码分别执行。</p>
<p>例如下代码:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">console.log(x);//输出:function x()&#123;&#125;</span><br><span class="line">var x=1;</span><br><span class="line">function x()&#123;&#125;</span><br></pre></td></tr></table></figure></p>
<p>所以最终函数声明的x覆盖了变量声明的x,log输出为x函数。<br>同理,原题中代码最终执行时的是:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">function Foo() &#123;</span><br><span class="line"> getName = function () &#123; </span><br><span class="line"> alert (1); </span><br><span class="line"> &#125;;</span><br><span class="line"> return this;</span><br><span class="line"> &#125;</span><br><span class="line"> var getName;//只提升变量声明</span><br><span class="line"> function getName() &#123; alert (5);&#125;//提升函数声明,覆盖var的声明</span><br><span class="line"> Foo.getName = function () &#123; </span><br><span class="line"> alert (2);</span><br><span class="line"> &#125;;</span><br><span class="line"> Foo.prototype.getName = function () &#123;</span><br><span class="line"> alert (3);</span><br><span class="line"> &#125;;</span><br><span class="line"> getName = function () &#123; </span><br><span class="line"> alert(4);</span><br><span class="line"> &#125;;//最终的赋值再次覆盖function</span><br><span class="line"> getName声明</span><br><span class="line"> getName();//最终输出4</span><br></pre></td></tr></table></figure></p>
<hr>
<h2 id="第三问"><a href="#第三问" class="headerlink" title="第三问"></a><strong>第三问</strong></h2><p>第三问的 Foo().getName(); 先执行了Foo函数,然后调用Foo函数的返回值对象的getName属性函数。</p>
<p>Foo函数的第一句 getName = function () { alert (1); }; 是一句函数赋值语句,注意它没有var声明,所以先向当前Foo函数作用域内寻找getName变量,没有。再向当前函数作用域上层,即外层作用域内寻找是否含有getName变量,找到了,也就是第二问中的alert(4)函数,将此变量的值赋值为 function(){alert(1)}。</p>
<p><strong>此处实际上是将外层作用域内的getName函数修改了。</strong></p>
<blockquote>
<p>注意:此处若依然没有找到会一直向上查找到window对象,若window对象中也没有getName属性,就在window对象中创建一个getName变量。</p>
</blockquote>
<p>之后Foo函数的返回值是this,而JS的this问题博客园中已经有非常多的文章介绍,这里不再多说。</p>
<p>简单的讲,<strong>this的指向是由所在函数的调用方式决定的</strong>。而此处的直接调用方式,this指向window对象。</p>
<p>遂Foo函数返回的是window对象,相当于执行 window.getName() ,而window中的getName已经被修改为alert(1),所以最终会输出1</p>
<p>此处考察了两个知识点,一个是变量作用域问题,一个是this指向问题。</p>
<hr>
<h2 id="第四问"><a href="#第四问" class="headerlink" title="第四问"></a><strong>第四问</strong></h2><p>直接调用getName函数,相当于 window.getName() ,因为这个变量已经被Foo函数执行时修改了,遂结果与第三问相同,为1</p>
<hr>
<h2 id="第五问"><a href="#第五问" class="headerlink" title="第五问"></a><strong>第五问</strong></h2><p>第五问 new Foo.getName(); ,此处考察的是js的运算符优先级问题。</p>
<p>js运算符优先级:<br><img src="http://images2015.cnblogs.com/blog/746158/201602/746158-20160214172948591-1509302580.png" alt="此处输入图片的描述"></p>
<p> 参考链接:<br> <a href="https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence" target="_blank" rel="external">https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence</a></p>
<p> 通过查上表可以得知点(.)的优先级高于new操作,遂相当于是:</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">new (Foo.getName)();</span><br></pre></td></tr></table></figure>
<p>所以实际上将getName函数作为了构造函数来执行,遂弹出2。</p>
<hr>
<h2 id="第六问"><a href="#第六问" class="headerlink" title="第六问"></a><strong>第六问</strong></h2><p>第六问 new Foo().getName() ,首先看运算符优先级括号高于new,实际执行为<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">(new Foo()).getName()</span><br></pre></td></tr></table></figure></p>
<p>遂先执行Foo函数,而Foo此时作为构造函数却有返回值,所以这里需要说明下js中的构造函数返回值问题。</p>
<h1 id="构造函数的返回值"><a href="#构造函数的返回值" class="headerlink" title="构造函数的返回值"></a>构造函数的返回值</h1><p>在传统语言中,构造函数不应该有返回值,实际执行的返回值就是此构造函数的实例化对象。</p>
<p>而在js中构造函数可以有返回值也可以没有。<br>1、没有返回值则按照其他语言一样返回实例化对象。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">function F()&#123;&#125;</span><br><span class="line">undefined</span><br><span class="line">new F()</span><br><span class="line">F()</span><br></pre></td></tr></table></figure></p>
<hr>
<p>2、若有返回值则检查其返回值是否为引用类型。如果是非引用类型,如基本类型(string,number,boolean,null,undefined)则与无返回值相同,实际返回其实例化对象。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">function F()&#123;return true;&#125;</span><br><span class="line">undefined</span><br><span class="line">new F()</span><br><span class="line">F()</span><br></pre></td></tr></table></figure></p>
<hr>
<p>3、若返回值是引用类型,则实际返回值为这个引用类型。<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">function F()&#123;a:1&#125;</span><br><span class="line">undefined</span><br><span class="line">new F()</span><br><span class="line">F()</span><br></pre></td></tr></table></figure></p>
<p>原题中,返回的是this,而this在构造函数中本来就代表当前实例化对象,遂最终Foo函数返回实例化对象。</p>
<p>之后调用实例化对象的getName函数,因为在Foo构造函数中没有为实例化对象添加任何属性,遂到当前对象的原型对象(prototype)中寻找getName,找到了。</p>
<p>遂最终输出3。</p>
<hr>
<h2 id="第七问"><a href="#第七问" class="headerlink" title="第七问"></a><strong>第七问</strong></h2><p>第七问, new new Foo().getName(); 同样是运算符优先级问题。</p>
<p>最终实际执行为:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">new ((new Foo()).getName)();</span><br></pre></td></tr></table></figure></p>
<p>先初始化Foo的实例化对象,然后将其原型上的getName函数作为构造函数再次new。</p>
<p>遂最终结果为3</p>
<hr>
<h2 id="最后"><a href="#最后" class="headerlink" title="最后"></a><strong>最后</strong></h2><p>就答题情况而言,第一问100%都可以回答正确,第二问大概只有50%正确率,第三问能回答正确的就不多了,第四问再正确就非常非常少了。其实此题并没有太多刁钻匪夷所思的用法,都是一些可能会遇到的场景,而大多数人但凡有1年到2年的工作经验都应该完全正确才对。</p>
<p>只能说有一些人太急躁太轻视了,希望大家通过此文了解js一些特性。</p>
</div>
<div class="article-info article-info-index">
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-chengxuyuan" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/05/26/chengxuyuan/" class="article-date">
<time datetime="2016-05-26T13:43:01.447Z" itemprop="datePublished">2016-05-26</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/05/26/chengxuyuan/">如何成为一个优秀的码农</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h3 id="如何判断自己是否具有成为一名优秀程序员的潜质"><a href="#如何判断自己是否具有成为一名优秀程序员的潜质" class="headerlink" title="如何判断自己是否具有成为一名优秀程序员的潜质"></a>如何判断自己是否具有成为一名优秀程序员的潜质</h3><blockquote>
<p> 很多像这样的日子,当地上积起厚厚的雪时,我通常会燃起铁炉,把马蹄跌烧的通红,搓搓温暖的手,开始打造特制手工马蹄铁。<br>经过了5年多的专职钉马掌生活后,我开始问自己一个问题:我要一直这样干下去吗?能不能干点儿别的?我的性格跟其他乡下那些叼着雪茄、喝着小酒的铁匠不一样,我从来没有戴过牛仔帽或骑过公牛。我渴望的是知道更多的事情,琢磨更多的事情,做更多的事情。<br><img src="http://ww3.sinaimg.cn/mw690/7cc829d3jw1f13c3r9wejj20fk09lta8.jpg" alt="此处输入图片的描述"><br>成功从事开发工作 7 个月后,我已经给几百人回复了邮件,他们问我如何成为一个程序员的,寻求我的建议,他们想知道如何判断自己是否适合去做一名程序员!<br><img src="http://ww1.sinaimg.cn/mw690/7cc829d3jw1f13c3os0e4j20f80gu783.jpg" alt="此处输入图片的描述"><br><strong>下面罗列了7种特征,是我从同事中最有效的程序员身上观察到的,我知道,优秀的程序员都有很多共同之处:</strong></p>
<h4 id="1-注意细节,尤其是最小的细节"><a href="#1-注意细节,尤其是最小的细节" class="headerlink" title="1) 注意细节,尤其是最小的细节"></a>1) 注意细节,尤其是最小的细节</h4><p>“差不多”、“很接近”是只能在做马蹄铁时用的词,在软件开发中,95%的正确仍然是不能用,一个“差不多”能用方法或一个使图片很“接近”居中的CSS样式都是不合格、不能用的。这剩下的5%对于整个软件的有效性十分重要,能造成完全相反的结果。<br><strong>««« 如果你讨厌细节,你就别去做程序员。</strong></p>
<h4 id="2-学无止境"><a href="#2-学无止境" class="headerlink" title="2) 学无止境"></a>2) 学无止境</h4><p>起初这句话听起来会很迷人,你会很喜欢!我喜欢学习新事物!尤其是当你来自于一个无聊的工作或像钉马掌这样永远不变的事情时 =-)。然而,经过了一段时间后,你会发现,这变成了一条永不停息的知识河流,如果你不喜欢水,你会感觉困在了无尽无边的知识瀑布前,无法停止,也无法穷尽。我每天大概有学到10-20种新的东西,我喜欢这些!我的弟弟却希望事情永远不会变化,始终如一,他对我说他永远都不愿意去学编程。<br><strong>««« 如果你不喜欢坚持不懈的去学习新事物,而喜欢待在一个永不变化的环境中,那你很可能成为不了一名程序员。</strong></p>
<h4 id="3-面对压力、紧张和限定期限"><a href="#3-面对压力、紧张和限定期限" class="headerlink" title="3) 面对压力、紧张和限定期限"></a>3) 面对压力、紧张和限定期限</h4><p>没错,每个人都喜欢使用软件,但你喜欢面对任务的最后期限和最终目标吗?需要什么时候完成?做完这些要花多少时间?我们能在这段时间里完成更多的任务吗?是否还记得要注意细节?你怎么办?急匆匆的完成?加班加点希望能多完成一些?在理想世界里,编程是一个很有趣的活动,我们写出代码,让它们完成很酷的事情,吃着批萨,喝着可乐。而在现实生活中,有的是压力,虽然不是时刻都这样,但事情会比那种做一个30分钟的简单在线辅导要不同的多。我喜欢挑战我的极限,我渴望成长,变成一个更棒的程序员,所以我不介意。<br><strong>««« 你面对时间限制和工作压力会怎样?如果你想回避这些压力,那你将无法成为一名程序员。</strong></p>
<h4 id="4-有组织能力"><a href="#4-有组织能力" class="headerlink" title="4) 有组织能力"></a>4) 有组织能力</h4><p>我知道有些程序员的生活一塌糊涂,看起来他们似乎没自我组织能力,但我说的不是这些,我是说管理好工作流程的能力。比如,能否迅速容易的在你的计算机里找到一个东西?我认识的优秀的程序员通常能迅速的定位一个需要的文件,能够用工具或脚本帮他们处理繁杂的事物,这些都是高效的工作。<br><strong>««« 当你学到了一个新东西时,你是否把它写下来?你是否喜欢想出办法来替你完成那些重复的工作?你能很好的安排各种不同的任务吗?如果不能,那你就不适合去当一名程序员。</strong></p>
<h4 id="5-好奇心"><a href="#5-好奇心" class="headerlink" title="5) 好奇心"></a>5) 好奇心</h4><p>当我还是十几岁时,教堂里的一位夫人几乎每月都会对我说一次,她说我应该停止问那么多为什么,她说这让人讨厌。虽然受了批评,最终我还是清楚的认识到,优秀的程序员总是在问“为什么?”这个应用的工作原理是什么?那个横跨街道的建筑是怎么建起来的?程序员之间的对话听起来总是像这样开始的:“很奇怪他们为什么要这样做…?”以前我以为问这么多为什么是很奇怪的表现,但现在我明白,至少是在软件开发中,这是一个好的品质。<br><strong>««« 不明白的事情会引起你的好奇心吗?新事物会让你兴奋的想搞清楚它的原理吗?如果你不具有某种程度天生的好奇心,那么你就很可能不喜欢做一名程序员。</strong></p>
<h4 id="6-自学"><a href="#6-自学" class="headerlink" title="6) 自学"></a>6) 自学</h4><p>我知道,很多的程序员都上过大学,出自高校的,但这不是我要说的。优秀的程序员总是在钻研程序代码和文档,来弄清楚东西的工作原理,他们不会敲开老板办公室的们说:“我需要上培训课,学习这款新软件”。优秀的程序员在不断的学习,不断的靠自己研究出事情的原委——不论是有高学历还是没有学历。<br><strong>««« 如果你需要有人教你,或者等着参加热门的课程去学知识,那你很可能不会成为一名程序员。</strong></p>
<h4 id="7-人际交往能力"><a href="#7-人际交往能力" class="headerlink" title="7) 人际交往能力"></a>7) 人际交往能力</h4><p>这在程序员中不是一个普遍的特征。真正优秀的程序员善于与人交往,但大多数程序员缺乏这些能力。如果你善于沟通,你的老板、你的公司会非常喜欢你。而且,不要因为他们不会编码就瞧不起他们。<br><strong>««« 如果你不喜欢与人接触,跟别人在一起时觉得很难受,那你也许就不应该成为一名程序员。</strong></p>
</blockquote>
</div>
<div class="article-info article-info-index">
<div class="clearfix"></div>
</div>
</div>
</article>
<article id="post-无标题Markdown" class="article article-type-post" itemscope itemprop="blogPost">
<div class="article-meta">
<a href="/2016/05/26/无标题Markdown/" class="article-date">
<time datetime="2016-05-26T11:16:30.000Z" itemprop="datePublished">2016-05-26</time>
</a>
</div>
<div class="article-inner">
<input type="hidden" class="isFancy" />
<header class="article-header">
<h1 itemprop="name">
<a class="article-title" href="/2016/05/26/无标题Markdown/">程序员之路</a>
</h1>
</header>
<div class="article-entry" itemprop="articleBody">
<h1 id="每天努力一点点"><a href="#每天努力一点点" class="headerlink" title="每天努力一点点"></a>每天努力一点点</h1><blockquote>
<p>世界上有一个最伟大的秘密,今天我要悄悄告诉大家:你只要每天比别人稍微努力一点点,你就会成功。这不会太难做到吧。<br>故事之一:石匠的目标<br>我们经常用“三个建筑工人”的故事来帮助同学们理解什么是目标,什么是目标管理。这个寓言是这样的:<br>有个人经过一个建筑工地,问那里的建筑工人们在干什么?三个工人有三个不同的回答。<br>第一个工人回答:”我正在砌一堵墙。”<br>第二个工人回答:”我正在盖一座大楼。”<br>第三个工人回答:”我正在建造一座城市。”<br>十年以后,第一个工人还在砌墙,第二个工人成了建筑工地的管理者,第三个工人则成了这个城市的领导者。<br>心灵启示:思想有多远,我们就能走多远。<br>如果我们的目标才真正与工程目标、团队目标高度吻合,他的自我启发意愿与自我发展行为才会与组织目标的追求形成和谐的合力。<br>故事之二:人生和信念<br>在美国纽约,有一位年轻的警察叫亚瑟尔,在一次追捕行动中,他被歹徒的冲锋枪射中了左眼和右腿膝盖。三个月后,当他从医院出来的时候,由一个英俊小伙子变成了一个又跛又瞎的残疾人。<br>纽约市政府和其它组织授予了他许多勋章和锦旗。记者问他:“你以后将如何面对您现在的命运呢?”他说:“我只知道歹徒还没有被抓住。”他那只完好的眼睛里透出一种令人颤栗的愤怒之光。这以后,他不顾别人的劝阻,多次参与抓捕歹徒的行动。<br>九年后,那个歹徒被抓获,他在行动中起了关键的作用。在庆功会上,他再次成了英雄,许多媒体都称他为最坚强、最勇敢的人。然而半年以后,他却在卧室里自杀了。在他的遗书中,人们读到了他自杀的原因:“这些年来,让我活下去的信念就是抓住凶手……现在,伤害我的凶手被判刑了,我的恨也消失了,生存的信念也随之消失。面对自己的伤残,我从来没有这样绝望过……”<br>心灵启示:或许生命什么都可以缺,譬如失去一只眼睛,或者失去一条健全的腿,但是就是不能失去信念。<br>故事之三:最可怜的人<br>一个小个子学生,参加学校的田径比赛。<br>田径比赛的选手,每个人都比他高,有个爱开玩笑的人对他说:“小朋友,在这些大个子中间穿梭,你一定会迷路吧!”<br>小个子学生回答说:“我就像一个小金牌,混在一大堆铜牌里。”<br>比赛结束后,小个子学生真的获得了田径比赛的金牌。<br>心灵启示:别人看轻你,不过是看的角度不同,当你自己看轻自己,就是自我放弃。“最可怜的人”不是别人给的,而是自己封的。每个人要适时看清自己,但千万不能看轻自己。</p>
</blockquote>
</div>
<div class="article-info article-info-index">
<div class="clearfix"></div>
</div>
</div>
</article>
</div>
<footer id="footer">
<div class="outer">
<div id="footer-info">
<div class="footer-left">
&copy; 2016 liyuming
</div>
<div class="footer-right">
<a href="http://hexo.io/" target="_blank">Hexo</a> Theme <a href="https://github.com/luuman/hexo-theme-spfk" target="_blank">spfk</a> by luuman
</div>
</div>
<div class="visit">
<span id="busuanzi_container_site_pv" style='display:none'>
<span id="site-visit" >海贼到访数:
<span id="busuanzi_value_site_uv"></span>
</span>
</span>
<span>, </span>
<span id="busuanzi_container_page_pv" style='display:none'>
<span id="page-visit">本页阅读量:
<span id="busuanzi_value_page_pv"></span>
</span>
</span>
</div>
</div>
</footer>
</div>
<script src="http://7.url.cn/edu/jslib/comb/require-2.1.6,jquery-1.9.1.min.js"></script>
<script src="/js/main.js"></script>
<script>
$(document).ready(function() {
var backgroundnum = 24;
var backgroundimg = "url(/background/bg-x.jpg)".replace(/x/gi, Math.ceil(Math.random() * backgroundnum));
$("#mobile-nav").css({"background-image": backgroundimg,"background-size": "cover","background-position": "center"});
$(".left-col").css({"background-image": backgroundimg,"background-size": "cover","background-position": "center"});
})
</script>
<script type="text/x-mathjax-config">
MathJax.Hub.Config({
tex2jax: {
inlineMath: [ ['$','$'], ["\\(","\\)"] ],
processEscapes: true,
skipTags: ['script', 'noscript', 'style', 'textarea', 'pre', 'code']
}
});
MathJax.Hub.Queue(function() {
var all = MathJax.Hub.getAllJax(), i;
for(i=0; i < all.length; i += 1) {
all[i].SourceElement().parentNode.className += ' has-jax';
}
});
</script>
<script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML">
</script>
<div class="scroll" id="scroll">
<a href="#"><i class="fa fa-arrow-up"></i></a>
<a href="#comments"><i class="fa fa-comments-o"></i></a>
<a href="#footer"><i class="fa fa-arrow-down"></i></a>
</div>
<script>
$(document).ready(function() {
if ($("#comments").length < 1) {
$("#scroll > a:nth-child(2)").hide();
};
})
</script>
<script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js">
</script>
<script language="javascript">
$(function() {
$("a[title]").each(function() {
var a = $(this);
var title = a.attr('title');
if (title == undefined || title == "") return;
a.data('title', title).removeAttr('title').hover(
function() {
var offset = a.offset();
$("<div id=\"anchortitlecontainer\"></div>").appendTo($("body")).html(title).css({
top: offset.top - a.outerHeight() - 15,
left: offset.left + a.outerWidth()/2 + 1
}).fadeIn(function() {
var pop = $(this);
setTimeout(function() {
pop.remove();
}, pop.text().length * 800);
});
}, function() {
$("#anchortitlecontainer").remove();
});
});
});
</script>
</div>
</body>
</html>
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化