js基础知识总结

78 阅读4分钟

1、关于this

this表示谁来调用,当前执行这个逻辑的主体。如果是对象来调用,this就是调用的对象。如果没有人调用直接执行,在非严格模式下this是window(global),在严格模式在,this是undefined或null。如果在事件绑定的时候,this就是绑定的元素。

2、New一个新对象时具体做了什么

  1. 创建一个新对象:let obj= { }

  2. 新对象的_proto_属性指向构造函数的原型,这样新对象就拥有了构造函数中的方法

3)执行构造函数中的代码,将属性添加给this新对象

  1. 返回新对象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指向。