const声明常量以及冻结一个对象

时间:2021-10-25 08:37:04

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])
    }
  })
}