ECMAScript 是 JavaScript 语言的国际标准,JavaScript 是 ECMAScript 的实现。
ES5
于 2009 年完成标准化。这个规范在所有现代浏览器中都相当完全的实现了。作为ECMAScript第五个版本(第四版因为过于复杂废弃了),增加特性如下:
1. strict模式
严格模式,限制一些用法,'use strict';例如不声明变量就使用。
2. Array增加方法
增加了every、some 、forEach、filter 、indexOf、lastIndexOf、isArray、map、reduce、reduceRight方法。还有其他方法 Function.prototype.bind、String.prototype.trim、Date.now。
3. Object方法
Object.getPrototypeOf,Object.create,Object.getOwnPropertyNames,Object.defineProperty,Object.getOwnPropertyDescriptor,Object.defineProperties,Object.keys,Object.preventExtensions / Object.isExtensible,Object.seal / Object.isSealed,Object.freeze / Object.isFrozen。
ES6
因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015。也就是说,ES6就是ES2015。目前并不是所有浏览器都能兼容ES6全部特性,往往用babel转化成es5。
1. 块级作用域
关键字let, 常量const。
2. 对象字面量的属性赋值简写
如果一个变量名恰好是一个实例的参数,就可以直接写进去不用 key: value 格式。
3. 赋值解构
代码块
let { first: f, last: l } = singer;
4. 函数参数 - 默认值、参数打包、 数组展开(Default 、Rest 、Spread)
代码块
//Default 默认值
function findPerson(name='lu', age='26') {
...
}
//Rest 参数打包
function f(x, ...y) {
// y is an Array
return x * y.length;
}
f(3, "hello", true) == 6
//Spread 数组展开
function f(x, y, z) {
return x + y + z;
}
// Pass each elem of array as argument
f(...[1,2,3]) == 6
5. 箭头函数 Arrow functions
(1).简化了代码形式,默认return表达式结果。
(2).自动绑定语义this,即定义函数时的this。
6. 字符串模板 Template strings
代码块
var name = "Bob", time = "today";
`Hello ${name}, how are you ${time}?`
// return "Hello Bob, how are you today?"
7. Iterators(迭代器)+ for..of
迭代器有个next方法,调用会返回:
(1).返回迭代对象的一个元素:{ done: false, value: elem }
(2).如果已到迭代对象的末端:{ done: true, value: retVal }
代码块
for (var n of ['a','b','c']) {
console.log(n);
}
// 打印a、b、c
8. 生成器 (Generators)
9. Class
Class,有constructor、extends、super,但本质上是语法糖(对语言的功能并没有影响,但是更方便程序员使用)。
10. Modules
ES6的内置模块功能借鉴了CommonJS和AMD各自的优点:
(1).具有CommonJS的精简语法、唯一导出出口(single exports)和循环依赖(cyclic dependencies)的特点。
(2).类似AMD,支持异步加载和可配置的模块加载。
11. Map + Set + WeakMap + WeakSet
四种集合类型,WeakMap、WeakSet作为属性键的对象如果没有别的变量在引用它们,则会被回收释放掉。
12. Math + Number + String + Array + Object APIs
13. Proxies
使用代理(Proxy)监听对象的操作,然后可以做一些相应事情。
14. Symbols
Symbol是一种基本类型。Symbol 通过调用symbol函数产生,它接收一个可选的名字参数,该函数返回的symbol是唯一的。
15. Promises
Promises是处理异步操作的对象,使用了 Promise 对象之后可以用一种链式调用的方式来组织代码,让代码更加直观(类似jQuery的deferred 对象)。
ES7
es7(es2016)只有两个特性:
1.Array.prototype.includes:
includes() 方法用来判断一个数组是否包含一个指定的值,根据情况,如果包含则返回 true,否则返回false。
2.求幂运算符**
用于取代以前的求幂方法 Math。
ES8
1.Object.values()
Object.values()方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同:即任意序 ( 区别在于 for-in 循环枚举原型链中的属性 )。
与Object.keys对应,一个是key,一个是值。
2.Object.entries()
Object.keys和Object.values的结合体,方法返回一个给定对象自身可枚举属性的键值对数组,也是任意序遍历,数组的每一项为[key, value]。
3.String padding
String增加了两个实例方法 — padStart和 padEnd,这两个方法可以在字符串的首/尾添加其他字符串,类似数组的unshift,push方法
4.Object.getOwnPropertyDescriptors
Object.getOwnPropertyDescriptor() 方法返回指定对象上一个自有属性对应的属性描述符。
5.Trailing commas in function
JavaScript 一开始就支持数组字面值中的尾后逗号,随后向对象字面值(ECMAScript 5)中添加了尾后逗号。ES8 标准中允许函数参数列表与调用中的尾部逗号,该特性允许我们在定义或者调用函数时添加尾部逗号。但是 JSON 不支持尾后逗号。
6.Async functions
为解决异步调用引入的 async 函数,由于 Babel 和 Nodejs 很早就支持 async 和 await 关键字,所以这里不做过多解释。
7.SharedArrayBuffer和 Atomics
SharedArrayBuffer 和 Atomics 是 JavaScript 为多线程能力增加的特性,暂时使用的场景不多。目前也有一定的安全问题。
ES9(ES2018)
1.对象上的Rest/Spread属性
2.异步iterator和异步iterables
与iterator不同,异步iterator的next()方法返回一个包含{ value, done }的promise。
3.for-await-of
es2018提供了新的遍历语法对异步 iterator 进行遍历。
4.Promise.prototype.finally()
Promise.prototype.finally()方法返回一个Promise,在promise执行结束时,无论结果是fulfilled或者是rejected,在执行then()和catch()后,都会执行finally指定的回调函数。这为指定执行完promise后,无论结果是fulfilled还是rejected都需要执行的代码提供了一种方式,避免同样的语句需要在then()和catch()中各写一次的情况。
5.标记模板
带标签的模板字符串是一种更高级的形式的模板字符串。标签使可以用函数解析模板字符串。标签函数的第一个参数包含一个字符串值的数组。其余的参数与表达式相关。最后,你的函数可以返回处理好的的字符串。用于该标签的函数的名称可以被命名为任何名字。这个离谱啊
6.正则相关的特性
ES10(ES2019)
1.可选的catch参数
ES2018中catch在没使用参数的情况下可以省略括号
2.JSON 超集
当json文本中存在未转义的换行符如\u2028,\u2029时,js中会报语法错误。ES2018中对此作了扩展,支持了所有的json文本,因此同样允许未转义的换行符的存在。
3.Symbol.prototype.description
Symbol对象添加了一个只读属性description,它会返回Symbol对象的可选描述的字符串。而在ES2019之前,Symbol 的描述存储在内部的 [[Description]],没有直接对外暴露,只有调用 Symbol 的 toString()才能读取到。
4.Function.prototype.toString revision
Function.prototype.toString()现在返回精确字符,包括空格和注释。
5.Object.fromEntries
Object.fromEntries()与Object.entries()对应,它把键值对列表转换为一个对象。
6.Well-formed JSON.stringify()
更友好的JSON.stringify,对于一些超出范围的 Unicode,为其输出转义序列,使其成为有效 Unicode。