const
总结一下昨天的:
◆ const声明一个只读的常量,一旦声明,常量的值就不能改变
◆ const一旦声明变量,就必须立即初始化,不能留到以后赋值,不然会报错
◆ 只在声明所在的块级作用域内有效
◆ const命令声明的常量也是不提升,存在暂时性死区,并且只能在声明的位置后面使用
◆ const声明的变量不可重复声明
本质
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于敞亮。
但是对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针。const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于他指向的数据结构是不是可变的,就完全不能控制了。
因此,将一个对象声明为变量要非常的小心。
const foo = { };
//为foo添加一个属性,可以成功
foo.prop = 123;
foo.prop //123
//将foo指向另一个对象,就会报错
foo = { };// TypeError: "foo" is read-only
const a=[ ];
a.push('Hello');//可执行
a.length = 0;//可执行
a = ['Dave'];//报错
//常量a是一个数组,这个数组本身是可写的。
//如果将这另一个数组赋值给a,就会报错
如果真的想将对象冻结,应该使用Object.freeze方法
const foo = Object.freeze({})'
//常规模式时,下面一行不起作用;
//严格模式时,改行会报错
foo.prop = 123;
//常量foo指向一个冻结的对象,所以添加新属性不起作用,严格模式时还会报错。
还有将对象彻底冻结的函数: