问题
var、let 和 const 区别的实现原理是什么?
区别
首先先说下三者的区别
- var与let是可以声明变量,const不能声明变量,只能声明只读的常量。
- var声明的变量不存在块级作用域,他在全局内有效。let与const的声明只在其所在的代码块中有效。
- let/const不能在同一个作用域中声明相同变量/常量,var可以多次重复声明。
- var存在变量提升,所以var能先使用在声明,但是let const必须先声明再使用。
- let/const存在暂时性死区。
var a = 100;
if(1){
a = 10;
// 在当前块作用域中存在a使用let/const声明的情况下,给a赋值10时,只会在当前作用域找变量a,
// 而这时,还未到声明时候,所以控制台Error:a is not defined
let a = 1;
}
- const声明时必须初始化赋值,一旦声明,其声明赋值的值就不允许改变,更不可以重复声明。
如 const 声明了一个复合类型的常量,其存储的是一个引用地址,不允许改变的是这个地址,而对象本身是可变的。
const a = 100;
const list = [];
list[0] = 10;
console.log(list);
// [10]
const obj = {a:100};
obj.name = 'apple';
obj.a = 10000;
console.log(obj);
// {a:10000,name:'apple'}
原理
JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。
- var
会直接在栈内存里预分配内存空间,然后等到实际语句执行的时候,再存储对应的变量,如果传的是引用类型,那么会在堆内存里开辟一个内存空间存储实际内容,栈内存会存储一个指向堆内存的指针。 - let
是不会在栈内存里预分配内存空间,而且在栈内存分配变量时,做一个检查,如果已经有相同变量名存在就会报错。 - const
也不会预分配内存空间,在栈内存分配变量时也会做同样的检查。不过const存储的变量是不可修改的,对于基本类型来说你无法修改定义的值,对于引用类型来说你无法修改栈内存里分配的指针,但是你可以修改指针指向的对象里面的属性。
网友评论