工具:es5、栈内存、堆内存、冻结
浅述:遵循let规范基础上,const 定义的常量不可变
一、定义常量
//es5中定义常量
Object.defineProperty(window,'PI',{
value:3.14,
writable:false //是否可可重写
})
console.log(PI) //3.14
PI=5
console.log(PI) //3.14
//es6中定义常量
const a = 3.14
console.log(a) // 3.14
a= 5
console.log(a) //报错
二、用const定义对象或数组
const obj ={
name:'zhang',
age:21
}
console.log(obj) //{ name:'zhang',age:21 }
obj.skill='code'
console.log(obj) //{ name:'zhang',age:21, skill:'code'}
const arr = [1,2,3]
console.log(arr) // [1,2,3]
obj.push(4)
console.log(arr) // [1,2,3,4]
明显,定义对象和数组时,不再起作用。原因是数据类型原因
三、js的数据类型和堆栈
在js中,定义一个变量 ,变量可分为值类型和引用类型,常见如下:
1、值类型:number、string ...
2、引用类型:对象、数组
两者区别,值类型的栈内存存放的是变量值,而引用类型存放的值是此变量的值所在堆内存的地址,也就是说,引用类型的值存在堆内存中。const只是常量化了栈内存!修改引用类型的值时,并没有触及到栈内存,所以允许。
怎么让对象的值也不变?也就是说怎么不修改堆内存的值?
四、冻结
const obj ={
name:'zhang',
age:21
}
console.log(obj) //{ name:'zhang',age:21 }
Object.freeze(obj) 冻结
obj.skill='code'
console.log(obj) //{ name:'zhang',age:21}
const obj1 ={
name:'wang',
age:22,
dream:{
}
}
console.log(obj1) //{ name:'wang',age:22,dream:{ } }
Object.freeze(obj1) 冻结
obj.dream['free'] = true
console.log(obj1) //{ name:'wang',age:22,dream:{ free:true } }
冻结函数Object.freeze()可实现对象的值不变(堆内存的常量化),但只是浅层冻结,那么怎么深层冻结,如obj1中的dream
const obj1 ={
name:'wang',
age:22,
dream:{
}
}
console.log(obj1) //{ name:'wang',age:22,dream:{ } }
Object.freeze(obj1.dream) 深层冻结
obj.dream['free'] = true
console.log(obj1) //{ name:'wang',age:22,dream:{ } }
const obj1 ={
name:'wang',
age:22,
dream:{
free:{
}
}
}
console.log(obj1) //{ name:'wang',age:22,dream:{ free:{} } }
Object.freeze(obj1.dream.free) 深层冻结
obj.dream.free['area'] = 'China'
console.log(obj1) //{ name:'wang',age:22,dream:{ free:{} } }
只需要链式到那一层就可以了!