在es6里面使用const的注意事项

976 阅读2分钟

在块作用域内使用const声明的变量不能改变块外var声明的变量。例如 ,下面const声明的x变量,不能改变块外var声明的x变量值。

const a=10;
{
    const a=2;------------报错
}

使用const声明变量时,必须在声明变量时就赋值,不能先声明变量再赋值。

   const a;--------------报错
   function getval(){
         a=10;
   }

使用const定义变量后,不能再通过赋值改变它的原始值,否则,会引发错误。

   const a=10;
   function getval(){
       a=12;----------------报错
   }

使用const定义的对象与定义变量不同,const定义的对象,可以更改对象的属性,也可以向对象添加属性。因为const对应的是对象的栈里面存储的地址,而不是堆里面存储的数据,所以对非基础类型它是可以修改值的。

    const obj={name:"张三",age:12};
    obj.name="李四"
    注意事项:一定要理解复杂类型的数据存储
    基础类型const a=12,在内存里面a指向栈里面的12。
    复杂类型const obj={name:12},在内存里面obj指向栈里面这个对象的地址,地址通过指针指向队里面的name:12值。
    所以说只要不直接改变栈里面的东西他就不报错。

使用const定义的数组,也可以通过下标来更改数组元素值,同时,还可以使用push()方法向数组添加元素。

   const arr=[1,2,3,4];
   arr[2]=12;
   解释:数组就是一个特殊的对象,他是object类型,所以同样适用上面对象的修改理论

使用const定义的数组、对象,虽然可以更改和添加数组、对象内的元素,但不能对数组、对象的变量名称再次进行赋值。但是不能再次通过字面量值修改对象和数组

   const obj={name:'李四'}
   obj={age:12}-----------报错
   
   const arr=[1,2,3,4,5]
   arr=[6,3]--------------报错
   这种方式相当于给变量直接赋值一个新的栈地址,所以错了
   总之,一旦用const定义了变量,栈里面的东西不能手动直接修改。

在同一作用域内,在已使用var或let定义的变量后,不能再使用const定义变量。但在不同的作用域,使用const重新定义变量是可以的。

    例一:
    {
        var a=12;
        const a=13;-----------报错
    }
    例二:
    {
        var a=12;
       
    }
     const a=13;-----------不报错

如果项目用typescript,那么请尽量使用const声明变量,这样的话就会避免很多不必要的bug。