前段面试

  1. 转载自:http://www.javashuo.com/article/p-zlsqcpel-cq.html
  2. JS有哪些手段能够实现继承?
  3. 说说JS的闭包?
  4. 用纯JS实现,点击一个列表时,输出对应的索引(不能用JQuery哦)
  5. CSS实现矩形按钮右边缘的中间有个往里凹的小半圆,如图:button
  6. 为何用vue而不用NG或者React?
  • 第1题,这可简单啦,JS主要有借用构造函继承和原型继承以及二者的组合。不懂的能够看看《JS高教》
  • 第2题,不懂的自行补脑去
  • 第3题,可能面试官的意图也是想考察咱们可否熟练掌握闭包吧。若是有刷过面试题的同窗可能一会儿就会作出来,可是,若是经验不足的同窗可能会写出以下的代码:
<body> <ul> <li>test1</li> <li>test2</li> <li>test3</li> <li>test4</li> <li>test5</li> <li>test6</li> <li>test7</li> <li>test8</li> <li>test9</li> <li>test10</li> </ul> <script> var lis = document.querySelectorAll('ul li'); for(var i = 0, len = lis.length; i < len; i++) { lis[i].addEventListener('click', function () { console.log(i); }, false); } </script> </body>

你运行一下代码会发现,不管你点击哪一个列表,控制台都是输出10。这是由于var声明的变量是函数做用域的,而不是块级做用域的。也就是说,for循环10次,每次都是改变同一个i,因此它的值会从0一直加到10。还有个问题是闭包致使的,闭包保存的是外部变量的引用,而不是值。也就是说,循环10次监听器建立了10 个闭包,它们里面的i引用的是同一个啊。因此所有都指向了10.
要解决这个问题有两种方法。一种是使用ES6的let来替代 var i = 0 里面的var, 由于let支持块级做用域。改为以下就正常了。javascript

for(let i = 0, len = lis.length; i < len; i++) { lis[i].addEventListener('click', function () { console.log(i); }, false); }

还有一种方法,就是不少经典书本都提到的,使用当即执行函数来切断闭包对外部变量i的引用:html

for(var i = 0, len = lis.length; i < len; i++) { (function (i) { lis[i].addEventListener('click', function () { console.log(i); }, false); })(i) }

固然啦,若是对闭包不是很熟练,还能够经过事件委托来避开这个陷阱哈,代码以下:前端

var ul = document.querySelector('ul'); var lis = document.querySelectorAll('ul li'); ul.addEventListener('click', function (e) { var target = e.target; if(target.nodeName.toLowerCase() === 'li') { console.log([].indexOf.call(lis, target)); } }, false);

使用了事件委托,减小了监听器的绑定(只对列表的父亲元素监听),这种方法说不定还会加分呢。哈哈,我当时就是用这种方法来实现的,面试官可能以为个人解法有点不寻常、顿时一脸蒙B,甚至还一度怀疑 console.log([].indexOf.call(lis, target)) 这段代码是否是有问题。直到后来我直接在他的笔记本跑了一遍,他才相信是正确的。vue

  • 第4题,由于面试官说要经过伪元素来实现,个人CSS自己就不咋滴,只知道好像用到了CSS3的border-radius,可是要使用伪未元素我还真心不会哇。因此当时就直接说不会作,如今也不会。请CSS大神在评论区发一下代码哈~java

  • 第5题,主要谈框架相关的。由于目前的状况是,React才是主流,不少团队都在用React,CVTE也不例外。他彷佛很关心我为何要使用vue。我当时给出的理由是:NG1脏值检测性能过低而且相对过期,NG2目前又不够成熟,React的JSX语法我的不太喜欢,而vue比较轻量级、而且支持jade模板( 咱们旧项目是使用jade模板写的,迁移会相对容易)。然而,接下来便遭到了面试官的连续挑衅,说我用vue不会是由于它的中文文档比较齐全吧(鄙视我英文差???)。还说vue是不适合作大型项目。最后一句更狠:大家使用vue真是最愚蠢的选择。(我当时内心真的有一万只草泥马在奔腾)
    其实,我我的以为,框架并无好坏之分的,每一个框架必然有它存在的理由。React也好,NG也行,Vue也罢,萝卜、荷兰豆各有所爱嘛。反正,面试官说的那些话我真的听得挺反感的。
    话又说回来。问完了第5个问题以后 ,面试官说面试就此结束,让我回到座位休息。
    CVTE对于考生的招待真的挺周到的,桌面上有水果、零食、饮料等等。由于当时手机快没有电了,因此,就坐在那里边吃水果边看其余人面试。node


二面

而后,等待了一个多小时,轮到了二面。面试官大概三十多岁,多是前端组长或者技术总监之类的职位吧。
他主要是问到了下面的这些问题:面试

  1. 说说JS的内存机制及垃圾回收机制
  2. 下面的代码有内存泄漏吗
var user = {name: 'tom', age: 20, gender: 'male'} var test = document.getElementByid('test') test.onclick = function() { test.innerHTML = user.name; } // ...后面还有不少其余操做,最后把user对象释放掉 user = null; // 释放对象
  1. 实现一个算法,寻找字符串中出现次数最少的、而且首次出现位置最前的字符
    如"cbaacfdeaebb",符合要求的是"f",由于他只出现了一次(次数最少)。而且比其余只出现一次的字符(如"d")首次出现的位置最靠前。
  2. http和tpc的关系,以及什么是https
  3. Node的特色(优势和缺点)
  4. 你在腾讯和网易实习期间学到的东西?
  5. 将来三年的职业规划

至于二面的问题都不是很难,下面简单的来看一下:算法

  • 第1题,基本类型(number, string, boolean, null, undefined, symbol)是在栈的,而其余的引用类型都是在堆的。垃圾回收是采用了计数引用法(若是两个对象之间存在循环引用时,会有内存泄漏,由于计数没法变为0 )这里写错了,误导了你们,很差意思哈。JS使用的是标记清除法。原理能够看看《JS高教》第三版的78页。安全

  • 第2题,有内存泄漏,这是闭包自己的问题。彻底消除闭包的内存泄漏是不现实的,可是,若是采用下面的方法能够减小内存泄漏:
var user = {name: 'tom', age: 20, gender: 'male'} var test = document.getElementByid('test') (function (name) { test.onclick = function() { test.innerHTML = name; } })(user.name); user = null;
  • 第3题算法题,也不很难,你们能够本身试试去实现 ,若是作不出来的再到评论求助啦,这里就不贴出代码了。网络

  • 第4题,考察了计算机网络的tcp三次握手以及http的请求头等。https是使用安全套接字进行加密的,能够说HTTPS = SSL + HTTP。

  • 第5题,Node的特色是异步非IO阻塞、适合高并发,但不适合密集型计算

  • 第六、7题都是主观题,能够随便吹一下水便好。

相关文章
相关标签/搜索