JavaScript之常量
简单类型常量
众所周知 ES6 新增的 const 关键字可以用来声明常量。常量是块级作用域,很像使用 let 语句定义的变量。常量的值不能通过重新赋值来改变,并且不能重新声明。
1 | const name = 'zubin'; |
const 实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动,对于基本数据类型(Number、String、Boolean 等),值就保存在变量指向的内存地址,因此等同于常量。
对于复合类型(Object、Array 等)变量指向的内存地址,保存的只是一个指向实际数据的指针,const 只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。
1 | const foo = {}; |
复合类型常量
如果真的想将对象冻结,应该使用 Object.freeze 方法,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。该方法返回被冻结的对象。
1 | const foo = Object.freeze({}); |
除了将对象本身冻结,对象的属性也应该冻结。
1 | var constantize = obj => { |
参考文档
阮一峰:ECMAScript 6 入门
MDN:Object.freeze