20道大厂面试
- New 的实现原理:
- 实例化一个新对象,添加新对象方法和属性;继承原型链;
- 正确判断this的指向:
- 正常:谁调用this就指向谁;
- 技巧:
- 全局环境中的this;this=window;
- 是否是 new绑定;指向新对象:function Super(age){this.age=age};let xx=new Super('26');xxx.age//26
- function Super(age){this.age=age;let obj={a:2}return obj};let xx=new Super('26');xxx.age//undefined//{a:1}
- (显示绑定)函数是否通过call apply bind绑定;指向绑定对象;.bind(thisArg,)()
- 隐式绑定;谁调用this就指向谁
- 默认绑定:谁调用this就指向谁
- 箭头函数:看上下文绑定,谁调用this就指向谁
- Const fn={
num:10;
aaa(){
return this.num*2
},
bbb()=>this.num*4//指向window
};
Fn.aaa();//20
Fn.bbb();//NaN;
================================
Obj.fn{…..}//指向obj
- 深拷贝和浅拷贝区别?实现一个深拷贝:
- 深拷贝和浅拷贝针对复杂的数据类型来说的。浅拷贝只拷贝一层,而深拷贝是层层拷贝。
- 深拷贝:复制变量值,对于非基本类型的变量,则递归至基本类型变量后,在复制。深拷贝后的对象与原来对象完全隔离互不影响,一个对象修改并不会影响到另一对象;
- Json.parse(json.stringify(obj))//属性值非函数;不能拷贝原型链上的属性;忽略symbol和undefinen;
- 实现一个deepClone函数:
- 如果是基本数据类型,直接返回;
- 如果是regExp或者Date类型,返回对应类型;
- 如果是复杂数据类型,递归;
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)}
}
}
- 浅拷贝:将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实际复制的是其引用,当引用指向的值改变时也会跟着改变。
- For in
- Let obj2=Object.Assign({},obj1);
- Let obj2=object.create(obj1)
- Let obj3={…obj1};
- Call/apply实现原理:
- 都是改变this的指向,并且立即执行,只不过传参不同。
- .call(thisArg,arg1,arg2,arg3);原理:
- 依赖函数原型上的方法call()
- 如果第一个参数不传,默认指向window;传入则thisArg.func(){}//obj.foo(this.指向obj);
- .apply(thisArg,[args]);原理:雷同.call
- 柯里化函数实现:
- 把接收多个参数的函数变换成接受一个单一参数的函数,并且返回接受余下的参数而且返回结果的新函数的技术。?????Add(1,2,3,4)=>add(1)(2)(3)(4)
一种设计思想,主动掌握函数的控制权,根据我们的需要设计相应的触发机制(函数生成函数,函数去调F函数)
- 如何实现(a==1&&a==2&&c==3)都为true:
- 利用数据劫持es6新增了 proxy
let a=new proxy(){
i:1,
get:function(){return ()=>this.i++};
}; - 数组的toString接口默认调用数组的join方法,重写join方法:
Let a=[1,2,3];
a.join=a,shift;
- 对象object转为原始类型的调用方法:
- 先看是否部署 [symbol.toPrimitive];
- 否:根据转换的类型,先调用valueof/tostring
- Var obj={
[symbol.toprimitive](){return 1},
valueOf(){return 2},
toString(){return 3}
}
- 什么是BFC?规则?如何创建BFC?
- Box formatting context:
- 异步加载Js脚本的方式有哪些?