在ES6中新增加了let和const,现在来看看他们的基本用法。
let:
1:不存在变量提升
var命令会发生“变量提升”现象,即变量可以先使用,再声明,值为undefined。这种现象多少是有点奇怪的,按照一般的逻辑,变量应该在声明语句之后才可使用。
为了纠正这种现象,let命令改变了语法行为,他所声明的变量一定要声明之后使用,否则直接报错。下面来看例子
eg:
//var情况
console.log(foo); //控制台会输出undefined
var foo=2;
//let情况
console.log(bar); //控制台直接报错
let bar=2;
2:暂时性死区
用let定义的变量,和它所在的作用域相绑定在一起,不再受外部的影响。
3:不允许重复声明
let不允许在相同作用域内重复声明同一个变量
const:
对于const命令,它声明了只读的常量。一旦声明,常量的值不能改变。const实质上保证的并不是变量的值不得变动,而是变量指向的那个内存地址不得改动,对于简单的数据类型(数值,字符串,布尔值)而言,值就保存在变量指向的内存地址中,因此等同于常量。但对于复合类型的数据(主要是对象和数组)而言,变量指向的内存地址保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,这完全不能控制。因此,将一个对象声明为常量时必须非常小心
eg:
const foo={}; //声明一个空对象
foo.prop=123; //给这个用const声明的对象增加prop属性
console.log(foo.prop); //控制台不报错,能正常输出123
let A={}; //再用let定义一个新数组
foo=A; //控制台报错,foo的地址不能被修改
如果想要将对象冻结,应该使用下述语句
const foo=Object.freeze({});
除了将对象本身冻结,对象的属性也应该冻结
let constantize=(obj)=>{
Object.freeze(obj);
Object.keys(obj).forEach((key,i)=>{
if (typeof obj[key]==='object'){
constantize(obj[key]);
}
})
};
网友评论