let和const

let 可修改的变量

定以后可随时修改

let {log} = console
let a = 1
a = true
log(a); //true
a = 'a'
log(a) //a
a = null
log(a) // null
a = undefined
log(a) // undefined

const 不可修改的常量

一经定义,无法“修改”,这种修改只针对于基本类型,对于数组,对象类型无效

let {log} = console
const a = 1
a = true
log(a); // 报错TypeError: Assignment to constant variable.

上述是基础类型,那么对于对象类型,const就起不到很强的限制作用
例1


let {log} = console
const car = {
    price:93000,
    type:'奇瑞QQ',
    max_velocity:200,
    on_sale:false
}
log(`型号:${car.type} 车价:${car.price} 最高速度:${car.max_velocity} 在售:${car.on_sale}`)//型号:奇瑞QQ 车价:93000 最高速度:200 在售:false

car.price = 100000 // 车价修改为十万
log(`车价:${car.price} `)//车价:100000 
car.max_velocity = 180 //最高速度修改200->180
log(`最高速度:${car.max_velocity}`)//最高速度:180

例2

let {log} = console
const items = []
items.push('a','b','c','d')
log(items)//[a,b,c,d]
items.push(1,2,3,4)
log(items)//[a,b,c,d,1,2,3,4]
items.push(false,true)
log(items)

知识点

  • 对象内部的属性,const无法限制
  • 数组内部的元素,const无法限制
  • let定义的无论任何数据类型,都可以随便修改

那么const对于对象和数组,具备什么限制呢?

例1

const items = ['a','b','c','d']
items = [3,2,1,3]//报错TypeError: Assignment to constant variable.

例2

let {log} = console
const car = {
    price:93000,
    type:'奇瑞QQ',
    max_velocity:200,
    on_sale:false
}
car = {
    price:140000,
    type:'大众宝来',
    max_velocity:280,
    on_sale:true
} //报错TypeError: Assignment to constant variable.

知识点

  • const只能限制对象或数组整体修改
    这个知识点传递出来的理论让人很模糊,感觉很难理解,我来说说我对这个知识点的理解,希望可以帮到你

内存分为堆和栈,堆存储的是存放使用new创建的对象,全局变量,栈存储的内容是存放基本类型的变量数据和对象的引用;代码中申明一个变量(无论是java,JavaScript,Ts),栈中会开辟一个内存空间,用于存储这个变量的值,如果变量是普通类型,比如number,string或者bool,那么这个值存储在刚被开辟出来的栈空间中
那么对象呢,对象的所有实际数据存储在堆内,栈也会开辟一块空间,这块空间存储一个指针用于指向堆内的空间,这么说就可以解释了为什么修改const定义的数组的元素和对象的属性时不会有问题,而重新赋值就会报错;所以你明白了没?const限制修改栈中的数据,不限制修改堆内的数据
那么如何彻底限制修改堆内的数据呢?ES当然提供了解决方案——Object.freeze()

posted @ 2022-11-07 15:04  勤匠  阅读(18)  评论(0编辑  收藏  举报