首页 > 建站教程 > JS、jQ、TS >  const的意义:保证变量指向的内存地址不发生变化正文

const的意义:保证变量指向的内存地址不发生变化

1584960098879114.jpeg


下面内容转载自:知乎网友趁你还年轻的回复(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来定义。