var
- 有变量提升
- 没有块的概念,可以跨块访问;作用域只存在于函数中,不可以跨函数访问
- 可以重复声明
let
- 有块级作用域
- let 也有变量提升,但是 var 声明的变量会被赋值 undefined,let 和 const 声明的变量不会被初始化
- 存在暂时性死区。在块级作用域内,let 声明之前的部分被称为暂时性死区,暂时性死区内不可以使用 let 声明的变量
- 不允许重复声明
- let 不会在全局声明时创建 window 对象的属性
const
- 具备 let 所具有的上述特性
- 一旦声明必须立即赋值
- 声明之后值不可以改变。(对于引用类型的变量而言,指的是它的地址不能发生改变)
Object.freeze()
既然 const 对于引用类型只能确保地址不变,那么怎样才能使得声明的引用类型变量上的值无法改变呢?
这里我们可以使用 Object.freeze()
方法递归解决
1 | const myFreeze = obj => { |