20道大厂面试


  1. New 的实现原理:
    1. 实例化一个新对象,添加新对象方法和属性;继承原型链;
  1. 正确判断this的指向:
    1. 正常:谁调用this就指向谁;
    2. 技巧:
      1.   
      2. 全局环境中的this;this=window;
      3.   
      4. 是否是 new绑定;指向新对象:function  Super(age){this.age=age};let xx=new        Super('26');xxx.age//26
      5.   
             
        1. function          Super(age){this.age=age;let obj={a:2}return obj};let xx=new         Super('26');xxx.age//undefined//{a:1}
        2.   
          
      6. (显示绑定)函数是否通过call apply bind绑定;指向绑定对象;.bind(thisArg,)()
      7.   
      8. 隐式绑定;谁调用this就指向谁
      9.   
      10. 默认绑定:谁调用this就指向谁
      11.   
      12. 箭头函数:看上下文绑定,谁调用this就指向谁
      13.   
             
        1. Const  fn={
        2.   

    num:10;
     aaa(){
         return   this.num*2
     },

    bbb()=>this.num*4//指向window
};

Fn.aaa();//20

Fn.bbb();//NaN;

================================

Obj.fn{…..}//指向obj

  1. 深拷贝和浅拷贝区别?实现一个深拷贝:
    1. 深拷贝和浅拷贝针对复杂的数据类型来说的。浅拷贝只拷贝一层,而深拷贝是层层拷贝。
    2. 深拷贝:复制变量值,对于非基本类型的变量,则递归至基本类型变量后,在复制。深拷贝后的对象与原来对象完全隔离互不影响,一个对象修改并不会影响到另一对象;
      1.   
      2. Json.parse(json.stringify(obj))//属性值非函数;不能拷贝原型链上的属性;忽略symbol和undefinen;
      3.   
      4. 实现一个deepClone函数:
      5.   
             
        1. 如果是基本数据类型,直接返回;
        2.    
        3. 如果是regExp或者Date类型,返回对应类型;
        4.    
        5. 如果是复杂数据类型,递归;
        6.   

Function deepClone(obj1,hash=new WeakMap()){
        if(obj1 instanceof RegExp) return new regExp(obj1);

        if(obj1 instanceof Date)return new Date(obj1);

        if(obj1===null||typeof obj1!=='object'){return obj1};

        let t=new obj1.constructor();

          hash.set(obj,t);

         for(let key in obj1){

          if(obj1.hasownproperty(key)){t[key]=deepClone(obj1[key],hash)}

      }

}

  1. 浅拷贝:将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实际复制的是其引用,当引用指向的值改变时也会跟着改变。
    1. For  in
    2. Let obj2=Object.Assign({},obj1);
    3. Let obj2=object.create(obj1)
    4. Let obj3={…obj1};
  1. Call/apply实现原理:
    1. 都是改变this的指向,并且立即执行,只不过传参不同。
    2. .call(thisArg,arg1,arg2,arg3);原理:
      1.   
      2. 依赖函数原型上的方法call()
      3.   
      4. 如果第一个参数不传,默认指向window;传入则thisArg.func(){}//obj.foo(this.指向obj);
    3. .apply(thisArg,[args]);原理:雷同.call
  2. 柯里化函数实现:
    1. 把接收多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数而且返回结果的新函数的技术。?????Add(1,2,3,4)=>add(1)(2)(3)(4)

一种设计思想,主动掌握函数的控制权,根据我们的需要设计相应的触发机制(函数生成函数,函数去调F函数)

  1. 如何实现(a==1&&a==2&&c==3)都为true:
    1. 利用数据劫持es6新增了 proxy
                  let       a=new proxy(){
                    i:1,
                  get:function(){return ()=>this.i++};
                  };
    2. 数组的toString接口默认调用数组的join方法,重写join方法:

Let a=[1,2,3];

a.join=a,shift;

  1. 对象object转为原始类型的调用方法:
    1. 先看是否部署  [symbol.toPrimitive];
    2. 否:根据转换的类型,先调用valueof/tostring
      1.   
      2. Var        obj={
                                [symbol.toprimitive](){return 1},
                      valueOf(){return 2},
                      toString(){return 3}
                      }
  1. 什么是BFC?规则?如何创建BFC?
    1. Box       formatting context:
  2. 异步加载Js脚本的方式有哪些?