深入理解 JS|青训营笔记

58 阅读3分钟

值和类型

类型说明
number数字
bigint大整数
string字符串
boolean布尔值
undefined未定义
null空值
object对象
symbol唯一值
  1. 原始值:原始值存储在栈中。变量赋值传递时会创建该值的副本,两个变量(复制与被复制)完全独立。

    原始值类型:undefinednullbooleannumberstringsymbolbigint

  2. 引用值:引用值存储在堆中。变量赋值传递时会复制其引用地址,两个变量(复制与被复制)会指向同一个对象,对象数据的修改会同时反映到两个变量上。引用值类型:object

闭包和作用域

闭包:一个函数其内部访问了父级作用域的自由变量,那么这个函数可以称之为闭包。

作用域的类型分为三种:

  1. 全局作用域
  2. 函数作用域(function函数体内 )
  3. 块级作用域(letconst声明存在块级作用域)

作用域链:由执行上下文中的变量对象逐级构成。特点如下:

每个环境都可以根据作用域链逐级向上查找变量和函数名;

任何环境都不能根据作用域链逐级向下查找变量和函数名。

this 指向问题

按照以下准则去解决this指向问题。实际上我们只需分析以下这两种函数:

  1. 对于非严格模式下的普通函数会有两个情况:

    1.1 作为对象方法,this会绑定对象(执行new绑定过程)。

    1.2 不作为对象方法,在非严格模式下this默认绑定window

  2. 箭头函数没有this。按规则继承最近一层普通函数或全局作用域的this

注意:call/apply/bind方法不能改变箭头函数的this指向,因为箭头函数本身没有this

原型链和继承

构造函数:用于生成实例对象。构造函数可分为两类:

  • 自定义构造函数:function foo () {}
  • 原生构造函数:function Function () {}function Object () {}

实例对象:由构造函数通过new关键字所生成的对象。如:new Function()

原型对象:每个构造函数都有自己的原型对象,可通过prototype访问。

三者的关系:构造函数可以通过prototype访问其原型对象,而原型对象可通过constructor访问其构造函数。构造函数可通过new关键字创建实例对象,实例对象可通过__proto__ 访问其原型对象。

隐式原型__proto__ 指的就是隐式原型;又被称为原型链。而由构造函数所生成的实例对象会经过该路径自底向上找到所有可匹配的原型方法和属性。

垃圾回收机制(V8)

关于垃圾回收机制,推荐掘金上一个写的比较好的文章:深入理解Chrome V8垃圾回收机制

事件循环机制

任务类型说明

同步任务:任务不会造成流水线阻塞,瞬间就能完成。这些任务定义为同步任务。

异步任务:任务可能会造成流水线阻塞,需要时间才能完成。这些任务定义为异步任务。

其中异步任务又分为微任务和宏任务,其中微任务优先于宏任务执行

执行栈和队列

执行栈:同步代码会首先归类到此处待执行。按照代码的书写顺序(从上到下)入栈。

微任务队列:异步中的微任务代码归类到此处。当执行栈为空时,微任务会出队进入执行栈。

宏任务队列:异步中的宏任务代码归类到此处。当微任务队列为空时,宏任务会出队进入执行栈。

任务执行顺序

  1. 同步(new Promise()、async关键字、console对象方法)
  2. process.nextTick(node.js环境)
  3. 微任务(异步)(Promise().then()、await 后面的语句)
  4. 宏任务(异步)(定时器函数、<script>脚本、I/O、UI交互事件)
  5. setImmediate(node.js环境)(当前事件循环结束后执行)