深入浅出ES6之let和const命令
let和const声明的变量只在代码块内有效
{ leta=10; varb=1; } a//ReferenceError:aisnotdefined. b//1
不存在变量提升
变量一定要在声明后使用,否则报错
vartmp=123; if(true){ tmp='abc';//ReferenceError lettmp; }
不允许重复声明
//报错 function(){ leta=10; vara=1; }
块级作用域
functionf(){console.log('Iamoutside!');} (function(){ if(false){ //重复声明一次函数f functionf(){console.log('Iaminside!');} } f(); }()); //Iaminside!ES5函数提升 //Iamoutside!ES6块级作用域
const命令
声明一个只读的常量,一旦声明,常量的值就不能改变
一旦声明变量,就必须立即初始化,不能留到以后赋值
let命令、const命令、class命令声明的全局变量,不属于全局对象的属性
vara=1; //如果在Node的REPL环境,可以写成global.a //或者采用通用方法,写成this.a window.a//1 letb=1; window.b//undefined
下面再单独给大家介绍ES6之const命令
一直以来以ecma为核心的js始终没有常量的概念,es6则弥补了这一个缺陷;
constfoo='foo'; foo='bar';//TypeError:Assignmenttoconstantvariable.
上例声明了一个基本类型的常量,如过试图修改初始值则会报错;如果是引用类型的值同样适用,但是有一点需要注意,举例说明:
constfoo=[]; foo=[1];//Assignmenttoconstantvariable.
正常报错,没毛病,再看:
constfoo=[1,2,3]; foo[1]=4; console.log(foo)//[1,4,3]
这怎么没报错?而且还能修改成功?这两个例子不一样的地方在于前者是修改了指针(需熟悉js引用类型)对应的内容改变了,后者则不是指向依然没变但是指向对象的内容发生改变了,对于foo而言我只是一个指针负责指向对应的对象至于对象内容是什么就不管我的事了所以可以修改;如果不想让内容也改变也行使用另一个方法;
constfoo=Object.freeze([1,2,3]); foo[1]=4; console.log(foo)//[1,2,3]
这样就不用担心被修改了;