找内推人推的,第二天就收到了天猫部门内部面试,估计是想看看值不值得内推吧。
CSS
一上来问的技术问题就是css布局相关的:给三个div,实现排列在同一行的布局,我顺口一答就是flex布局,然后面试官就问能不能说出十种方法,我最后说出了六种,算是勉强过关吧:flex、float、表格布局、定位布局、inline-block布局、inline布局+padding撑大(开始说设置width然后面试官提醒我inline元素设置不了width)。
css部分还问了个怎么把div旋转90度,我回答了个rotate90度就没了。
Js
接下来问js部分,我就记得这个题了
Object.prototype.a = 1
Function.prototype.b = 2
class A{}
var a = new A()
问a.a和a.b分别是什么?为什么?
这是一道典型考察原型链的题目,我就说class是Object的语法糖,实际上a的原型还是Object,所以a.a是1。
至于a.b,我当时认为new这个操作符还是调用了Function的,所以Object.proto会指向Function.prototype
我自己事后实验看看他们的关系到底是什么样的:
a.__proto__ === A.prototype
A.__proto__ === Function.prototype
A.prototype.__proto__ === Object.prototype
Function.prototype === Function.__proto__
Function.prototype === Object.__proto__
Function.prototype.__proto__ === Object.prototype
Function instanceof Object
Object instanceof Function
Function instanceof Object
Function instanceof Function
Object instanceof Object
把原型链的图画出来:
网络
HTTP相关的知识肯定是必问的啦~这次问了经典的一个问题:在浏览器里输入url到网页展示给用户的过程发生了什么?
我就不赘述了。
项目
问完这些基础,就开始问项目了,聊着聊着,一个经典的问题抛出来:你在项目里印象里最难的部分是什么?最深刻的地方是什么?
我是这样回答的:功能需求其实总是可以想办法实现,现在google/stackoverflow/github等等这么方便,难的是优化功能和性能,然后就引出了面试官的一个问题:前端在和后端通信的时候因为网络延迟的原因会造成用户接受到的信息和发送过去的不一致的情况,比如百度搜索时搜索阿里巴巴四十大盗可能因为网络不好返回给用户的是阿里巴巴的搜索结果,这个问题问我怎么解决。
我就回答说前后端一起想办法解决,比如后端给返回的信息添加一个标识用的ID,前端用节流/监控网络超时(用rxjs的timer和throttle函数)。面试官说这样用户体验会不好,于是我借机询问面试官说:那您有什么好的建议吗?
面试官很大方的给了我他的解决方案:全局维护一个自增id,前端请求后后端返回的数据带上这个id,然后前端进行比较,如果一致则使用,否则丢弃。
其他
因为我是学安全的,就还顺便问了web安全的问题:假如有一个找回密码的接口,有发送短信的功能,如果一个人想刷接口,伪造十万个手机号码来恶意找回,怎么办?
我:前后端都加个限制,前端一分钟只能使用一次,后端一分钟内返回的是一样的验证码
他:但是短信照样发啊,发短信要钱的啊
我:那就加验证码呗
他:图片验证码吗?一般都可以破解了
我:那就换成12306那种验证码或者拖拽式的
他:还有其他方法吗?
我:这个场景能说清楚一下么?信号源是在那个人家里还是全国各地?
他:不知道
我:那就这样:如果是他家就用后端监测手段封锁IP,如果是全国的话就要求认证用户身份
他:算你过吧。。。
最后我稍微问了下面试官在哪个部门,有什么产品,和技术架构,团队氛围,然后就愉快地结束了这次面试,这场面试算是今年秋招的开胃菜吧~