今天很有幸去一家很不错的互联网公司面试,在学校找工作两个月面试都不顺利。只靠自己的力量是不够的,在朋友帮忙推荐的情况下,我得到了这家公司的面试邀请(我自己之前竟然没有查到)。
面试分为五轮,没错,是五轮,从13:20分左右一直持续到16:30左右。下面是我对这次面试的总结:
第一面 前端技术面试
面试官一看就是很厉害的前端,从气场上完全感受得到。(其实我来早了,估计打扰面试官午休了,内心小愧疚。)面试官是比较严肃的,面试的时候基本上是出一些由浅入深的JavaScript题目,一步一步考察应聘者的能力。
比如一开始是这样的:
1 | for (var i = 0; i < 5; i++) { |
然后是这样的:
1 | for (var i = 0; i < 5; i++) { |
最后是这样的(闭包):
1 | for (var i = 0; i < 5; i++) { |
还有这样的:
1 | setTimeout(function() { |
生成数组
要求给定n和s生成一个有n个s的数组。
我的想法只是用循环去做,还有迭代(迭代也是循环)。
面试官给出了一种hack
方法:
1 | var n = 5; |
DOM方面性能优化
我只提到了减少DOM操作,用css动画代替dom操作的动画。
去网上查了一下,不查不知道一查吓一跳,请看前端性能优化指南。
原生dom的操作
用习惯jQuery的我觉得很惭愧,竟然记不太清楚原生的DOM操作,后续我会从心学习并整理一遍。学习JavaScript——DOM。
this
一句话概括this。
很考察总结概括能力了,还好我看了书。
我的回答是:this指向函数调用对象。有几种方法可以改变函数调用时的this
,比如new一个构造函数,使用call()
、apply()
、bind()
方法绑定this
,还有就是隐式绑定和显示绑定。这个在《你不知道的JavaScript》读书笔记(二)里面有过总结。
面试官问了call()
、apply()
、和bind()
方法的区别。我简单回答了call()
和apply()
的传参方面的不同,但是bind()
我确实没有答上来。
面试官又一次给我解释了:call()
和apply()
是立即执行的,bind()
返回的是函数,需要重新调用,并在调用的时候传参,我是知道的,但竟然没有想到。
xss
以评论系统为例:服务端过滤用户输入的内容就可以了。一般在显示的时候过滤。但是有一个问题就是如果是类似操作数据库的脚本攻击,服务端应该尽早去发现才可以。???
跨域
我提到了服务器端设置响应头的方法。
jsonp的方式我只是提到,没有解释太清楚。
CSS盒模型
为什么在CSS3里面特意加入了对怪异盒模型的支持。
1 | box-sizing: border-box; |
我简单说明了border-box在布局上的好处,比如设置padding之后不会影响之前的布局啊啥的。
水平垂直居中
老生常谈了。网易跨境电商web前端面试:垂直+左右居中
有一种方法没有提到,就是设置元素display
为table
和table-cell
。
第二面 某产品线经理
电梯调度建模,设计类,以及类的通信。
我首先想到的是一台主机控制多台电梯类型的。简单说一下其中的作用,比如主机接收信号然后调度各个电梯。
然后面试官提出疑问,如果主机坏了,那么就会导致全部的电梯不能使用,所以提出每部电梯是一个主机,电梯之间相互联系,由电梯之间自己决定谁去运动。
后来针对我的解决方案提出另一个问题:如果用户一直按电梯按钮,就会一直向主机发送请求,如果主机响应的比较慢就会造成宕机,有没有什么好的解决方案。我的回答类似于前端表单提交的案例,点击一次后禁用按钮,或者不发送请求。
简单说明新产品线的规划,让我谈谈看法。
我确实有些胆怯,不认为我能扛得起来,表明自己在设计模式和架构上的欠缺,认为必须有高级主导才能使产品更好。
看我的作品,问我学习的过程和方法。
第三面 另一个某产品线经理
问我学习的方法,看我的作品,介绍自己负责的产品。(说实话,真的是赏心悦目)我也谈了我的一些看法,主要是问一下和我见到的已有的产品有什么不同之类的。
第四面 HR
介绍薪资待遇,公司情况。有鼓励也有打预防针。
第五面 CTO老王
交流思想的过程,发现其高度我不能望其项背。考验人品的过程,比如和产品经历的纠纷,学习和同事的交流等。后面甚至谈到对于技术革命的理解。
结果
回来的路上发了offer,职位是实习生,一个月考核期,到时候再考虑签三方的事情。虽然有些被动,但是我只能赌一把了,相信自己的能力能够达到他们的要求吧。