上QQ阅读APP看书,第一时间看更新
6.8 迭代与扩展操作
ECMAScript 6新增的迭代器和扩展操作符对集合引用类型特别有用。这些新特性让集合类型之间相互操作、复制和修改变得异常方便。
注意 第7章会更详细地介绍迭代器和生成器。
如本章前面所示,有4种原生集合类型定义了默认迭代器:
❑ Array
❑ 所有定型数组
❑ Map
❑ Set
很简单,这意味着上述所有类型都支持顺序迭代,都可以传入for-of循环:
let iterableThings = [ Array.of(1, 2), typedArr = Int16Array.of(3, 4), new Map([[5, 6], [7, 8]]), new Set([9, 10]) ]; for (const iterableThing of iterableThings) { for (constxofiterableThing) { console.log(x); } } // 1 // 2 // 3 // 4 // [5, 6] // [7, 8] // 9 // 10
这也意味着所有这些类型都兼容扩展操作符。扩展操作符在对可迭代对象执行浅复制时特别有用,只需简单的语法就可以复制整个对象:
let arr1 = [1, 2, 3]; letarr2=[...arr1]; console.log(arr1); // [1, 2, 3] console.log(arr2); // [1, 2, 3] console.log(arr1 === arr2); // false
对于期待可迭代对象的构造函数,只要传入一个可迭代对象就可以实现复制:
let map1 = new Map([[1, 2], [3, 4]]); letmap2=newMap(map1); console.log(map1); // Map {1 => 2, 3 => 4} console.log(map2); // Map {1 => 2, 3 => 4}
当然,也可以构建数组的部分元素:
let arr1 = [1, 2, 3];
let arr2 = [0, ...arr1, 4, 5];
console.log(arr2); // [0, 1, 2, 3, 4, 5]
浅复制意味着只会复制对象引用:
let arr1 = [{}];
let arr2 = [...arr1];
arr1[0].foo = 'bar';
console.log(arr2[0]); // { foo: 'bar' }
上面的这些类型都支持多种构建方法,比如Array.of()和Array.from()静态方法。在与扩展操作符一起使用时,可以非常方便地实现互操作:
let arr1 = [1, 2, 3]; // 把数组复制到定型数组 let typedArr1 = Int16Array.of(...arr1); let typedArr2 = Int16Array.from(arr1); console.log(typedArr1); // Int16Array [1, 2, 3] console.log(typedArr2); // Int16Array [1, 2, 3] // 把数组复制到映射 let map = new Map(arr1.map((x) => [x, 'val' + x])); console.log(map); // Map {1 => 'val 1', 2 => 'val 2', 3 => 'val 3'} // 把数组复制到集合 let set = new Set(typedArr2); console.log(set); // Set {1, 2, 3} // 把集合复制回数组 let arr2 = [...set]; console.log(arr2); // [1, 2, 3]