Understanding ECMAScript6(中)

2017-02-23  本文已影响0人  Michael_lpf


Part 1:Set 和 Map


Set 数据结构
let set = new Set();

使用 add() 方法为 Set 添加项目;
它有一个 size 属性可查看其中包含多少项👇

set.add(66);
set.add('66');
set.size  //  2

👆 Set 不使用强制转换来判断值是否重复,数字66和字符串66是两个独立的项。
如果使用 add() 重复添加了某项,之后的调用会被忽略👇

Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png

因为 Set 是无重复值的列表,所以只保留了1,3,4三个值。
🚫用其它类型数据尝试使用类似数组初始化 Set 都是行不通的。


Set 的 forEach()方法

forEach() 方法被传递一个回调函数,该回调接收三个参数:

Paste_Image.png
👆使用 ... 扩展运算符接收 Set 对象,同时,Set 也已经将数组去重复。
💡这是一个非常实用的数组去重复技巧。
Map 数据结构
let map = new Map();
map.set('name', 'Rogger');
map.set('year', 2017);

Map.set()Set.add() 有些相似,需要注意的是,Map.set() 多次设置一个项目时,后者覆盖前者👇

Paste_Image.png Paste_Image.png
let map = new Map( [ ['name', 'Bean'], ['age', 42] ] );

👆不同于数组初始化 Set 之处是,数组初始化 Map 时,数组中的每一项也必须是数组。
因为这样才能准确表达 Map 中的每个项目都是键值对。


Map 的 forEach()方法

forEach() 方法接收的回调函数同样接收三个参数:

Paste_Image.png

Part 2: 增强的数组功能


创建数组的新方法
Paste_Image.png

当传入多个参数时(无论数值与否),所有参数都成为数组的项👇

Paste_Image.png Paste_Image.png
ES6 中引入的 Array.of() 方法,接收的参数将永远作为数组的项👇 Paste_Image.png Paste_Image.png

Array.of() 方法避免了 new Array() 构造器可能造成的混乱,今后可以考虑用 Array.of() 来代替构造器。

Paste_Image.png
数组新方法
Paste_Image.png Paste_Image.png Paste_Image.png Paste_Image.png

👆从数组的第2个位置开始粘贴,从数组第0个位置开始复制(一直复制到数组末尾)
可以传入第三个可选的参数来控制多少元素被覆盖👇

Paste_Image.png

Part 3:生成器与迭代器


可迭代对象与 for-of 循环

在过去我们遍历一个数组时,需要这样👇

Paste_Image.png

在 ES6 中,所有集合对象(数组,Set,Map)都是可迭代对象,可配合新增的 for-of 使用👇

Paste_Image.png
与传统 for 循环相比,for-of 更容易,因为它不需要计数器也不必考虑循环何时结束。它会从迭代器中读取所有数据后退出循环。
如果简单地迭代数组或集合的值,使用 for-of 更好,将传统的 for 留给更复杂的逻辑控制。
集合的迭代器

ES6 中集合迭代器(数组,Set,Map)拥有三种内置的迭代器:keys()value()entries()

Paste_Image.png Paste_Image.png
字符串的迭代器

字符串同样拥有默认迭代器👇


Paste_Image.png
NodeList 的迭代器

下面代码可以打印页面中所有 div 的 id 值

let node = document.getElementsByTagName('div');
for(let div of node){
  console.log(div.id);
}

自定义迭代器

了解它之前,要先说说用于返回迭代器的函数——生成器:
生成器用放在 function 关键字之后的 * 表示,并使用新的关键字 yield 来控制“节奏”👇


生成器可以像普通函数那样被调用,但返回的则是一个迭代器了👇
Paste_Image.png
yield 指定了迭代器被 next() 方法调用时的返回值👇
Paste_Image.png
所有迭代器都有 next() 方法,它返回两个属性:值 value 和 布尔类型的 done,当 done 值为 true 时表示迭代器没有更多的返回了。
也可以用函数表达式的方式创建一个生成器👇
Paste_Image.png Paste_Image.png
委托生成器

使用 yield* 配合,将生成器包裹于另一个生成器中,就获得了一个委托生成器👇

Paste_Image.png
生成器委托对迭代器的行为进行了良好的组织。

Part 4:符号


Paste_Image.png Paste_Image.png
一些知名符号:

Symbol.hasInstance:供 instanceof 运算符使用,用于判断继承关系。
Symbol.isConcatSpreadable:布尔类型值,在集合参数传递给 concat() 方法时,指定集合是否展开。
Symbol.match:比较字符串。
Symbol.replace:替换字符串。
Symbol.search:定位字符串。
Symbol.split:用于分割字符串。
Symbol.species:用于派生对象构造器。
Symbol.toPrimitive:返回对象对应的基本类型。
Symbol.iterator:返回迭代器的一个方法。



本节完
Understanding ECMAScript6(上)
Understanding ECMAScript6(下)

上一篇下一篇

猜你喜欢

热点阅读