let和const

1、let声明的变量,代替var,有块作用域,无变量提升。

2、const

不允许在初始声明后,将名称重新绑定到不同对象(但其实仍未影响可写性,可写性可以用 Object.defineProperty() 和 Object.freeze() 控制,严格模式下试图改变只读属性会抛出TypeError)

箭头函数和词法this

对于this、arguments、super 和 new.target,箭头函数是从外层函数继承这些元素的值,而不是声明重新声明一套。(es5之前,这些都是在函数作用域内局部预定义的声明,不能被其中的匿名函数所读取)

JavaScript类

在原型之上模仿类的语法糖。有助于熟悉java、c++这类语言的人上手js。

JavaScript对象字面量改进

设置对象的原型、方法、动态key时,更有“聚合性”,使用对象字面量定义对象时,更趋近于整体。

JavaScript模板字符串字面量

const str = The result of operation ${op} is ${someNumber};
且支持多行。

原始字符串:String.rawHi\u000A!; // 不处理 unicode 转义符
有助于防止与转义符和引号相关的错误。

参考: https://wizardforcel.gitbooks.io/exploring-es6/content/md/6/6.3.html

如果在模板字面量前面加上标签 String.raw ,那么就变成了“原生的”的字符串了,反斜杠再也不是用于转义的特殊字符,也就是说, \n 不会转义成换行符:

const str = String.raw`Not a newline: \n`;
console.log(str === 'Not a newline: \\n'); // true

参考:https://zhuanlan.zhihu.com/p/31687266

标签函数。本质上是以任意方式转换字符串字面量的函数。

标签函数的第一个参数是被嵌入表达式分隔的文本的数组。第二个参数开始是嵌入表达式的内容。

ECMAScript 2015 Promise

链式调用与then、catch,创建promise,resolve和reject

ECMAScript 2015 Generator、iterator、iterable 和 for…of

生成器和 yield 关键字,创建迭代器以及迭代器中的状态管理。

iterable 是为方便创建迭代器而提供接口的对象。提供一个 Symbol.iterator 键,该键的值是一个生成器函数。

for..of 循环遍历。数组和新的集合(Map、Set、WeakMap)都可以用这种方式。

函数: 默认参数和 rest 运算符

1.function request(url, method = ‘GET’) { // (…)}

2.rest 运算符

function manyArgs(a, b, ...args) { 
// args === ['Hello', 'World', true]
} 
manyArgs(1, 2, 'Hello', 'World', true);

通过 rest 运算符声明的变量是真正的数组,所以 arguments 中出现的有些方法,比如 caller和 callee 现在就不能用了

扩展语法

有点与rest相反的意味。
将一个数组参数扩展为多个参数。

function manyArgs(a, b, c, d) { // (...)} 
let arr = [1, 2, 3, 4]; 
manyArgs(...arr);

JavaScript 中的解构

允许采用一种有趣的方式,将一个变量转换成绑定到其内部的多个变量。还有就是给解构后的某个变量改名。

JavaScript 模块

import 和 export。如何导入导出,导入导出的模块名。import 的语义既允许异步加载模块,又允许同步加载模块。

范没有提到在 Web 上到底该如何实现。未来在html中可能会有新语法来增加支持。JavaScript 加载器标准 也许会有参考意义。

新的JavaScript集合

Set、Map、WeakSet 和 WeakMap。

WeakSet 内的对象在集合外的对象不再引用它们之后,就变成了无效的了。

WeakMap 是在键上弱(像 WeakSet),在它存储的值上强。

基于 hash 的 map 依然不可用。

对象代理

自定义对象的行为。

没有过多的键迭代,不需要显式重写 setter,不需要玩弄原型链。

反射

代理是对 JavaScript 动态能力的一个不错的补充,而对代理的补充就是反射(reflection)。对于每个可以被代理捕获和重写的操作,Reflect 对象允许用同样一致的 API 访问该操作

symbol

Symbol 主要用作对象的键。Symbol 对象键不同于字符串键,不能被 Object.keys 枚举,也不能被 JSON.stringify看到。

类型化数组

类型化数组提供了对有符号和无符号 8 位、16 位 和 32 位整数的高效存储。它还有 32 位和 64 位浮点值的版本。

其他特性

1、内置子类化

2、尾递归优化

3、Unicode。支持在模式中通过从 u 标志嵌入码点

4、新的数字字面量。二进制和八进制字面量。

下一版本的ECMAScript

1、Async/Await

2、单指令多数据(SIMD)

3、异步迭代

参考:https://www.zcfy.cc/article/a-rundown-of-javascript-2015-features-1915.html