1、关于this
this表示谁来调用,当前执行这个逻辑的主体。如果是对象来调用,this就是调用的对象。如果没有人调用直接执行,在非严格模式下this是window(global),在严格模式在,this是undefined或null。如果在事件绑定的时候,this就是绑定的元素。
2、New一个新对象时具体做了什么
-
创建一个新对象:let obj= { }
-
新对象的_proto_属性指向构造函数的原型,这样新对象就拥有了构造函数中的方法
3)执行构造函数中的代码,将属性添加给this新对象
- 返回新对象obj
手写new
function new(clazz, ...args){
let obj = {};
obj.__proto__ = clazz.prototype;
clazz.call(obj, ...args);
return obj;
}
let zhangsan = new(Person, 'zhangsan', 10);
3、什么是高阶函数
一个函数的参数是函数(回调函数),一个函数返回的是一个函数(函数柯里化)
函数柯里化:把一个函数的范围缩小,让函数变得更具体一些。
函数反柯里化:让一个函数的范围变大
4、判断类型的四种方法
-
typeof:校验数组、对象返回的都是object,其他类型可判断出来
-
object.prototype.tostring.call:不能校验自定义类型
-
cunstructor: 属性返回对创建此对象的数组函数的引用
-
instanceof:可以校验A是否属于B的实例,但是他不可以校验原始类型
5、什么是纯函数
如果函数的调用参数相同,则永远返回相同的结果,它不依赖于程序执行期间函数外部任何状态或者数据的变化,必须只依赖于其输入的参数。
6、类
1)类的三种属性:公有属性(__proto__,每个人都有的方法,所有实例都可调用共有属性),私有属性(实例自带),静态属性(静态方法。static)
2)类的继承
-
继承私有属性
function Parent(){ this.name = 'parent; }; Parent.prototype.eat = function(){ console.log("eat"); } function Child(){ this.age = "9"; Parent.call(this); // 此方法可继承类的私有属性 } let child = new Child()
-
继承公有属性
Child.prototype = Object.create(Parent.prototypr);
-
继承公有属性和私有属性
Child.prototype = new Parent()
new的实例会先找私有属性再找公有属性,类只能new,类可以继承共有、私有和静态方法。
Class类,继承父类的私有属性用 extends,继承共有属性用super()相当于parent.call()
7、关于call
-
可以改变当前函数的this指向
-
会让当前函数执行
-
手写call
Function.prototype.call = function(context){ context = context? Object(context) : windown; context.fn = this; let args = []; for(let i=1;i<arguments.length;i++){ args.push(''arguments'+i+']')
} let r = eval('context.fn('+args+')'); delete context.fn; return r
}
8、什么是栈
1)栈可以是一种数据结构:栈(先进后出),队列(先进先出)
2)栈还可以是代码的运行方式
3)栈还可以是一个存储区域
- 栈:是有结构的,每个区域按照一定的顺序放,可以明确知道每个区域的大小
- 堆:是没有结构的,数据可以任意放,因此栈的寻址速度要快于堆,堆内存中存储不固定的内容,当声明的变量为对象时栈内存中存储的是引用地址,这个地址指向堆内存中的内容。
- 栈中存放有固定大小的数据,比如js中的基本数据类型,堆中存放大数据,比如对象。
- 原始值类型存放在栈中,可以直接按值访问,引用类型存储在堆中,按照引用来访问。
9、深拷贝与浅拷贝
... 运算符在只有一层时是深拷贝,多层的时候是浅拷贝
slice()是浅拷贝
10、执行上下文
当函数运行时,会创建一个执行环境,这个环境叫做执行上下文文。执行上下文是一个对象,执行上下文里面会创建一个变量对象(variable object VO)里面存放的是当前函数执行要用到的变量,基本数据类型保存在变量对象里,引用数据类型要单独在堆内存里开辟空间保存,变量对象里面保存的就是堆里的地址
11、执行上下文栈
每次函数执行,都会产生一个执行上下文,栈是一个数据,里面放着很多执行上下文,执行上下文也成为了调用栈,全局上下文的VO也被称为GO(global object、)全局对象,全局对象上的属性可以在任何地方被访问。在浏览器端GO就是VO就是windown。
12、激活对象(AO)
在函数的调用栈中,如果当前执行上下文处于函数调用栈的顶端,则意味着当前上下文处于激活状态,此时的变量对象也被称为活动对象,活动对象包含变量对象的所有属性,并且多一个this指向。