frontEnd_book icon indicating copy to clipboard operation
frontEnd_book copied to clipboard

var、let 和 const 区别、实现原理是什么

Open hanyueqiang opened this issue 4 years ago • 0 comments

var、let 和 const区别

  • var: 遇到有var的作用域,在任何语句执行前都已经完成了声明和初始化,也就是变量提升而且拿到undefined的原因由来
  • let:解析器进入一个块级作用域,不会挂在顶层对象下面,变量只是先完成声明,并没有到初始化那一步。此时如果在此作用域提前访问,则报错xx is not defined,这就是暂时性死区的由来。等到解析到有let那一行的时候,才会进入初始化阶段。如果let的那一行是赋值操作,则初始化和赋值同时进行
  • const: 声明之后必须马上赋值,否则会报错,简单类型一旦声明就不能再更改,复杂类型(数组、对象等)指针指向的地址不能更改,内部数据可以更改,例如Array.push(1)或者Obj['key']=1,命令声明的常量不提升,存在暂时性死区,只能在声明的位置后面使用
  • function: 声明、初始化、赋值一开始就全部完成,所以函数的变量提升优先级更高

实现原理

  • var:直接在栈内存里预分配内存空间,然后等到实际语句执行的时候,再存储对应的变量,如果传的是引用类型,那么会在堆内存里开辟一个内存空间存储实际内容,栈内存会存储一个指向堆内存的指针

  • let: 是不会在栈内存里预分配内存空间,而且在栈内存分配变量时,做一个检查,如果已经有相同变量名存在就会报错

  • const:也不会预分配内存空间,在栈内存分配变量时也会做同样的检查。不过const存储的变量是不可修改的,对于基本类型来说无法修改定义的值,对于引用类型来说你无法修改栈内存里分配的指针,但可以修改指针指向的对象里面的属性

hanyueqiang avatar Dec 24 '20 02:12 hanyueqiang