美文网首页让前端飞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