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()
本文来自博客园,作者:勤匠,转载请注明原文链接:https://www.cnblogs.com/JarryShu/p/16866021.html