es6基础 03
1. Iterator迭代器
上文提到的for…of不能遍历对象的属性,原因是对象的属性是无序的,在设计对象的时候没有加入Iterator迭代器
可迭代的对象有:String、Array、TypedArray、Map 和 Set,这些对象(或者它原型链上的某个对象)必须有一个键为 iterator 的属性
迭代器是可迭代对象(或其原型链上的一个方法),可通过[Symbol.iterator]()来调用到它;该方法返回一个对象,返回对象的原型上有next()方法;通过next()方法来遍历最初的可迭代对象。
next的返回值是包含value和done属性的一个对象;value是迭代的值,done是迭代的状态
1 | let arr = ['a', 'b', 'c']; |
1.1 自定义迭代器
给对象添加自定义迭代器,使用for…of访问
1 | let name = 'zs'; |
2. Generator生成器
Generator生成器对象是由一个 generator function 返回的
这个函数的声明如下
1 | function* gen() { |
生成器对象和迭代器对象一样,有一个next方法,用于返回一个由yield表达式生成的值
1 | g.next(); // "Object { value: 1, done: false }" |
next( )方法还可以接受一个参数,它的参数会作为上一个yield的返回值
2.1 yield*
如果想在一个Generator函数里调用另一个Generator函数,需要用到yield*关键字
1 | function* gen2() { |
3. Set和WeakSet用法
Set 对象允许你存储任何类型的唯一值(除了不可迭代对象以外),无论是原始值或者是对象引用
Set对象是值的集合,你可以按照插入的顺序迭代它的元素。 Set中的元素只会出现一次,即 Set 中的元素是唯一的
3.1 set去重
1 | let arr1 = [1,2,2,4,6,4] |
3.2 size属性
1 | var mySet = new Set([1,2,3]); |
3.3 方法
- add方法
1 | // 用来向一个 `Set` 对象的末尾添加一个指定的值;可以链式调用; |
clear方法
用来清空一个Set对象中的所有元素;mySet.clear();delete方法
可以从一个Set对象中删除指定的元素;mySet.delete(value);has方法
返回一个布尔值来指示对应的值value是否存在Set对象中;mySet.has(value);entries、keys、values方法
entries:返回一个新的迭代器对象 ,这个对象的元素是类似 [value, value] 形式的数组由于set对象不像Map对象那样拥有 key,然而,为了与 Map 对象的 API 形式保持一致;所以set的key和value是相同的值
keys/values:返回一个新的迭代器对象,该对象包含
Set对象中的按插入顺序排列的所有元素的值1
2
3let mySet = new Set([1, 2, 3]);
mySet.add('abc')
console.log(mySet.entries());//SetIterator {1 => 1, 2 => 2, 3 => 3, "abc" => "abc"}
4. Map和WeakMap用法
Map 对象保存键值对,并且能够记住键的原始插入顺序。任何值(对象或者原始值) 都可以作为一个键或一个值。
4.1 size属性
1 | let map1 = new Map([['name', 'zs'],['age',19]]); |
4.2 方法
map1.get(key)返回键对应的值,如果不存在,则返回undefinedmap1.set(key, value)添加或更新一个指定键和值。返回该Map对象map1.delete(key)移除map对象中指定的元素;如果Map对象中存在该元素,则移除它并返回true;否则如果该元素不存在则返回falsemap1.clear()移除Map对象的所有键值对;返回undifinedmap1.has(key)表示Map实例是否包含键对应的值,返回一个布尔值entries、keys、values方法
entries:返回一个新的包含[key, value]对的Iterator对象,返回的迭代器的迭代顺序与Map对象的插入顺序相同keys:返回一个新的
Iterator对象。它包含按照顺序插入Map对象中每个元素的key值values:返回一个新的Iterator对象。它包含按顺序插入Map对象中每个元素的value值
1
2
3
4
5
6
7
8
9
10
11
12let map2 = new Map();
map1.set('0', 'foo');
map1.set(1, 'bar');
let iterator1 = map1.entries();
let iterator2 = map1.keys();
let iterator3 = map1.values();
console.log(iterator1.next().value);// ["0", "foo"]
console.log(iterator1.next().value);// [1, "bar"]
console.log(iterator2.next().value);// "0"
console.log(iterator2.next().value);// 1
console.log(iterator3.next().value);// "foo"
console.log(iterator3.next().value);// "bar"map可以使用forEach遍历

