之前用var声明变量,变量想怎么改就怎么改,这里const关键字也是声明变量的,不过声明的是常量,常量就是固定的一个值,不能改变,
例如:const name=“唐僧”;
name="老沙"// 报错 因为它要更改常量name
只在块级作用于起作用,和let关键字一样
if(true){
const age=20;
}
alert(age)//报错 age在代码块外不起作用
不存在变量提升,但必须提前声明,和let一样
if(true){
alert(age); //报错 使用时 未声明
const age=20;
}
不可重复声明同一个变量
var age=20;
const age=20;//报错 因为变量age已经存在
声明后要赋值,没有赋值要报错
const age=20;
const name;//报错。因为没有赋值;
常量是对象呢?
const obj={"name":"abc"};
obj.name="老沙“;
obj.age=20;
console.log(obj) //obj{name:"老沙“,age:20}
是不是有点奇怪。不是说const关键字定义的变量不能改变吗?怎么在这里改变了?而且还没有报错?不用担心,暂且一起往下看:
这个时候,我们先引入一个概念:在赋值过程中,我们可以分为传值赋值和传址赋值。这里我们用到了传址赋值,什么叫传址赋值?
传址:在赋值过程中,变量实际上存储的是数据的地址(对数据的引用),而不是原始数据或者数据的拷贝
var student1 = {"name":"张三"};
var student2 = student1;
student2.name = "李四";
console.log(student1);
//结果:输出 {name: "李四"}
console.log(student2);
//结果:输出 {name: "李四"}
为什么student2的name改成了“李四”,student1的那么也变成了“李四”呢?这就是传址赋值!
如果这样写的话就会报错:
const Person = {"name":"张三"};
Person.age = 20;
Person = {};
//错误,企图给常量Person赋新值(新地址)