1、定义一个常量
const str = 'hi'
console.log(str)
str = 'hi wai'
console.log(str)
结果:报错,这是正常的
nodejs.TypeError: Assignment to constant variable.
对常量的赋值
2、定义一个json
const json = {
title: 'hi',
des: 'my des'
}
console.log(json)
json.title = 'hi wai'
console.log(json)
结果:不报错,还给变量里面的值改了
{
"title": "hi wai",
"des": "my des"
}
为什么呢?
const实际保证的并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。
对于简单的数据类型(数值,字符串,布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,在将一个对象或数组生命为const时,应该非常小心。
解决办法:
const json = Object.freeze({
title: 'hi',
des: 'my des'
})
console.log(json)
json.title = 'hi wai'
console.log(json)
结果:报错
nodejs.TypeError: Cannot assign to read only property 'title' of object '#<Object>'
无法修改对象“<object>”的只读属性“title”
Object.freeze()是ES5新增的特性,可以冻结一个对象,防止对象被修改。