快速搞定常用的ES6新特性
快速搞定常用的ES6新特性
在项目中80%的时间用到的ES6语法只占其20%,所以我们暂时先集中精力把这20%学好,那就差不多够用了,剩下的可以看书或是查文档,现学现用。
重要提示:示例代码es6-demo
1. Let + Const 块级作用域和常量
let和const的出现让 JS 有了块级作用域,还可以像强类型语言一样定义常量。由于之前没有块级作用域以及 var 关键字所带来的变量提升,经常给我们的开发带来一些莫名其妙的问题。
下面看两个简单的demo理解。
2.Arrows 箭头函数
- 箭头函数简化了函数的的定义方式,一般以 “=>” 操作符左边为输入的参数,而右边则是进行的操作以及返回的值Inputs=>outputs。
- 箭头函数根本没有自己的this,导致内部的this就是外层代码块的this。正是因为它没有this,所以也就不能用作构造函数,从而避免了this指向的问题。
请看下面的例子。
更多示例:
3.Class, extends, super 类的支持
回想之前,如果我们需要模拟一个js的类,一般会采用构造函数加原型的方式。
ES6中添加了对类的支持,引入了class关键字(其实class在JavaScript中一直是保留字,目的就是考虑到可能在以后的新版本中会用到,现在终于派上用场了)。
JS本身就是面向对象的,ES6中提供的类实际上只是JS原型模式的包装。现在提供原生的class支持后,对象的创建,继承更加直观了,并且父类方法的调用,实例化,静态方法和构造函数等概念都更加形象化。
下面代码展示了类在ES6中的使用。
4.Enhanced Object Literals 增强的对象字面量
对象字面量被增强了,写法更加简洁与灵活,同时在定义对象的时候能够做的事情更多了。具体表现在:
- 可以在对象字面量里面定义原型
- 定义方法可以不用function关键字
- 直接调用父类方法
这样一来,对象字面量与前面提到的类概念更加吻合,在编写面向对象的JavaScript时更加轻松方便了。
5.Template Strings 字符串模板
字符串模板相对简单易懂些。ES6中允许使用反引号 ` 来创建字符串,此种方法创建的字符串里面可以包含由美元符号加花括号包裹的变量${vraible}。如果你使用过像C#等后端强类型语言的话,对此功能应该不会陌生。
6.Destructuring 解构
Destructuring是解构的意思,ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
比如若一个函数要返回多个值,常规的做法是返回一个对象,将每个值做为这个对象的属性返回。但在ES6中,利用解构这一特性,可以直接返回一个数组,然后数组中的值会自动被解析到对应接收该值的变量中。
数组、对象和字符串的解构赋值示例:
7.Default + Rest + Spread
Default 默认参数值
现在可以在定义函数的时候指定参数的默认值了,而不用像以前那样通过逻辑或操作符来达到目的了。
Rest 剩余参数
不定参数是在函数中使用命名参数同时接收不定数量的未命名参数。这只是一种语法糖,在以前的JavaScript代码中我们可以通过 arguments
变量来达到这一目的。
不定参数的格式是三个句点后跟代表所有不定参数的变量名。比如下面这个例子中,…x代表了所有传入add函数的参数。
一个简单示例:
再看一个:
Spread 扩展操作符
扩展操作符则是另一种形式的语法糖,它允许传递数组或者类数组直接做为函数的参数而不用通过apply。
8.Map,Set 和 WeakMap,WeakSet
这些是新加的集合类型,提供了更加方便的获取属性值的方法,不用像以前一样用hasOwnProperty
来检查某个属性是属于原型链上的呢还是当前对象的。同时,在进行属性值添加与获取时有专门的get,set
方法。
有时候我们会把对象作为一个对象的键用来存放属性值,普通集合类型比如简单对象会阻止垃圾回收器对这些作为属性键存在的对象的回收,有造成内存泄漏的危险。而WeakMap,WeakSet
则更加安全些,这些作为属性键的对象如果没有别的变量在引用它们,则会被回收释放掉,具体还看下面的例子。
9.Proxies
Proxy可以监听对象身上发生了什么事情,并在这些事情发生后执行一些相应的操作。一下子让我们对一个对象有了很强的追踪能力,同时在数据绑定方面也很有用处。
上面代码我已加了注释,这里进一步解释。对于处理程序,是在被侦听的对象身上发生了相应事件之后,处理程序里面的方法就会被调用,上面例子中我们设置了set
的处理函数,表明,如果我们侦听的对象的属性被更改,也就是被set
了,那这个处理程序就会被调用,同时通过参数能够得知是哪个属性被更改,更改为了什么值。
10.Object assign
Object.assign 用于对象的合并,ES6对object做了很多扩展,assign是最值得点评的。想必你很熟悉jquery提供的extend接口,那么ES6的Object.assign就是从语法层面做了这件事情,是不是很nice。
11.Promises
ES6的Promise是一个非常重要的特性,它是处理异步操作的一种模式。有了它,JavaScript异步嵌套的问题算是得到了比较好的解决。同时,Promise也是ES7中async/await的基础。
我们来看ES6中的Promise对象的使用:
使用promise模拟一个ajax方法的demo用于大家理解
12.Decorator
修饰器(Decorator)是一个表达式,用来修改类的行为。这是ES7的一个提案,目前Babel(babel-plugin-transform-decorators-legacy)转码器已经支持。
不知道大家有没有使用过java的spring mvc,其中的注解就跟这个比较相似,学习React的话可以重点关注下这个语法,因为后面使用redux类库的时候会频繁的用到decorator。
首先说下如何配置babel的插件来进行decorator的解析。
配置.babelrc
的plugins字段。
ok,接下来来段使用decorator的示例代码
13.Modules 模块
在ES6标准中,JavaScript原生支持module了。这种将JS代码分割成不同功能的小块进行模块化的概念是在一些三方规范中流行起来的,比如CommonJS和AMD模式。
将不同功能的代码分别写在不同文件中,各模块只需导出公共接口部分,然后通过模块的导入的方式可以在其他地方使用。
不过,还是有很多细节的地方需要注意,我们看例子:
简单使用方式:
export
我们再来看一下export的默认输出:
为了给用户提供方便,让他们不用阅读文档就能加载模块,就要用到export default命令,为模块指定默认输出。这样其他模块加载该模块时,import命令可以为该匿名函数指定任意名字。
需要注意的是,这时import命令后面,不使用大括号。
最后需要强调的是:ES6模块加载的机制,与CommonJS模块完全不同。CommonJS模块输出的是一个值的拷贝,而ES6模块输出的是值的引用。
-
CommonJS模块输出的是被输出值的拷贝,也就是说,一旦输出一个值,模块内部的变化就影响不到这个值。
-
ES6模块的运行机制与CommonJS不一样,它遇到模块加载命令import时,不会去执行模块,而是只生成一个动态的只读引用。等到真的需要用到时,再到模块里面去取值,换句话说,ES6的输入有点像Unix系统的”符号连接“,原始值变了,import输入的值也会跟着变。因此,ES6模块是动态引用,并且不会缓存值,模块里面的变量绑定其所在的模块。
import
结语
多的不在赘述,以上的一些知识可以当成学习ES6的一个快餐,不成体系,希望能够帮助你快速的掌握一些ES6常用的语法,有时间有精力建议买本阮一峰老师的《ES6入门》通读一遍。
【 THE END 】
------ ShenBao on February 27, 2017