记一年前端小白面经

更新于 2018-06-13  约 6 分钟

起点

从去年2017年7月毕业至今将近快1年的时间了,2018年5月底6月初开始面试,一共面了快手,滴滴,头条。很幸运每家都面完了3轮技术+1轮hr,能跟这么多大牛聊天真是太有收获了,对基础是一次查漏补缺,对技术视野也是一次提升,于是就想记录一下这些面试的问题与收获,有一些问题值得更加深入的研究的。

问题

由于已经过了些时日,仅记录问题而不分哪家也不分几轮面试。

  • 计算机基础类

    • TCP和UDP区别以及各自的应用
    • TCP3次握手与4次挥手,为什么要这么做
    • keep-alive是对应接口复用还是对应的域名复用
    • HTTP与HTTPS区别,HTTPS握手过程,包含对称非对称加密,在哪步做,为什么要包含两种加密
    • 是否了解HTTP2
    • 进程与线程的区别
    • 物理地址与虚拟地址
    • websocket协议握手以及对nignx需要进行什么配置
  • 智力类

    • 海盗分金
    • 概率论抽扑克牌问题
  • 算法类

    • 快排算法,并说出你写快排的时间与空间复杂度(如果是阮大神快排就要注意空间复杂度了)
    • 递归反转二叉树
    • 检测字符串回文,并说出时间与空间复杂度
    • 写一个函数,简化linux相对路径(如 /a/b/.././c => /a/c)
  • 前端类

    • JS的六大基本类型以及判断方法(5+symbol)
    • JS判断数组以及对象的方法
      即 typeof instanceof Object.prototype.toString.call 适用范围
    • apply和call的区别
    • 原生bind的作用 实现一个bind的polyfill
      需要了解bind和new在一起用的时候的优先级,真正的polyfill是需要考虑到这一点的
    • 写一个数组去重
      自然回答通过哈希记录,存在的就不放入。但是漏掉了一个NaN的情况,被面试官指出来了。因为无论如何NaN做key的话string的NaN与真实的NaN是一致的
    • == 与 === 区别
      其实考察的是==的隐式类型转换,还好之前看过规范也写过一篇文章,还是比较熟悉的。https://segmentfault.com/a/11...
    • isNaN(null)返回什么?为什么?
      一开始想的很简单,直接回答返回false。后来面试官问isNaN不应该是在不是一个数字的时候返回true吗,那null也不是一个数字,为什么会返回false呢。然后意识到事情并没有这么简单,然后按照基础知识推理了一下,isNaN应该会先执行抽象操作toNumber, 而null toNumber就是0,所以是一个数字,故返回false。
    • 对原型链的理解以及继承的实现
    • 实现一个函数,2个参数为两个构造函数,A的实例继承B
    • 如果让你实现一个Promise,要如何去做
      看过几遍Promise/A+规范,简单说了下重点实现构造函数,状态机制,链式机制,解决程序,then方法。
    • 实现 Promise.all
      自己想得有点偏激,想用链式来做,不过在reject的时候会有问题。面试官提出了一个用计数法resolve的方案,简单易懂。
    • 说出几种解决跨域的解决方案
      CORS,jsonp,iframe,proxy
    • 配置CORS是时候注意的点
      除了正常的头配置之外,复杂请求会发一个OPTIONS,可以通过配置类缓存这个OPTIONS请求,而不是每次都发送,其他具体描述见阮神http://www.ruanyifeng.com/blo...
    • cookie session localStorage区别
    • 说说对eventloop的理解
    • 节流与防抖的区别,实现一个防抖
    • 用promise包装一下xhr
    • vue数据绑定的原理
      主要是依赖收集,Object.defineProperty,getter,setter,watcher
    • vue与原先jquery时代的区别
    • vue父子组件如何传递数据
    • vue非父子组件如何传递数据,不用vuex
      event bus
    • 实现一个事件的机制
      简单实现emit on
    • vue v-model实现的原理
    • vue :xxx.sync实现的原理
    • vuex的实现及其原理
      没答出满意的答案,看过部分源码只是为了确认dispatch哪部分是异步的
    • vue-router守卫类别
    • vue-router的实现
    • webpack loader与plugin的区别
    • webpack用过哪些plugin,列举并说明作用
    • 说说cmd amd区别
    • 模块依赖分析以及加载
      看过webpack打包过后的代码,把__webpack__require__的加载机制以及模块缓存讲了一下。再底层一些静态分析建立模块依赖树,从最底层开始加载。这一部分自己答得也不是很好,还需要继续研究。
    • webpack + vue-router异步组件加载的原理
    • 对于具体分包依赖打包过后的代码
      a组件依赖c b组件依赖c 若单独打包了ab作为单js,会不会单独打包c
    • 自己项目的路径及其作用
    • display: none; visibility: hidden; opacity: 1; 区别
    • 外边距合并的问题,如何解决
    • 如何清除浮动
    • 对BFC的理解
    • 移动端适配的解决方案 rem vw vh
    • 300ms点击延迟的起因及其解决办法
    • 对重绘和重排的理解
    • 从接收到html到绘制完整页面的过程
    • 对script标签的理解
      主要是下载可以使同步并发的,而执行必须是按照script标签的位置有序执行的
    • 对前端缓存的理解
      强缓存和协商缓存
    • requestAnimationFrame的理解与如何模拟
    • 对浏览器优化方面有哪些方案与理解
    • 箭头函数与普通函数的区别
    • 对ES7与ES8的了解
      ES7基本就是async await ES8就真的不了解拉

结语

基本还有记忆的就是这些问题,大多数是一些基础问题,有的问题当时回答的并不好,回来也查了资料加深了理解,能跟大牛对话收货就是很多,也已经拿到了满意的offer,希望在找工作的大家加油~祝早日拿到满意的offer~

阅读 2.7k更新于 2018-06-13

推荐阅读
目录