ES6简介
1、ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在2015年6月正式发布了。 2、它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。 3、ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 Jscript 和 ActionScript)。日常场合,这两个词是可以互换的。 4、ES6 从开始制定到最后发布,整整用了15年 2009年12月,ECMAScript 5.0版正式发布 2011年6月,ECMAscript5.1版发布,并且成为ISO国际标准(ISO/IEC 16262:2011)。 2013年3月,ECMAScript6草案冻结,不再添加新功能。新的功能设想将被放到ECMAScript 7。 2013年12月,ECMAScript6草案发布。然后是12个月的讨论期,听取各方反馈。 2015年6月,ECMAScript6正式通过,成为国际标准。从2000年算起,这时已经过去了15年。
ES6基础编程
let命令
ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。
let命令存在块级作用域
if (true) { var a = 10; let b = 20; }
console.log(a); //10 console.log(b); //Uncaught ReferenceError: b is not defined
上面代码在代码块之中,分别用var和let声明了两个变量。然后在代码块之外调用这两个变量,结果let声明的变量报错,var声明的变量返回了正确的值。这表明,let声明的变量只在它所在的代码块有效。
因为ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景,所以需要块级作用域。下面场景中,内层变量可能会覆盖外层变量。
var tmp = new Date();
function fn(){
console.log(tmp);
if(false){
var tmp = 'hello world';
}
}
fn(); //undefined
上面代码中,函数f执行后,输出结果为undefined,原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量。
Let不存在变量提升
//var的情况
console.log(foo);
var foo = 2; //undefined
//let的情况
console.log(bar);
let bar = 2; //ReferenceError: Cannot access 'bar'
上面代码中,变量foo用var命令声明,会发生变量提升,即脚本开始运行时,变量foo已经存在了,但是没有值,所以会输出undefined。 变量bar用let命令声明,不会发生变量提升。这表示在声明它之前,变量bar是不存在的,这时如果用到它,就会抛出一个错误。 因此,使用let声明变量,极大的消除了代码的潜在bug的隐患。
Let暂时性死区
只要块级作用域内存在let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var temp = 123;
if(true){
temp = 'abc'; //ReferenceError: Cannot access 'temp'
let temp;
}
上面代码中,存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
const 命令
const声明一个只读的常量。一旦声明,常量的值就不能改变。
const PI = 3.1415926;
PI = 3; //TypeError: Assignment to constant variable.
上面代码表明改变常量的值会报错。