三、const常量声明方式

275 阅读1分钟

cosnt是es6中常量的声明方式,声明方法和var、let声明方式一样,但是有点不同的是,const声明方式必须立即初始化变量,并且也不能在后面改变他的值

const foo; // SyntaxError: Missing initializer in const declaration

下面这个改变值也会报错

const foo = 1;
foo = 2; // TypeError: Assignment to constant variable

常量也是块级作用域,以下演示

function func() {
    if (true) {
        const tmp = 123;
    }
    console.log(tmp); // Uncaught ReferenceError: tmp is not defined
}
func();

总是说const申明的常量是不可变的,并不意味着是不管怎样都不能改变 其实在js中基本数据类型==Undefined、Null、Boolean、Number 和String==
用const声明方式的值是不能改变的,但是如果的引用类型,如对象,那里面的值是可以改变的

const foo = {};
foo['prop'] = "Moo"; // This works!
console.log(foo);

如果想要foo不会被改变,可以使用Object.freeze(obj) 当我们冻结一个对象的值的时候,这个对象我们不能改变,不能添加值和改变属性,例下所示:

const foo = Object.freeze({});
foo.prop = 123;
console.log(foo.prop) // undefined

上面这样使用不会报错,但是在严格模式下"use strict",那就不一样了

"use strict";
const foo = Object.freeze({});
foo.prop = 123; // SyntaxError: Cannot add property prop, object is not extensible

总结

const的一个重要点是变量是不可变的,而不是变量指向的值。所在在对象中是改变它的属性值的,如果想要它不可变,可以在"use strict"使用Object.freeze(…​)