箭头函数(arrows)
箭头是一个函数的缩写通过使用=>
标识符, 这看起来有点像c#
,java 8
和coffeescript
的写法,它同时支持陈述代码块和表达式代码块以返回表达式值,和函数不同,箭头函数在它的作用域内共享同一个this指针
类(classes)
ES6
中的类仅仅是一个基于原型链oo
模型的语法糖.简单方便的写法使得类模型更易使用和操作,类支持基于原型链的继承,父级调用,实例,静态方法和构造函数.
对象字面量扩展语法(enhanced object literals)
对象语法被继承以支持设置构造函数的属性,简化以前定义属性(foo:foo
),定义方法,作父级调用的写法,同时支持用表达式设置属性名.总而言之,它使得对象的字面量含义和类的声明结合的更紧了,基于对象的设计也同样受益于写法的简化.
模板字符串(template strings)
模板字符串为构造字符串提供了语法糖,这类似于perl
,python
等其他语言的字符串写法.作用包括但不限于:能够通过添加一个标签使得字符串的构造自定义化;避免注入攻击;以及从当前字符串内容构造更高级的数据结构.
表达式解构(destructuring)
解构允许赋值使用模式匹配,支持数组和对象的匹配.解构是可降级的,类似于标准的对象查找,当匹配失败时返回undefined
.
默认参数+后续参数+传参(default+rest+spread)
允许给形参设置默认值.在一个函数声明中用一个数组来表示一组连续的参数,这允许把后续参数都绑定到数组.它使得后续更改参数和处理常用案例更加直接
新的变量(let + const)
定义了块级作用域.let是新的变量定义方式.const定义了常量(唯一赋值),它们必须先定义再调用
迭代器+ for...of
迭代器对象类似于CLR IE迭代器和java迭代器,用for..of
进行自定义迭代,不再需要专门定义一个数组,使类似于LINQ
的懒人设计模式成为可能.
生成器(generator)
生成器简化了迭代编程通过使用function*
和yield
.当一个function*
函数被声明时会返回一个生成器实例.生成器是迭代器的一个子类型,它同时新定义了next()方法和throw()方法.这使得值能返还到生成器,yield
会返回一个值到主线程(或抛出)
编码标准(unicode)
不间断的更新以支持unicode编码,包括新的字符串形式的unicode文字形式,新的正则表达式u模式来操作代码,以及新的APIs来操作字符串在21位量级.这些更新支持用javascript构建全球化应用.
模块化(modules)
对于自定义组件的模块化的原生支持.它由流行的javascript模块加载器(AMD,CommonJS)演变而来.运行方式由一个自定义的默认加载器来定义.内含异步模块--代码不会运行直到请求模块可用且被执行.
模块加载器(module loaders)
模块加载器支持:
- 动态加载
- 声明隔离
- 全局命名空间隔离
- 编译钩子
- 内置的虚拟化
这些默认的模块加载器可以被配置,并且新的加载器可以被构造以分析和加载代码在隔离的连续的上下文中
新的数据结构(Map+Set+WeakMap+WeakSet)
有效的数据结构用于常用算法,WeakMaps提供了一个密封的,可用对象作为key的映射表
代理(proxies)
代理使得对象的创建以及它的所有行为对主机对象可用.它能被用于拦截,对象虚拟化,记录/分析等.
Symbols
symbols增加了对对象声明的获取控制.Symbols允许属性的键被设置成字符串形式或symbol形式.Symbols是一种新的原始类型.可选的description参数用于试.Symbols是唯一的(类似于gensym),但它们不是私有的,由于他们可以通过object.getOwnPropertySymbols获取到
Subclassable Built-ins
在ES6
中,内置像数组一样。日期元素和dom节点元素可以被子类化
以前对象的构造函数现在使用两步来完成.
使用create来将方法挂在一个对象下,给方法定义各种行为
用新的实例来解析构造函数以初始化
以前著名的create方法现在写作Symbol.create.内置 现在更明确的暴露他们的create方法
Math+Number+String+Array+Object APIs
许多新的库的增加,包括核心Math库,Array conversion helpers, String helpers以及object.assign用于复制
二进制文字和八进制文字
两种新的数字格式的增加(二进制(b)和八进制(o))
Promises
Promises是一个异步编程库,它的作用便是“免去”异步操作的回调函数,保证能通过后续监听而得到返回值.Promises已被许多存在的javascript库所使用.
Reflect API
全映射API将对象上的一些属于语言内部的方法挂到reflect对象上.reflect对象的方法和proxy对象的方法一一对应,并且使得对reflect对象和proxy对象方法的访问一致.这在实施代理时尤为有用.
tail calls
句尾调用确保了栈不会无限的增长.当面临无限大的输出时使得递归算法安全.