1、const命令作用是声明一个不会变的常量
注意:一但声明,不可再改变这个值,而且在声明时就需要初始化好值。
<script>const a = 'a';const b; //error Missing initializer in const declaration{const c = 'c';}console.log(a); //aconsole.log(b);console.log(c); //error c is not defined</script>
2、var、let、const的区别
- var关键字
- var作用域是函数级
- var存在变量提升,即可以先使用再定义
- let关键字:
- let作用域是代码块(花括号级的作用)
- let不存在变量提升,即要先定义再使用
- let不可以重复声明
const关键字
- const作用域是代码块(花括号级的作用),和let一样
- const不存在变量提升,即要先定义再使用,和let一样
- const不可以重复声明,和let一样
- const定义时就要初始好值
-
2、关于const“可变”
上面说了,const是定义常量不可变,但在很多情况下我们发现const却是“可变”的,如下代码:
<script>const arrays = [1,2,3,4,5,6,7];arrays.push(8);console.log(arrays);const set = new Set();arrays.forEach(item=>{set.add(item);});for(let item of set){console.log(item);}console.log(set);const user = {name:'name',age:18}user.age = 80;console.log(user);</script>
这是为什么呢?实际上这是因为const保证的不是变量的值不变,而是变量指向的那个内存地址所保存的数据不能改变。对于基本数据类型,值就保存在变量指向的那个内存地址,所以用const定义的基本数据类型的值是不能改变了,而对于数组和对象,它们属于引用数据类型,变量保存的只是一个指向实际数据的指针,而这个指针指向的内存地址才是真正保存数据的值的地方,所以const只能保证这个指针不能变,但不能保证他所指向的这个内存地址里面的值不能变。
ps:概括一下,基本数据类型,变量直接就保存了内存地址;引用数据类型,变量保存一个指针,指针指向内存地址。
