ES6笔记

140 阅读3分钟

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.

上面代码表明改变常量的值会报错。