解构
对象字面量扩展
模版字面量
${name}
可以分散在多行
箭头函数
新的ES6箭头函数 =>
function(x,y) { return x + y } 可以写为 var foo = (x,y) => x + y
箭头函数的主要设计目的就是改变this的行为特性,解决this相关编码的一个特殊而又常见的痛点。
在箭头函数内部,this绑定不是动态的,而是词法的。
var controller = {
makeRequest: () => {
// ...
this.helper(...);
},
helper: () => {
// ...
}
}
controller.makeRequest();
以上的调用,this.helper会引用失败,因为这里的this并不是指向 controller,指向全局。
除了词法this,箭头函数没有arguments数组,而是继承自父层,词法super,new.target也一样。
可以使用箭头函数=>的时机和规则
1.如果你有一个简短单句在线函数表达式,其中唯一的语句是return某个计算出的值,且这个函数内部没有this引用,且没有自身引用(递归,事件绑定/解绑定),且不会要求函数执行这些,那么可以安全地把它重构为箭头函数。
2.如果你有一个内层函数表达式,依赖于在包含它的函数中调用var self = this hack 或者.bind(this)来确保适当的this绑定,那么这个内层函数应该可以安全地转换为 => 函数。
3.如果你的内层函数表达式依赖于封装函数中某种像 var args = Array.prototype.slice.call(arguments) 来保证argumnets的词法复制,那么这个内层函数应该可以安全的转换为箭头=>函数。
4.所有的其他情况—-函数声明、较长的多语句函数表达式、需要词法名称标识符(递归等)的函数,以及任何不符合以上几点特征的函数——一般都避免=>箭头函数。
底线:=>是关于this、arguments、super的词法绑定。这个ES6特性设计用来修正一些常见的问题,而不是bug、巧合或者错误。
ES6的模块导入导出
导出API成员
export { foo, awesome, bar }
export {foo as bar} // 只有bar可以导入,foo还隐藏在模块内部
可以在模块内部定义多个export, ES6倾向于一个模块使用一个export,称之为默认导出
export default foo;
export {foo as default}
导入API成员
import { foo, bar,baz } from ‘foo’;
import { foo as theFooFunc } from ‘foo’
如果这个模块只有一个你想要导入并绑定到一个标识符的默认导出,绑定时可以省略包围的{..,}
import foo from ‘foo’
import {default as foo } from ‘foo’
还可以把默认导出和其他的命名一起导入
import FOOFN, {bar, baz as BAZ} from “foo”
ES6模块哲学强烈建议,只从模块导入需要的具体绑定。
命名空间导入
export function bar() {….}
export var x = 42
export function baz() { … }
可以把整个API导入到单个模块命名空间绑定
import as foo from “foo”;
foo.bar();
foo.x;
foo.baz();
有默认的情况下导入
import foofn, as hello from ‘world’
所有的导入的绑定都是不可变的,只读的。
类
class
关键字,表示一个块,其内容定义了一个函数原型的成员。
尽管 class Foo看起来很像 function Foo(),但二者有重要区别。
- 由于前ES6可用的Foo.call(obj)不能工作,class Foo的Foo()调用必须通过new来实现。
- function Foo是“提升的”,而class Foo并不是,extends ..语句指定了一个不能被提升的表达式。所以在实例化要一个class之前必须先声明它。
- 全局作用域中的class Foo创建了这个作用域的一个词法标识符Foo,但是和function Foo不一样,并没有创建一个同名全局对象属性。
ES6的class 本身并不是一个真正是实体,而是一个包裹着其他函数和属性这样的具体实体并把它们组合到一起的元概念。
extends 和 super
ES6类还通过面向对象类的常用术语extends提供了一个语法糖,用来在两个函数原型直接建立[[Prototype]]委托链接—-通常被误认为是继承。
class Bar extends Foo {
constructor(a, b, c) {
super(a,b,c);
this.z = c;
}
gimmeXYZ() {
}
}
还有一个重要的特性是super,在构造器中,自动指向‘父构造器’,在前面的例子中就是Foo(…).在方法中,super会指向“父对象”,这样就可以访问其属性/方法了。
Bar extneds Foo的意思就是把 Bar.prototype中的[[prototype]]链接到Foo.prototye.
在gimmXYZ()的方法中,super具体指Foo.prototype,而在Bar构造器中super指的是Foo.
static
在为一个类声明了static方法(不只是属性)的情况下,是直接添加到这个类的函数对象上,而不是这个函数对象的prototype对象上。
Map和Set
Map
可以用非字符串值作为健的映射
可以用 Map.get() , map.set() , mapl.size, map.clear(),
map.delete(),
WeakMap,只接受对象作为键,这些对象是被弱持有的,本身被回收,在weakmap中这个项目也会被移除。
Set
set是一个值的集合,其中的值唯一。
Set.add(), Set.size, Set.delete, Set.clear(),
weakset,对其值是弱持有(这里没有键)