js中一旦被定义就无法再被修改的变量,称之为常量
在es6之前,定义变量不管是静态还是动态都用var,例如:
var PI = Math.PI;
PI = 100;
console.log(PI) //100
但是这样会有一个弊端,像原本并不想改变的值,如果写错了代码,可能就改变了,造成了错误。如上,圆周率PI是固定的值,这里的误操作给他赋值了100,这样以后再用到圆周率PI来计算的时候就造成了错误。于是es6优化了常量的定义,避免了更改它而产生错误。
ES6中通过const定义常量,常量通常用大写字母定义,多个单词之间用_分隔。
const定义常量的特点:
1 如果修改常量会报错
const PI = Math.PI;
PI = 100;
console.log(PI)
2 常量不支持声明前置
console.log(PI);
const PI = Math.PI;
3 常量是一个块作用域
if (true) {
const COLOR = 'red';
}
console.log(COLOR)
那么,在es5中如何定义一个不可改变的常量呢?
在ES5中,可以冻结一个对象来定义常量来达到const定义常量的效果。
// 在ES5中通过冻结对象定义常量
var CONST = {
MAX_NUM: 100,
MIN_NUM: 10
}
Object.freeze(CONST);
// 尝试更改
CONST.MAX_NUM = 200;
console.log(CONST.MAX_NUM) //100
在ES5之前,定义常量,只能通过单例模式。只定义取值器,不定义赋值器,即可实现。
// 单例模式
var CONST = (function () {
// 定义静态变量的容器
var _const = {
MAX_NUM: 500,
MIN_NUM: 100
}
// 返回的接口中,只定义取值器
return function (key) {
return _const[key.toUpperCase()]
}
})()
// 取值
console.log(CONST('MAX_NUM')) //500
console.log(CONST('min_num')) //100