ES6中const探秘

2020-11-24 09:16发布

    在ES6中,除了引入了非常好用的let之外,还引入了const,const 和 let 的作用域是一致的,不同的是 const声明的是一个只读的常量,一旦声明,常量的值就不能被改变,否则会报错,但是这并不意味着使用 const 声明的变量本身不可变,只是说它不可被再次赋值了,而且const 声明的变量必须经过初始化。

   

    但是,若const所声明的变量是一种复合类型,则const变量保存的是引用。因为复合类型(如数组和对象)的常量不指向数据,而是指向数据(heap)所在的地址(stack),所以通过 const 声明的复合类型只能保证其地址引用不变,但不能保证其数据不变。所以将一个对象声明为常量必须非常小心。


    简单数据类型(数值,字符串,布尔值):值保存在变量指向的那个内存地址,因此等同于常量。


    复合类型的数据(对象和数组):变量指向的是内存地址,保存的是一个指针,const只能保存这个指针地址是固定的,至于他指向的数据结构是不是可变的,就完全不能控制了。

    

    那么,如果希望声明的常量类型(复杂类型)不被改变,该如何做呢?

    则可以使用Object对象的freeze()方法,将const声明的常量指向一个冻结的对象即可。