1、ES6迭代器描述
- 迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为Symbol.iterator 的方法来实现。
- 迭代器是用于遍历数据结构元素的指针(如数据库中的游标)
以下是可迭代的值:
- Array
- String
- Map
- Set
- Dom元素(正在进行中)
// 数组for (let item of ["zero", "one", "two"]) {console.log(item);}// zero// one// two// 字符串for (const c of 'z\uD83D\uDC0A') {console.log(c);}// z// \uD83D\uDC0A//mapconst map = new Map();map.set(0, "zero");map.set(1, "one");for (let item of map) {console.log(item);}// [0, "zero"]// [1, "one"]// setconst set = new Set();set.add("zero");set.add("one");for (let item of set) {console.log(item);}// zero// one// argumentsfunction args() {for (let item of arguments) {console.log(item);}}args("zero", "one");// zero// one
普通对象报错
// TypeError 普通对象报错for (let item of {}) {console.log(item);}
2、如何让对象使用迭代器功能(Symbol.iterator)
var obj = {a:1,b:2}Object.defineProperty(obj,"Symbol.iterator",{enumerable:false,writable:false,configurable:false,value:function(){var o = thisvar idx = 0var keys = Object.keys(obj)return {next:function(){return {value:o[keys[idx++]],done:(idx>keys.length)}}}}})var iterator = obj["Symbol.iterator"]()iterator.next()
