从ES6到ES10的新特性
介绍
ECMAScript是一种由Ecma国际(前身为欧洲计算机制造商协会)在标准ECMA-262中定义的脚本语言规范。这种语言在万维网上应用广泛,它往往被称为JavaScript或JScript,但实际上后两者是ECMA-262标准的实现和扩展。
历史版本
至发稿日为止有九个ECMA-262版本发表。其历史版本如下:
1997年6月:第一版
1998年6月:修改格式,使其与ISO/IEC16262国际标准一样
1999年12月:强大的正则表达式,更好的词法作用域链处理,新的控制指令,异常处理,错误定义更加明确,数据输出的格式化及其它改变
2009年12月:添加严格模式(
"use strict"
)。修改了前面版本模糊不清的概念。增加了getters,setters,JSON以及在对象属性上更完整的反射。2011年6月:ECMAScript标5.1版形式上完全一致于国际标准ISO/IEC 16262:2011。
2015年6月:ECMAScript 2015(ES2015),第 6 版,最早被称作是 ECMAScript 6(ES6),添加了类和模块的语法,其他特性包括迭代器,Python风格的生成器和生成器表达式,箭头函数,二进制数据,静态类型数组,集合(maps,sets 和 weak maps),promise,reflection 和 proxies。作为最早的 ECMAScript Harmony 版本,也被叫做ES6 Harmony。
2016年6月:ECMAScript 2016(ES2016),第 7 版,多个新的概念和语言特性。
2017年6月:ECMAScript 2017(ES2017),第 8 版,多个新的概念和语言特性。
2018年6月:ECMAScript 2018 (ES2018),第 9 版,包含了异步循环,生成器,新的正则表达式特性和 rest/spread 语法。
2019年6月:ECMAScript 2019 (ES2019),第 10 版。
发展标准
TC39(Technical Committee 39)是一个推动JavaScript发展的委员会,它的成语来自各个主流浏览器的代表成语。会议实行多数决,每一项决策只有大部分人同意且没有强烈反对才能去实现。
TC39成员制定着ECMAScript的未来。
每一项新特性最终要进入到ECMAScript规范里,需要经历5个阶段,这5个阶段如下:
Stage 0: Strawperson 只要是TC39成员或者贡献者,都可以提交想法
Stage 1: Proposal 这个阶段确定一个正式的提案
Stage 2: draft 规范的第一个版本,进入此阶段的提案大概率会成为标准
Stage 3: Candidate 进一步完善提案细则
Stage 4: Finished 表示已准备好将其添加到正式的ECMAScript标准中
由于ES6以前的属性诞生年底久远,我们使用也比较普遍,遂不进行说明,ES6之后的语言风格跟ES5以前的差异比较大,所以单独拎出来做个记录。
ES6(ES2015)
ES6是一次重大的革新,比起过去的版本,改动比较大,本文仅对常用的API以及语法糖进行讲解。
Let 和 Const
在ES6以前,JS
只有var
一种声明方式,但是在ES6之后,就多了let
跟const
这两种方式。用var
定义的变量没有块级作用域的概念,而let
跟const
则会有,因为这三个关键字创建是不一样的。
区别如下:
{
var a = 10
let b = 20
const c = 30
}
a // 10
b // Uncaught ReferenceError: b is not defined
c // c is not defined
let d = 40
const e = 50
d = 60
d // 60
e = 70 // VM231:1 Uncaught TypeError: Assignment to constant variable.

类(Class)
在ES6之前,如果我们要生成一个实例对象,传统的方法就是写一个构造函数,例子如下:
function Person(name, age) {
this.name = name
this.age = age
}
Person.prototype.information = function () {
return 'My name is ' + this.name + ', I am ' + this.age
}
但是在ES6之后,我们只需要写成以下形式:
class Person {
constructor(name, age) {
this.name = namej a
this.age = age
}
information() {
return 'My name is ' + this.name + ', I am ' + this.age
}
}
箭头函数(Arrow function)
箭头函数表达式的语法比函数表达式更简洁,并且没有自己的this
,arguments
,super
或 new.target
。这些函数表达式更适用于那些本来需要匿名函数的地方,并且它们不能用作构造函数。tbc
最后更新于