凡科是我第一次实习面试,很久没有看“红宝书”,很多基础的知识都忘了,在收到面试通知的时候有点手忙脚乱,开始投入准备,我的准备工作主要是一下几个方面
- 看高级程序设计,不愧是红宝书,几乎包含所有的内容,不过也有一个缺点,就是内容太多,时间太短,反而不知道从哪里下手
- 看别人总结的面经,自己没有面试过,所以看别人总结的面经是一个最能够模拟面试的过程,并猜想面试官会从哪些问题去问自己
- 看前端经常问到的问题,由于时间关系,所以选择“捷径”,捷径有风险
- 问大神,取经!毕竟自己太多不足,所以还是有必要向大佬取经
25号中午收到的面试通知,27号中午要面试,中间短短两天的时间,把能够复习的地方都看了一遍,不过真的很多知识点并没有深入,也有的知识点没有复习全,之类需要后续补上
面试前
- 这里我指的是要了解自己去的这家公司,了解它的文化理念,了解它的团队,了解它的产品等等,毕竟知此知彼百战不殆!而且,你不小心成功的话还是要去那里学习工作的,公司对你的影响务必考虑
- 还有了解你所要面试的情况,是直接面试?还是直接笔试?还是笔试后+面试?这些最好能够在对方通知你去面试的时候问清楚,不清楚的话,最好打电话问清楚,因为这个对准备面试很重要
笔试
五道题目,都很经典,自己做得不怎样,而且其实不算难,关键要细心、细心、细心!而且要陷阱!
- 给出一段代码,写处输出结果
这道题主要考察的知识点有,for循环、作用域链的解析、变量的声明。重点应该是考察作用域链,面试官问从作用域链的方面解析这段代码。
自己的解答,一开始以为是闭包,后来发现不是,然后发现就是一个函数调用,只是全局变量中和函数中都有i的值,其中函数中的i没有使用var声明(这就是第一个坑,自己在这就掉进去了)然后其他的就是作用域链的解析了,这个需要接下来好好总结下了。
- 考察闭包,就是“红宝书”P181的案例模式
自己是理解的,结果还是栽在数组越界上(这是第二个坑),在for循环中导致数组越界,所以后来输出的结果是undefined
面试官追问:用什么方法,可以使结果和预期一致?
我说了“红宝书”中的一种,描述得不好(自己理解不够)。然后面试官自己给我举了其他的解决方法???(啊啊啊,脑子短路,记不起了,自己百度了)
如果是之前的写法,每个函数的作用域链中都保存的是createFunction()函数的活动对象,所以他们引用的是同一个变量i。当createFunction()函数返回后,变量i的值是10,此时每个函数都引用着保存着变量i的同一个变量对象,所以每个函数内部i的值都是10.
我们可以创建另外一个匿名函数强制让闭包的行为符合预期。如下所示:
function createFunctions(){
var result = new Array();
for(var i=0;i<10i++){
result[i] = function(num){
return function(){
return num;
}
}(i)
}
return result;
}
这个时候我们不是直接将闭包的值返回赋值给数组,而是定义了一个匿名函数,将立即执行该匿名函数的结果赋值给result.这里匿名函数接受一个参数num,也就是最后返回给数组的值。在调用每个匿名函数的时候,我们都传入一个变量i。由于函数的参数是按值传递的,所以变量i的值就被赋值给了num.而在这个函数的内部,又创建了一个访问num的闭包,这样就可以解决那个问题啦~
- 考察CSS
这道题相对简单 - 数组重组
自己写的程序少了sort()方法,还有效率不高,百度又很有关于js数组重组的内容,务必深入探讨一下
第一种方法总结:(最简单的方法)
function removeRepeat(arr){
var lastArr = [];
for(var i=0;i<arr.length;i++){
if(lastArr.indexOf(arr[i]) == -1){
lastArr.push(arr[i]);
}
}
return lastArr;
}
第二种方法总结:(数组下标判定法)
function removeRepeat(arr){
var lastArr = [];
for(var i=0;i<arr.length;i++){
if(arr.indexOf(arr[i]) == i){
lastArr.push(arr[i]);
console.log(lastArr);
}
}
console.log(lastArr);
}
第三种方法:(排序后再相邻比较法)
function removeRepeat(arr){
var lastArr = [];
arr.sort();
console.log(arr);
for(var i=0;i<arr.length;i++){
if(arr[i]!=arr[i+1]){
lastArr.push(arr[i]);
}
}
console.log(lastArr);
}
第四种方法:(推荐用法)对象键值对法
function removeRepeat(arr){
var lastArr = [];
var lastObj = {};
for(var i=0;i<arr.length;i++){
var val = arr[i];
if(!lastObj[val]){
lastArr.push(arr[i]);
lastObj[val] = 1;
}
}
console.log(lastArr);
}
面试官举了一种效率比较高的查询,好像是哈希查找的,可以少个for循环
- 最后一道题,他说不做要求的,不过我写了他也就跟我聊
涉及到的知识点有:with(用得比较少),eval方法
笔试小总结
- 陷阱很多,所以看代码要仔细,要认真
- 关于一些常见的笔试题要有所准备,像重组就应该有所准备(要每天去牛客网刷下题目)
- 面试官还是很看重更深的知识、更全的知识,后面的面试更是有这种体会(所以知识点不是了解就好)
面试
笔试后接着就是面试,面试面试官先从笔试题这部分开始,然后就是简历上的了,(可能是发觉我太渣了,没有问项目相关的问题,这是个悲伤的故事)
- canvas实现画笔的时候,画笔点击画布会触发一系列怎样的事件???(移动端)
自己挖的canvas坑,哭着填完,我只答出一个click,药丸!其实是有touchStart,toucuEnd,mouseover,mousedown等等(自己事件这一块没来得及复习,问得我**) - 怎么获得坐标
就是经常自己要百度那几个东东,所以要将自己经常要百度的东西记录一下 - 垂直居中知道哪些方法?
我就答了两种:line-height==height,以及position布局来处理的方法,还有一个vertical-align:middle(又给自己挖了一个坑)事后深入了解吧,面试官也给自己讲了一下 - 清除浮动的方法
这个自己答得还不错,面试官深入问overflow:hidden原理的时候,自己就说BFC(感觉打了一次擦边球) - 关于BFC的深入?怎么作用的你了解么
回答的不好 - 关于性能优化
自己有些准备,答道引用外部文件的时候,他问了为什么?我也是简单靠自己的理解,不过js那块有更深入的理解 - 阻止事件
面试总结
- JavaScript比较少问,可能是从笔试上有所体现了吧
- 知识点不全,不够深入
- 回答问题之前可以整理一下思路,回答的时候做到表达清晰
总结
- 凡科,这家公司给我的感觉好好,前台的服务很nice,面试官很nice,环境很nice,给了我很大的动力望这种公司努力,这是面试的其中一个收获
- 了解了自己好多不足,不过也有好的一点,就是再次看起“红宝书”,感觉脉络好像清晰很多,很多可以比较快的掌握
- 对一些经常面试到的知识的总结还是太少,多刷面经多刷题目
其他:
- 面试要准时,自己早到40分钟吧,我觉得这方面做得还好,面试的过程注意尽量放轻松,举止自如一点(其实面试也就是跟别人交流经验)。尊重面试官,等面试官说完自己再讲话,给人留下好印象。
注:上面很多并没有整理答案,还要进一步的整理。
参考资料:
纯CSS实现垂直居中的几种方法
Flex 布局教程:语法篇
Flex 布局教程:实例篇----包含一些布局介绍
前端面试题精讲系列 说说JavaScript的事件绑定方法并举例
clientX,screenX,pageX,offsetX的异同
js数组去重的5种算法实现