const
是ES6新增加的关键字,作用是声明一个只读变量。这个变量指向的内容地址是不可以改动的。
const a = 1
a = 4 // TypeError: Assignment to constant variable.
和let
一样,它也有暂时性死区和块级作用域的特性。
// 暂时性死区
console.log(b) // ReferenceError
const b = 2
// 块级作用域
if (true)
{
const c = 2
}
console.log(c) // Uncaught ReferenceError: MAX is not defined
const
声明的值是基础数据类型(Number,String,Boolean),那么这个变量的值就不可以改变。如果值是复合类型(主要是对象和数组),那么里面的属性或者每一项则可以改变。因为const只能保证这个指针是固定的,但是指向的数据结构则不可以控制。
const d = {}
d.name = '123'
console.log(d.name) // '123'
d = {} // TypeError: "d" is read-only
const f = []
f.push('123') // ['123']
console.log(f) // ['123']
f = [] // Uncaught TypeError: Assignment to constant variable.
如果想要将一个对象给锁死,应该使用Object.freeze
const e = Object.freeze({})
// 常规模式时,下面一行不起作用
// 严格模式时,该行会报错 Uncaught TypeError: Cannot add property name, object is not extensible
e.name = '123'
如果想要彻底锁死,应该将对象下面的所有属性锁死
function freezeObj(obj) {
Object.freeze(obj)
Object.keys(obj).forEach(function (v) {
if (typeof obj[v] === 'object') {
freezeObj(obj[v])
}
})
}