模块 module
1 | import { sayHi } from './people'; |
注意点:使用default
导出时要尽量将其他模板需要使用的部分属性导出,不要导出整个对象,因为这样会导出一些不需要的东西,如果使用模块按需内容导出,部分ECMAScript6的打包工具可以使用静态树分析的方法来自动移除程序运行时不需要的代码。
类
1 | // 类声明 |
模块 module
1 | import { sayHi } from './people'; |
注意点:使用default
导出时要尽量将其他模板需要使用的部分属性导出,不要导出整个对象,因为这样会导出一些不需要的东西,如果使用模块按需内容导出,部分ECMAScript6的打包工具可以使用静态树分析的方法来自动移除程序运行时不需要的代码。
循环与迭代器 Iterator
在 es6 阶段,除了do...while
、for
循环,还可以使用for...in
来遍历对象。Iterator迭代器的加入让遍历数组、对象和集合的方式更加灵活可控,Iterator可以控制每次单步循环触发的时机,不用一次遍历所有的循环。
▼ for...of
遍历实现
1 | const numbers = [1, 2, 3, 4, 5]; |
▼ 迭代器遍历数组
1 | const numbers = [1, 2, 3, 4, 5]; |
▼ 对比
Iterator 可以在循环开始后任意的地方进行数组的单步循环,当循环迭代中每次单步循环操作都不一样时,使用 Iterator 更加的方便。如果使用for...of
则需要不断判断执行的次数来执行不同的单步循环。
▼ 注意点
每次 Iterator 调用next()
都会返回一个对象{done: false, value: item}
,done
的属性是布尔值,表示循环遍历是否完成,value
则是每一步next()
调用获取到的值。
生成器 Generator
1 | const generator = function* () { |
Generator 是针对函数内代码块的执行控制,如果将一个特殊函数的代码使用yield
关键字来分割成多个不同的代码段,那么每次 Generator 调用next()
都只会执行yield
关键字之间的一段代码。Generator 可以认为是一个可中断执行的特殊函数,声明方法是在函数名后面加上*
来与普通函数区分。
▼ 注意点
Generator 遇到yield
关键字会暂停往后执行,但并不表示后面的程序就不执行了。如果console.log(number)
是一个耗时的工作,那么程序只在 Generator 里面暂停,外面的程序仍会继续执行。
1 | const generator = function* () { |
集合类型
Set & Map
▼ 为什么有了数组和对象来进行存储数据还要要使用 Map & Set
- 对象的键名一般只能是字符串,而不能是一个对象;
- 对象没有直接获取属性个数等这些方便操作的方法;
- 对于对象的任何操作都需要进入对象的内部数据中完成,如查找、删除某个值必须循环遍历对象内部的所有键值对来完成。
▼ Set的基本用法
1 | const set = new Set([1, 2, 3, 4, 4]); |
Set 不会添加重复的值,并且可以接受一个数组(或者具有 Iterable 接口的其他数据解构)作为参数,用来初始化。
▼ Map的基本用法
1 | const m = new Map(); |
Map 类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以作为键。
WeakSet & WeakMap
WeakSet 和 WeakMap 则对应着 Set 和 Map 的优化类型,所以某种程度上,为了让程序开发更加方便,我妈有必要引入集合这类更为高效的类型。WeakSet 和 WeakMap 在生成时有更加严格的限制:WeakSet 只存储对象类型的元素,不能遍历,没有size
属性;WeakMap 只接受基本类型的值作为键名,没有keys
、values
、entries
等遍历方法,也没有size
属性。
▼ WeakSet的基本用法
1 | const a = [[1, 2], [3, 4]]; |
▼ WeakMap的基本用法
1 | const wm1 = new WeakMap(); |
数组或对象循环遍历的方法对比
for/while 循环语句
1 | let arr = [1, 2, 3]; |
所有语言都会涉及的循环。不过单纯的for/while能力有限,而且性能上也堪忧。而且必须借助特定的结构才能遍历数据结构。
forEach 方法
1 | [1, 2, 3].forEach(function(value, index) { |
优点:可以同时获取index和value,不必再像以前遍历数组那样,还要再在for去获取值。
缺点:仅支持数组。而且一旦调用,会完全遍历一次,break, continue, return都无效。
应用场景:仅在遍历数组的时候使用。
for…in 语句
1 | let obj = {a: 1, b: 2,c: 3}; |
优点:它可以支持所有对象类型的数据,包括数组,甚至是函数等,而且语法简单。且不同于forEach
方法,它可以与break、continue和return配合使用。
缺点:循环不仅遍历数字键名,还会遍历手动添加的其他键,甚至包括原型链上的键。主要是为遍历对象而设计的,不适用于遍历数组。
应用场景: 遍历常用对象(如例子)
for…of 语句
1 | var list = new Map(); |
for...of
是ES6新增的语法,它是基于ES6新增的Iterator和Symbol开发的。
优点:在遍历中直接取值。感觉上和for...in
形成互补,一个在遍历中取键名,另一个取值。另一个优点是,它可以遍历任何部署了 Iterator 接口的数据结构(如 Set 和 Map),甚至是非 JavaScript 的数据类型,即自己定义的数据结构。
缺点:对于普通的对象,for...of
结构不能直接使用,会报错,必须部署了 Iterator 接口后才能使用。
应用场景:推荐应用于Map上的遍历。
map() & filter() & reduce()
1 | var arr = [1, 2, 3]; |
应用场景:这三个方法都是是 Array 中的方法,常用于数组中的数值的处理。map
主要用于对存储的数据进行加工,filter
偏向于过滤数据,reduce
用于计算总和。
学习参考:
ECMAScript 6入门——阮一峰
《现代前端技术解析》