美文网首页让前端飞Web前端之路前端从入门到放弃
var、let 和 const 区别的实现原理是什么

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

作者: 青山旁小溪边 | 来源:发表于2019-11-07 10:15 被阅读0次

问题

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

区别

首先先说下三者的区别

  1. var与let是可以声明变量,const不能声明变量,只能声明只读的常量。
  2. var声明的变量不存在块级作用域,他在全局内有效。let与const的声明只在其所在的代码块中有效。
  3. let/const不能在同一个作用域中声明相同变量/常量,var可以多次重复声明。
  4. var存在变量提升,所以var能先使用在声明,但是let const必须先声明再使用。
  5. let/const存在暂时性死区。
var a = 100;
if(1){
    a = 10;
    // 在当前块作用域中存在a使用let/const声明的情况下,给a赋值10时,只会在当前作用域找变量a,
    // 而这时,还未到声明时候,所以控制台Error:a is not defined
    let a = 1;
}
  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存储的变量是不可修改的,对于基本类型来说你无法修改定义的值,对于引用类型来说你无法修改栈内存里分配的指针,但是你可以修改指针指向的对象里面的属性。

相关文章

网友评论

    本文标题:var、let 和 const 区别的实现原理是什么

    本文链接:https://www.haomeiwen.com/subject/ugrmbctx.html