JavaScript:var、let、const详解

文章内容均为个人理解,如有不对,请大佬指正!

var和ES6的let、const有什么区别呢:
1、var声明的变量本身没有块级作用域的概念,可以跨块访问,但是不能跨函数访问,且声明变量的时候会有一个变量提升的过程
2、let、const声明后在同一个块级作用域不能在重复声明,并且在声明之前不能调用这个变量
3、const必需初始化值,且不能被再次赋值(注:基础类型值不能改变,引用类型是可以被改变的)

例子

  • 块级作用域

块级作用域是ES6新增的 {}、if和for的{}也有块级作用域

    //var
    {
      console.log(textName); // undefined
      var textName = '张三'
    }
    console.log(textName); // 张三

    //let
    {
      console.log(textAge); //报错 Cannot access 'textAge' before initialization
      let textAge = 19
      console.log(textAge); //19
      let textAge = 20 //报错 Identifier 'textAge' has already been declared
    }
    console.log(textAge) //报错 textAge is not defined

    //const
    {
      console.log(textAge); //报错 Cannot access 'textAge' before initialization
      const textAge = 19
      textAge = 15 //报错  Assignment to constant variable.
      let textAge //报错 Identifier 'textAge' has already been declared
    }
    console.log(textAge); //报错 textAge is not defined
  • var的变量提升
    //声明var变量的时候,有一个变量提升的过程,会把改变量提升到函数顶部(变量提升:这是JavaScript预编译的一个过程)
    function text() {
      var name = '孙悟空'
      if (true) {
        var age = 18
      }
    }
    text()
    //预编译后
    function text() {
      var name
      var age
      name = '孙悟空'
      if (true) {
        age = 18
      }
    }
    text()
  • const:为什么说基础类型值不能改变,引用类型是可以被改变的
    //基础类型的值是直接储存在栈内存里面的,
    const textName = '小明' //基础类型,值不可改变
    textName = '李四' //报错 Assignment to constant variable.
    /**
     * 引用类型的值并不是直接储存在栈内存,而是在里面储存一个内存地址,内存地址指向堆内存,
     * 修改obj.name、obj.sex的时候并没有修改内存地址,只是简单修改了内存地址指向堆内存的值
     */
    const obj = {
      name: '小美',
      age: 19,
      sex: '女'
    }
    console.log(obj); // {name: "小美", age: 19, sex: "女"}
    obj.name = '张三'
    obj.sex = '男'
    console.log(obj); // {name: "张三", age: 19, sex: "男"}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容