const
ES6 中新增的命令,用于声明一个常量。一旦声明,常量的值就不能改变。且声明时必须初始化,不能留到以后赋值。const的作用域与let命令相同:只在声明所在的块级作用域内有效。
实现
实现之前我们必须分解一下const的功能都有哪些
- 变量一经声明便不可更改
- 变量是否是关键字
- 不能重复定义
- 变量名是否为数字
顺着这个思路,我们实现的代码如下:
// by:IU
//定义一个常量
function constCustomer(param,value){
var _global = window;
var KEY_WORD = ['const', 'let', 'var','class', 'return']; //关键字列表(不全)
var REG_NUMBER = '^[1-9][0-9]*([.][0-9]+)?$|0' ; //数字正则表达式
var _reg = new RegExp(REG_NUMBER)
// 检测是否已经定义,定义则抛出错误
if(_global.hasOwnProperty(param)) {
throw new Error(`${param} has already been declared !`);
}
//检测键值是否存在并且被支持
if(!param||_reg.test(parseFloat(param))||KEY_WORD.indexOf(param) > -1) {
throw new Error(`Unexpected token: ${param}`);
}
_global[param] = value
// 劫持该常量&&不可修改
Object.defineProperty(_global,param,{
enumerable:false,
configurable: false,
get:function(){
return value
},
set:function(data){
if(_global.hasOwnProperty(param)){
throw new Error(`${param} is read-only!`);
}
return data
}
})
}
// 定义测试
constCustomer('winName','tieniu')
console.log('winName',winName)
// 重复声明测试
// constCustomer('winName','JionChao')
// console.log('winName2',winName)
// 字母&&数字变量名测试
// constCustomer('xxx123',1)
// 纯数字测试
constCustomer('123',1)