Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
hanyueqiang opened this issue Dec 24, 2020 · 0 comments
Open

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

hanyueqiang opened this issue Dec 24, 2020 · 0 comments

Comments

@hanyueqiang
Copy link
Owner

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存储的变量是不可修改的,对于基本类型来说无法修改定义的值,对于引用类型来说你无法修改栈内存里分配的指针,但可以修改指针指向的对象里面的属性

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant