前言
js是弱类型的语言,我们能随意的定义变量和类型并且可以不受限制的修改,js内部会帮我进行处理,灵活性非常强。
但在某些场景下,我们希望定义一个变量或对象后,只能被使用而不能被修改,可以怎样实现呢?
常量
对于上面的问题,我们会很轻易的想到常量const,它是ES6中新增的关键字,用来定义一个常量(不可修改), 只不过对于基本类型和引用类型是有所区别的。
基本类型
const title = "hello world"
title = "hi world"
console.log(title)
可以看到定义的基本类型,重复定义会直接报错。
引用类型
const obj = {
title: "hello world"
}
obj.title = "hi world"
console.log(title) // hi world
而对于引用类型,是可以被修改的,这是因为const定义的引用类型,只是它的指针(内存地址)是固定的,而指向的引用对象(堆内存中)是可以被修改的,那么怎么让引用类型的变量也不能被修改呢?我们可以使用对象的冻结属性freeze()函数。
const obj = {
a: 1,
b: 2,
c: {
d: 3
}
}
const setFreeze = (obj) => {
Object.keys(obj).forEach(item => {
typeof obj[item] === 'object' && setFreeze(obj[item])
Object.freeze(obj)
})
}
setFreeze(obj)
obj.e = 5
console.log(obj.c.d) // 3
console.log(obj.e) // undefiend
obj.c.d = 4
console.log(obj.c.d) //3
从上面可以看出冻结对象后,新增属性读取值返回的是undefined,修改已有的值,读取时返回的还是原来的值。说明对象已经是不可被修改的了。