frontEnd_book
frontEnd_book copied to clipboard
var、let 和 const 区别、实现原理是什么
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
存储的变量是不可修改的,对于基本类型来说无法修改定义的值,对于引用类型来说你无法修改栈内存里分配的指针,但可以修改指针指向的对象里面的属性