在块作用域内使用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。