//对象上默认没有部署iterator接口
let obj1 = {}
//如何将Iterator接口部署到目标对象上
//Symbol.iterator =>指向对象的默认遍历器方法
let obj2 = {
data: ["hello", "world"],
[Symbol.iterator]: function () {
let self = this
let index = 0
return {
next: function () {
if (index < self.data.length) {
return { value: self.data[index++], done: false }
} else {
return { value: undefined, done: true }
}
}
}
}
}
for (let v of obj2) {
console.log(v)
}
//原生就具备Itertor接口的数据结构
//Array、Map、Set、String、函数中arguments
//当数据结构中已部署上Itertor接口,我们就可以使用For...of来进行遍历
let arr = ["a", "b", "c"]
let iterator = arr[Symbol.iterator]()
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
console.log(iterator.next())
for (let v of arr) {
console.log("array", v)
}
let set = new Set(["java", "javascript", "html5"])
for (let v of set) {
console.log("set", v)
}
let str = "hello es6"
for (let v of str) {
console.log("str", v)
}
//调用Iterator接口的其他场合
//解构赋值
let [first, ...rest] = set
console.log("first", first)
console.log("rest", rest)
//扩展运算符
console.log([...str])