下面内容转载自:知乎网友趁你还年轻的回复(https://www.zhihu.com/question/60625915),非常形象生动,故而引用。
对于值是基本类型的变量,具有完全不可变性,地址和数据均不可变;对于值是引用类型的变量,数据具有部分不可变性,内存地址不可变,数据可变。
也就是说,使用const的定义的变量,牢牢地与value绑定在一起,而且这种绑定是不可解除的,但是这种绑定,指的是整体的绑定,也就是内存地址上的绑定。举例来说:const str = 'foo' ,‘str永远指向'foo'的内存地址;对于const obj ={name:'foo'},obj永远指向{}的内存地址,指向内容不包含对象数据。
做一个很形象的类比小故事:你的0岁到23岁
//刚出生的你,父母给予了生命的同时,给予了你一个名字 Jack,落地1岁 const you = {} you.name="Jack", you.age=1 //7岁,你上了小学 you.age = 7 //13岁,小学毕业,开始读初中 you.age = 13 , you.primary = true //16岁,初中毕业。开始读高中 you.age = 16 , you.junior = true //19岁,高中毕业,开始读大学 you.age = 19 , you.high = true //23岁,大学毕业,开始工作 you.age = 23 , you.university = true , you.salary = "RMB 100 yuan"
故事还在继续......
但是,你始终是你,你的父母始终是你的父母,即使到了66世纪,这是亘古不变的。但是在这一路上,你的age属性在发生变化,你解锁了小学,初中,高中,大学毕业证等一系列证书,工作后也新增了薪酬这个新属性,虽然只有可怜的100块。
或许有一天,you.girlfriend = 'Rose'
又或许有一天,you.baby = little Jack"
回过头来分析下刚出生的你const you = {name:"Jack",age:1}const不能重新定义:试问一下,在这个世界,你还能重新出生一次吗?
const必须赋初始值: const you = {}是一个整体,谁都不能少,因为你本身是一个完整的整体,在{}.prototype你遗传了父母的基因。
const不能重新赋值:you = {name:'Tom',age:18},据我所致,目前还没有什么技术可以实现克隆人的复制粘贴。
const复杂类型可变:name和age这些属性,则是后期为你新增的新属性,这些数据是有限且可变的,例如age,salary等等。
但是在另外一个世界,也就是另外一个作用域(块作用域或函数局部作用域),you can reborn const
a = 1 if(a === 1){ const a = 2 } //all is well const b = 1 function j(){ const b = 1 } //all is well
因此,当有那么一个object或者array时,就像故事中的you一样,无论风吹雨打,本质(内存地址不变)亘古不变时,极大程度上确保变量不被完全重新赋值时,就可以用const来定义。