面试小记

记录在面试过程中被问到的一些问题,ps:面试真心是一个很好的学习机会,能看到好多自己的不足~~

  • 浅拷贝&&深拷贝
    浅拷贝会使的两个对象指向同一个内存地址,深拷贝则会开辟一块新的内存空间,然后将被复制对象的属性逐个复制,复制对象不会对被复制对象产生影响。

    • 浅拷贝

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      function clone(obj){
      var F = function() {};
      F.prototype = obj;
      return new F();
      }

      function clone(obj){
      var newObj={};
      for(attr in obj){
      newObj[attr]=obj[attr];
      }

      return newObj;
      }
    • 深拷贝

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      /*最简单的实现
      * 抛弃对象的constructor,RegExp等对象无法复制
      */

      var newObj = JSON.parse(JSON.stringify(obj));

      /*
      *这个函数可以实现数组等的深拷贝,不过还是有一些bug
      */

      function extendDeeply(superObj, subObj) {
      var subObj = subObj || {};
      for(prop in superObj){
      if(typeof superObj[prop] == "object") {
      superObj[prop] = (superObj[prop].construtor === Arrar) ? [] : {};
      extendDeeply(superObj[prop], superObj[prop]);
      }else{
      subObj[prop] = superObj[prop];
      }
      }
      return subObj;
      }

      实现比较完整的深拷贝,可以参考http://jerryzou.com/posts/dive-into-deep-clone-in-javascript/

  • get/post
    GET一般用于获取/查询资源信息,而POST一般用于更新资源信息,根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的

    • Get请求的数据限制(2KB):URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。
    • 理论上讲,POST是没有大小限制的,HTTP协议规范也没有进行大小限制,起限制作用的是服务器的处理程序的处理能力
    • 在客户端, Get 方式在通过 URL 提交数据,数据 在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
    • 浏览器中GET 请求可被缓存。GET 请求保留在浏览器历史记录中
    • 对资源的增,删,改,查操作,其实都可以通过GET/POST完成
  • 浏览器渲染流程
    渲染

  • 了解webkit吗(如实的回答了,没看过源码,内部机制不是很了解)
    该看看这本书了《webkit技术内幕》

  • 数组去重

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14

    function unique(arr){
    var newArr = arr.filter(function(item,index,arr){
    return arr.indexOf(item) === index;
    });

    return newArr;
    }

    /* ES6 */

    function unique(arr) {
    return Array.from(new Set(arr));
    }
  • CDN(问了全称,还好记得~)

    CDN的全称是Content Delivery Network,即内容分发网络。其通过在用户和服务器之间增加Cache层,将网站的内容发布到最接近用户的网络的节点,使用户可以就近取得所需的内容,提高用户访问网站的响应速度
    CDN简单的来说就是存储一些静态文件的一台或多台服务器,通过复制,缓存等方式,将文件保存其中。
    CDN主要是通过接管DNS实现,将用户的请求引导到Cache上获得源服务器的数据。(智能调度DNS是CDN服务中的关键系统.当用户访问加入CDN服务的网站时,域名解析请求将最终由 智能调度DNS 负责处理.)
    对于普通的Internet用户,每个CDN节点就相当于一个放置在它周围的网站服务器.
    通过对dns的接管,用户的请求被透明地指向离他最近的节点,节点中CDN服务器会像网站的原始服务器一样,响应用户的请求.
    参考:http://cndefu.blog.163.com/blog/static/593931882011422115513240/

  • 类型转换

    举例说明js强制类型转换、隐式类型转换(PS:当时有点蒙,没反应过来强制类型转换指的啥,还好后面反应过来是Number()之类的)

    先列几个类型转换中的常用技巧:
    x+’’ 等价于 String(x)
    +x 等价于 Number(x)
    !!x 等价于 Boolean(x)

    • 强制类型转换
      指使用Number、String和Boolean三个构造函数,手动将各种类型的值,转换成数字、字符串或者布尔值。
    • 隐式类型转换
      以 * - + 来说,会对非数值应用Number()转型函数转换

      • Boolean true-1 false-0
      • null-0
      • undefined NaN
      • 字符串
        数字转换为十进制数值
        十六进制转换为相同大小的十进制
        空字符串转换为0
        剩下的转换为NaN
      • 对象 调用valueOf()方法,在依照上述规则,如果转为结果为NaN则调用对象的toString()方法
    • 以==操作符来说:

      • String == Boolean,需要两个操作数同时转为Number
      • String/Boolean == Number,需要String/Boolean转为Number
      • Object == Primitive,需要Object转为Primitive(具体通过valueOf和toString方法
      • undefined == null
  • 类型检测

  • ajax

问了jquery的ajax实现,还有对json的处理,跨域

  • 输入框只读
    readonly

  • 数组相关问题

这个问题每次都会被问到,特别是数组去重,还有注意ES5的兼容

  • 布局(左定宽,右自动)
    这个自己做过很多,所以答得还比较全

  • 类型判断

  • 后端修改数据,浏览器实时更新

一天面了3面,前两轮都是技术面,第二轮要求手写代码,第三轮是hr面,最后还有一个Boss面

  • angularJS
    路由原理,指令的执行过程,依赖注入的目的,与angularJS2的对比,它的MVVM之间的通信、与别的的框架VueJS/ReactJS对比,什么情况下不用双向数据绑定
  • restful API
  • 闭包
  • ES6
  • 写代码(排序、迭代Fabonacci)
  • hr面有会问一些逻辑题

最后的Boss面,问了一些逻辑题,还有喜欢看的书,感觉公司比较注重员工的学习习惯还有学习态度


一面非常细,面了一个多小时、js、Html5 、css都有问到,比较基础

二面 主要问了项目

三面 综合面,面试官人很好 ps:声音好好听啊,很年轻~
等待13号的笔试,求保佑~~
等结果中~