let和var的区别
1 用let 会产生变量提升的问题
2 let 声明函数存在暂时性死区问题
3 let 不允许重复声明变量
4 let存在于块级作用域{}中,var在块级作用域之外也能访问
5 最外层用var 声明的变量是全局变量(window),用let不是
const的特性和let基本一致,但是const是用于声明常量的
const声明的是常量即不可变量,但实际上,如果const声明的是一个对象,我们是可以改变对象内部的属性的。原因是,const实际上保证的不是变量的值不被改动,而是内存地址不被改动,对于基本数据类型而言,变量保存的地址就是栈地址,是不可以被改变的。但是对于引用类型来说(对象和数组),变量保存的地址是一个堆内存的指针,const只可以保证指针是固定的(堆内存地址),但是如果对象的值改变了是控制不了的,所以将一个引用类型用const声明常量是要注意的。
所以,如果要声明一个对象为常量,我为大家提供一个冷冻对象的方法,这里用到es6的Object.freeze(冷冻对象)方法:
/** * 冻结对象(声明一个不可修改的对象) * @param {*} obj 需要冻结的对象 * 返回值:被冻结的对象 * jsHelper.freezeObj({num:1}) */ freezeObj(obj){ Object.freeze(obj); //首层冻结 Object.keys(obj).forEach((key,i)=>{ //深层递归冻结 if(this.typeOf(obj[key]) === 'object'){ this.freezeObj(obj[key]) } }) return obj; }
//用法
const obj = freezeObj({name:'panda'})